关于apollo:AREX-Agent-如何实现-Apollo-配置中心-Mock

背景对于 AREXAREX 是基于实在申请与数据的自动化回归测试平台,利用 Java Agent 和字节码加强技术,在生产环境中记录实在申请链路的入口和依赖的申请和响应数据,而后在测试环境中进行模仿申请回放,并逐个验证整个调用链路的逻辑正确性。AREX Agent 当初曾经反对了大部分开源组件的 Mock,本文将介绍 Agent 如何实现 Apollo 配置核心的 Mock。 对于 ApolloApollo(阿波罗)是一款牢靠的分布式配置管理核心,诞生于携程框架研发部,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端。 以下是官网对 Apollo 根底模型的形容: 用户在配置核心对配置进行批改并公布;配置核心告诉 Apollo 客户端有配置更新;Apollo 客户端从配置核心拉取最新的配置、更新本地配置并告诉到利用。实现原理下图简要形容了 Apollo 客户端的实现原理: 客户端和服务端放弃了一个长连贯,从而能第一工夫取得配置更新的推送。(通过 Http Long Polling 实现)客户端还会定时从 Apollo 配置核心服务端拉取利用的最新配置。客户端从 Apollo 配置核心服务端获取到利用的最新配置后,会保留在内存中 图片起源:https://www.apolloconfig.com/#/zh/design/apollo-design开发过程从上图可知 AREX 只须要反对 Apollo 客户端的录制和回放,即 Java 利用我的项目外部援用 apollo-client 的组件: <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>{apollo-client.version}</version></dependency>通常,我的项目中应用 Apollo 的形式次要有以下三种: Spring Autowired 注解 configBean (外部还是应用 EnableApolloConfig 注解)基于 Apollo 自带的注解 ApolloConfig,如代码中的 config 对象API 形式,如代码中的 config1 对象:<!----> @AutowiredConfigBean configBean; // 第一种形式,外部基于 EnableApolloConfig 注解 @ApolloConfig("TEST1.lucas")private Config config; // 第二种形式private Config config1; // 第三种形式,在代码中调用 getAppConfig 实例化public void test() { config1 = ConfigService.getAppConfig(); System.out.println("timeout="+config.getProperty("timeout", "0")); System.out.println("switch="+config.getBooleanProperty("switch", false)); System.out.println("json="+config.getProperty("json", "")); System.out.println("white.list="+config1.getProperty("flight.change.white.list", "")); System.out.println("configBean="+configBean); // 监听 Apollo 配置变更 ConfigChangeListener changeListener = changeEvent -> { System.out.println("Changes for namespace:" + changeEvent.getNamespace()); }; config.addChangeListener(changeListener);}@Component@Configuration@EnableApolloConfig("TEST1.sofia")public class ConfigBean { @Value("${age:0}") int age; @Value("${name:}") String name; @ApolloJsonValue("${resume:[]}") private List<JsonBean> jsonBean;}如果 AREX 须要实现 Apollo 的录制和回放就要兼容这3种应用形式,通过查看 Apollo 源码发现前两种基于注解 EnableApolloConfig,ApolloConfig 和最初一种调用 API 的形式底层都是通过 ConfigService.getAppConfig() 创立的实例,也就是说底层 API 是共用的,这样咱们就能够润饰这些 Apollo 底层的办法插入 AREX 的字节码,达到录制和回放的目标。 ...

September 20, 2023 · 2 min · jiezi

关于apollo:聊聊如何利用apollo与druid整合实现数据源动态热切

前言本文的素材起源与某次和敌人技术交换,过后敌人就跟我吐槽说apollo不如nacos好用,而且他们还因为apollo产生过一次线上事变。 故事的背景大略是如下 前阵子敌人部门的数据库产生宕机,导致业务无奈失常操作,过后敌人他们数据库信息是配置在apollo上,敌人的想法是当数据库宕机时,能够通过切换配置在apollo上的数据库信息,实现数据源热变更。但当他们数据库产生宕机时,敌人按他的想法操作,发现事件并不像他设想的那样,他们更换数据源后,发现业务服务连贯依然是旧的数据库服务,前面没方法他们只能分割dba解决。 后边我听了敌人的形容后,我就问他说,你们过后数据库热切是怎么做的,他的答复是:很简略啊,就把数据源信息配置在apollo上,如果要变更数据源,就间接在apollo的portal上变更一下啊。听了敌人话,我就问而后呢?敌人的答复是:什么而后?就没而后了啊。 通过那次交换,就有了明天的文章,明天咱们就来聊聊apollo与druid整合实现数据源动静热切 实现外围思路apollo的配置变更动静监听 + spring AbstractRoutingDataSource预留办法determineCurrentLookupKey来做数据源切换 在介绍实现外围逻辑之前,咱们来聊一下配置核心 何为配置核心?配置核心是一种对立治理各种利用配置的根底服务组件。他的外围是对配置的对立治理。他治理的领域是配置,至于对配置有依赖的对象,比方数据源,他是不归配置核心来治理。为什么我会独自提这个?是因为敌人仿佛陷入了一个误区,认为在apollo上变更了配置,这个配置依赖的数据源也会一起跟着变更 外围代码1、创立动静数据源,代理原来的datasourcepublic class DynamicDataSource extends AbstractRoutingDataSource { public static final String DATASOURCE_KEY = "db"; @Override protected Object determineCurrentLookupKey() { return DATASOURCE_KEY; } public DataSource getOriginalDetermineTargetDataSource(){ return this.determineTargetDataSource(); }}@Configuration@EnableConfigurationProperties(BackupDataSourceProperties.class)@ComponentScan(basePackages = "com.github.lybgeek.ds.switchover")public class DynamicDataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean @Primary @ConditionalOnClass(DruidDataSource.class) public AbstractDataSourceManger abstractDataSourceManger(DataSourceProperties dataSourceProperties, BackupDataSourceProperties backupDataSourceProperties){ return new DruidDataSourceManger(backupDataSourceProperties,dataSourceProperties); } @Bean("dataSource") @Primary @ConditionalOnBean(AbstractDataSourceManger.class) public DynamicDataSource dynamicDataSource(AbstractDataSourceManger abstractDataSourceManger) { DynamicDataSource source = new DynamicDataSource(); DataSource dataSource = abstractDataSourceManger.createDataSource(false); source.setTargetDataSources(Collections.singletonMap(DATASOURCE_KEY, dataSource)); return source; }}这边有个须要留神的点就是DynamicDataSource的bean名称肯定是须要为dataSource,目标是为了让spring默认的datasource取到的bean是DynamicDataSource ...

January 31, 2023 · 2 min · jiezi

关于apollo:apollo一什么是apollo

(一)什么是apollo前言携程开源的apollo配置管理核心,反对不同环境、不同集群的配置管理,配置的同步简直是实时的,且具备欠缺的权限治理、混滚和灰度治理等机制,适宜作为微服务环境下的配置管理。 apollo作为java生态内的品质不错的组件,对spring框架反对良好,在业内很多公司都将其利用到本人的架构设计内,因而学习它的实现形式,对咱们深刻了解什么是配置核心、转化利用业务开发是有帮忙的。 浏览apollo源码,我想搞清楚以下几个问题: apollo如何治理不同环境的配置?apollo如何做到配置实时更新的?apollo怎么实现灰度机制?apollo如何做到高可用,CAP模型是怎么的?什么是配置代码运行的输出参数,有代码运行环境的辨别,且可能会产生变动,须要从代码内独立进去。 为何须要配置管理核心?后面对于程序的了解 参考资料apollo官网文档:https://www.apolloconfig.com/...

November 19, 2022 · 1 min · jiezi

关于apollo:SpringBoot-使用-Apollo

筹备工作JavaJava 版本要求 1.8+,可通过如下命令查看: java -version样例输入: java version "1.8.0_102"Java(TM) SE Runtime Environment (build 1.8.0_102-b14)Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)MySQLMySQL 版本要求 5.6.5+,MySQL 原生客户端连贯数据库后可通过如下命令查看: select version();样例输入: +------------+| version() |+------------+| 5.7.39-log |+------------+下载 Quick Start 安装包Github 下载地址 https://github.com/apolloconf...百度网盘下载地址 https://pan.baidu.com/s/1Ieel... 提取码:9wwe 装置步骤创立数据库在 MySQL 中创立 ApolloPortalDB 和 ApolloConfigDB 两个数据库: drop database if exists `ApolloPortalDB`;create database `ApolloPortalDB` default character set utf8 collate utf8_general_ci;drop database if exists `ApolloConfigDB`;create database `ApolloConfigDB` default character set utf8 collate utf8_general_ci;导入数据MySQL 原生客户端连贯数据库后向两个数据库中导入数据: ...

August 1, 2022 · 2 min · jiezi

关于apollo:docker安装多环境Apollo

Apollo介绍Apollo(阿波罗)是携程框架部门研发的分布式配置核心,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端,并且具备标准的权限、流程治理等个性,实用于微服务配置管理场景。 应用docker装置Apollo因为工作须要,须要应用Apollo作为零碎的配置核心。装置Apollo有很多种形式,能够循序渐进的依据官网文档一步步的装置。然而大多数的程序员对Apollo是不太熟悉的,所以docker就是一种比较简单的装置形式。如果对docker不理解能够先适当的相熟一下docker。本文以Ubuntu零碎为例,装置一个领有两个环境(DEV,PRO)的Apollo配置零碎。心愿对大家有所帮忙。 环境筹备前置装置既然是用docker装置Apollo,那必定须要先装置docker环境。以Ubuntu零碎为例,咱们能够利用Apt命令来装置docker环境。sudo apt install docker 显示装置胜利之后能够应用docker命令来测试一下是否装置胜利。 前置环境筹备Mysql,Apollo的数据是存储在Mysql中的,所以咱们须要一个MySql环境,能够应用docker装置,也能够应用曾经存在的MySql实例。在此就不过多形容做MySql装置的过程了。 创立数据库https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sqlhttps://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql 留神:apolloportaldb.sql为portal数据库脚本,apolloconfigdb.sql为环境配置数据库脚本。 portal数据库只须要一个,然而如果须要装置多环境的Apollo的话,须要筹备多个config数据库。能够在apolloconfigdb.sql中稍作批改。 DEV环境数据库名:ApolloConfigDBDevPRO环境数据库名:ApolloConfigDBPro批改数据库表在创立为三个数据库之后,咱们须要改变一下数据库中的两个表。 ApolloPortalDB中的ServerConfig表中,有一行apollo.portal.envs。默认是dev,咱们须要把他改成两个环境并且用逗号隔开:dev,pro。ApolloPortalDB中的ServerConfig表中,有一行apollo.portal.meta.servers。默认为空,咱们须要把他改成{http://{IP}:8080}。留神这边的IP能够是外网地址。ApolloConfigDBDev数据库中的的ServerConfig表,中有一行为eureka.service.url,把他的value字段改成http://{IP}:8080/eureka/。因为DEV环境默认的端口号为8080。ApolloConfigDBPro数据库中的的ServerConfig表,中有一行为eureka.service.url,把他的value字段改成http://{IP}:8083/eureka/。因为DEV环境默认的端口号为8083。 这边提一下,各个环境的默认端口号开启dev环境, 默认端口: config 8080, admin 8090开启fat环境, 默认端口: config 8081, admin 8091开启fat环境, 默认端口: config 8081, admin 8091开启uat环境, 默认端口: config 8082, admin 8092开启pro环境, 默认端口: config 8083, admin 8093自此咱们的筹备工作都曾经做好了,上面开始正式的进入装置步骤。 docker装置Apollodocker pull idoop/docker-apollodocker run --net="host" --name apollo -d \ -e PORTAL_DB='jdbc:mysql://{MySqlIP}:{MySqlPort}/ApolloPortalDB?characterEncoding=utf8' \ -e PORTAL_DB_USER='root' \ -e PORTAL_DB_PWD=‘pwd‘ \ -e DEV_DB='jdbc:mysql://{MySqlIP}:{MySqlPort}/ApolloConfigDBDev?characterEncoding=utf8' \ -e DEV_DB_USER='root' \ -e DEV_DB_PWD='pwd' \ -e PRO_DB='jdbc:mysql://{MySqlIP}:{MySqlPort}/ApolloConfigDBPro?characterEncoding=utf8' \ -e PRO_DB_USER='root' \ -e PRO_DB_PWD='pwd' \ idoop/docker-apollo:latest 首先第一步是下载apollo的镜像,第二步就是正式启动咱们的Apollo命令。 ...

July 13, 2022 · 1 min · jiezi

关于apollo:硬核AI技术叠加无限创意百度文心大模型产业落地加速

随着数据的井喷、算法的提高和算力的冲破,成果好、泛化能力强、通用性强的预训练大模型(以下简称“大模型”)已成为人工智能倒退的新方向。4月16日,2021百度认知 AI 创意赛“AI 创意派”决赛正式举办,这是业内首次将先进的 AI 大模型能力凋谢给公众应用,实现了大模型在激发创意、落地利用上的冲破。文心大模型首场技术开放日也同期举办,文心大模型背地的“技术天团”首次集中亮相,解读大模型有限创意背地的硬核 AI 技术。 大模型助力创意利用,为创意插上腾飞羽翼 元宇宙虚构人生、AI 版“反诈 App”、续写一本小说、神奇动物都有啥……这些趣味 DEMO 和落地计划,均是由 AI 创意派参赛选手基于百度飞桨文心大模型开发发明的。据统计,本次 AI 创意赛共吸引全国各地近2000名不同年龄、不同技术根底的选手参加其中,收集超过300份创意计划,作品笼罩教育、医疗、金融、娱乐、科技、心理健康等多个畛域。最终,开发创意组9组选手怀才不遇闯入决赛,最终“说文”、“图言”、“AI 起论文题目”等我的项目摘得大奖。 百度团体副总裁吴甜在较量现场示意,“创意在民间。人工智能和大模型要面向公众凋谢,只有门槛低到了所有人都可不便地用起来,能力真正大规模暴发出各种创意。这是文心大模型的致力方向。文心源于产业实际,也将在产业中宽泛落地。本次创意赛中,选手展示了基于文心大模型的丰盛创意,让咱们看到了大模型广泛应用的前景。” 本次创意赛邀请了中国科学技术协会专家库科普实体资源开发类专家白藕,天津大学北洋讲席传授、智能与计算学部副主任兼人工智能学院院长胡清华,哈尔滨工业大学计算机科学与技术学院人工智能业余负责人张宇,北方科技大学迷信与人类想象力钻研核心主任吴岩,线性资本董事总经理黄松延,百度技术委员会主席吴华,百度飞桨总架构师于佃海,百度高校合作部总监李轩涯等来自产业、学术以及投资方等各界嘉宾作为评委专家,对参赛我的项目做出了精彩的点评。多位评委专家示意,大模型是目前 AI 行业倒退的新趋势。通过本次创意赛,开掘了多支具备开发和创意双重实力的参赛队伍,丰盛了大模型落地的设想空间。 取得本次 AI 创意赛冠军“顶尖派”的参赛我的项目“说文”的代表卓君示意,百度飞桨凋谢了 ERNIE 3.0 常识加强大模型能力,不仅让咱们领会到了大模型的真正实力,也让每一位对 AI 感兴趣的人都能够充分发挥创造力,去实现对于文字、语言的创意想法。 自2019年,百度便深耕大模型研发并胜利打造文心大模型家族。目前,文心大模型已成为产业级常识加强大模型,蕴含 NLP(自然语言了解)大模型、CV(计算机视觉)大模型、跨模态大模型,既有根底通用的大模型,也蕴含面向重点畛域、重点工作的大模型,以及丰盛的工具与平台。 与行业其余大模型相比,文心大模型具备“常识加强”的外围特色。文心大模型基于大规模常识和海量无构造数据的交融深度学习,一直排汇文本数据中词汇、构造、语义等方面的常识,使得文心大模型的理解能力和生成能力一直进化晋升,并面向不同人群提供丰盛的工具组件及平台,助力各行各业的创意利用。 以此次创意赛所应用的 ERNIE 3.0 为例,作为 NLP 大模型中的一员,不仅领有很强的语言理解能力,还可能实现视频、歌词、艺术画等创意作品的主动生成,用 AI 为创意插上腾飞羽翼。尤其是在 AIGC(AI generated content,人工智能发明内容)畛域,借助大模型的跨模态综合技术能力,能够激发创意,晋升内容多样性,升高制作老本,实现大规模利用。如在本次AI创意赛中,就涌现了像传记生成、高考意愿举荐、心理树洞等诸多创意利用。 吴甜还演示了近期在海内引发关注的“虎年春早晨的中国文化”视频,该视频由百度研究院的智能视频合成平台 VidPress 主动生成,背地就应用了文心大模型的文本摘要、语义剖析和跨模态了解等多项技术,关上了 AIGC 智能创作设想空间。 在现场的大模型互动区,观众也能够亲自体验到大模型在歌词生成、画作生成和对话机器人等利用,同时文创集市上也展示了基于大模型能力生成的T恤、马克杯、帆布袋、画册、明信片等创意周边,切身感受大模型在创意畛域的落地利用。 深耕产业级大模型,文心大模型实现技术、落地双当先 作为国内最早开始进行大模型研发的科技企业之一,百度在2019年3月率先公布中国首个正式凋谢的预训练模型 ERNIE1.0,并继续投入于大模型的研发降级。2021年12月,ERNIE 3.0 降级为寰球首个常识加强千亿大模型,成为目前为止寰球最大的中文单体模型,在60多项权威的自然语言了解和生成工作上获得了世界领先成果。 目前,文心系列模型中已有多个大模型达到世界领先水平。例如,百度打造了寰球首个百亿参数中英文对话大模型 PLATO-XL,首个聚焦中英文场景大规模 OCR 结构化预训练模型 VIMER - StrucTexT,寰球最大规模中文跨模态生成模型 ERNIE-ViLG 等。 超大规模模型的训练和推理,给深度学习框架带来很大考验。在文心大模型的背地,我国首个自主研发、功能丰富、开源凋谢的产业级深度学习平台飞桨提供了无力撑持。飞桨研制了端到端自适应分布式训练框架,实现多硬件反对,并行效率高达90%,无效反对文心大模型高效、稳固训练。基于飞桨与百舸集群,文心大模型在算法、框架、算力层面实现齐全自主技术创新,为中国产业智能化转型打造 AI 大底座。 ...

April 19, 2022 · 1 min · jiezi

关于apollo:百度Apollo系统学习01-安装Apollo

Apollo学习001: 装置Apollo本文旨在具体记录 Apollo在个人电脑的 Ubuntu 18.04 零碎中的残缺装置及运行过程。 硬件要求百度Apollo零碎失常须要装置在工业计算机IPC中,在个人电脑上也能够装置。因为网上没有查到具体的硬件要求,这里PO出集体笔记本电脑配置作为参考:电脑型号:神州战神z7m,CPU i7, 16G内存,GPU: GTX965m。实测能够跑通。(PS:Unbutu零碎须要空间大一些,实测200个G的空间装完并且将Apollo齐全编译后仅剩50G) Apollo装置过程装置Nvidia显卡驱动。 sudo apt-get updatesudo apt-add-repository multiversesudo apt-get updatesudo apt-get install nvidia-driver-455装置结束采纳nvidia-smi 命令查看显卡: Wed Aug 25 21:55:21 2021 +-----------------------------------------------------------------------------+| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 ||-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. || | | MIG M. ||===============================+======================+======================|| 0 GeForce GTX 965M Off | 00000000:01:00.0 Off | N/A || N/A 61C P0 N/A / N/A | 438MiB / 2002MiB | 25% Default || | | N/A |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+| Processes: || GPU GI CI PID Type Process name GPU Memory || ID ID Usage ||=============================================================================|| 0 N/A N/A 1515 G /usr/lib/xorg/Xorg 216MiB || 0 N/A N/A 1771 G /usr/bin/gnome-shell 26MiB || 0 N/A N/A 3659 G ...AAAAAAAAA= --shared-files 16MiB || 0 N/A N/A 4582 G ...AAAAAAAAA= --shared-files 133MiB || 0 N/A N/A 7588 G ...AAAAAAAAA= --shared-files 7MiB || 0 N/A N/A 10792 G ...AAAAAAAAA= --shared-files 27MiB |+-----------------------------------------------------------------------------+装置docker ...

February 22, 2022 · 2 min · jiezi

关于apollo:百度Apollo参编首批汽车信息安全国家标准跻身车联网信息安全第一梯队

2021年10月11日,国家市场监督管理总局(国家标准化治理委员会)批准公布了602项国家标准,其中包含汽车信息安全畛域首批4项国家标准:GB/T 40855-2021《电动汽车近程服务与管理系统信息安全技术要求及试验办法》、GB/T 40856-2021《车载信息交互零碎信息安全技术要求及试验办法》、GB/T 40857-2021《汽车网关信息安全技术要求及试验办法》,和GB/T 40861-2021《汽车信息安全通用技术要求》,4项规范笼罩了网联车辆从整车到重要域控制器的平安防护措施,为今后我国车联网的平安倒退打下了坚实基础,为我国汽车产品的信息安全提供了无力保障。 作为我国最早一批布局智能网联汽车行业信息安全的企业,百度Apollo此次便以参编单位的身份深度参加了GB/T 40856-2021《车载信息交互零碎信息安全技术要求及试验办法》的起草工作,依靠本身在车机产品安全方面的多年积攒助力规范制订行文。据悉,该办法将于2022年5月1日正式施行,然而早在往年3月至6月,也就是该规范的合乎性验证阶段,百度Apollo的车机产品便齐全满足了规范中各项条款的需要,成为业内最为先进和成熟的智能座舱平安防护计划之一。针对上述规范,百度Apollo信息安全专家也基于打造的汽车平安引擎,就车辆软硬件、通信协议与接口、操作系统、应用软件和数据等智能汽车信息安全内容做出了业余解读。从TARA剖析、平安开发、整车及要害ECU平安测试,到VSOC平安监测中心的建设,百度车联网紧跟国内外日益严苛的车辆信息安全准入要求,打造了一套“点线面体”多向发力的进攻体系,以此满足车企和Tier1的准入合规需要,保证车辆全生命周期的平安防护能力。 通过TARA剖析造成零碎性能点,构筑零部件级平安防线TARA剖析作为信息安全功能设计的前置条件,能够帮忙辨认车载智能终端的潜在威逼和安全漏洞,通过对威逼的危险量化评估与优先级排序,造成一份高层级的网络安全需要,即零碎性能点。若干零碎性能点集结之后,再依据纵深进攻造成零部件级的平安防线,以硬件安全、系统安全、数据安全、利用平安、通信安全的层层嵌套抵挡黑客攻击。 联合车内零部件平安利用协同联动,造成车端平安防护面80%的攻打会集中在20%的控制器上,即网关、T-BOX、车机和主动驾驶控制器。其中每个控制器承载着不同的属性及不同的交互对象,在进行整车设计时,4个控制器的平安性能协同联动起来,便可造成一个平安防护面。 “云端监控、车端响应”,平安防护与平安监测双线并行点线面串联之后,基于对破绽库、威逼情报库、汽车攻打常识图谱及攻击行为的剖析,百度又通过云端安全监控经营平台进行攻打收敛,集中监控平安危险,提出了全方位、立体化的动静防护平安评估计划,以人工智能技术的无力加持,定位安全隐患,量化平安状态。依靠VSOC平安监测平台,除了能够提供安全事件监测、破绽修复以及威逼情报预警,更可将车辆纵深进攻的平安机制在平台中进行展示,让整车企业把握本身平安现状,达成“现状可见、问题可察、危险可辨、将来可测”的最优解。 百度Apollo作为专一于汽车信息安全钻研畛域的业余团队,在产品合规性及理论部署能力方面均有突出劣势,往年除参加《整车信息安全技术与测试方法》、《车载信息交互零碎信息安全技术要求及试验办法》的起草外,百度Apollo后续还将参加《智能网联汽车 数据通用要求》的编写工作,积极响应国家号召,晋升我国汽车产品的信息安全防护技术水平,为解决我国车联网数据的监管问题贡献力量。点击进入取得更多技术信息~~

November 4, 2021 · 1 min · jiezi

关于apollo:解决apollo的configService服务启动异常

前言apollo是一个十分风行的开源的配置核心我的项目,这里就不多介绍了。接触过apollo和运行过apollo的人必定都遇到过启动configService时抛异样了,而且100%会抛一个异样。起因是,在apollo的架构中configService既作为config服务,同时也承载了metaService的性能,所以这个模块,既作为eureka的服务端也是eureka的客户端,这就造成了利用启动时,eurekaServer未齐全启动,eurekaClient拉取注册表信息时就抛异样了。不过这个拉取动作是在独立的线程中运行的,独立于启动利用的主线程,所以异样并不影响利用的启动,这个问题也就始终从开源到留到了当初。目前,这个问题已被博主解决,正在合并pr中。 本文pr地址:https://github.com/ctripcorp/... 触发起因剖析首先看下异样的信息,异样的信息比拟多,如下: 2020-12-23 09:55:19.882 ERROR 7022 --- [ main] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution errorcom.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused) at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123) at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) at com.sun.jersey.api.client.Client.handle(Client.java:652) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:509) at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.getApplicationsInternal(AbstractJerseyEurekaHttpClient.java:194) at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.getApplications(AbstractJerseyEurekaHttpClient.java:165) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient.execute(MetricsCollectingEurekaHttpClient.java:73) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.executeOnNewServer(RedirectingEurekaHttpClient.java:118) at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:79) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:414) at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:269) at org.springframework.cloud.netflix.eureka.CloudEurekaClient.<init>(CloudEurekaClient.java:63) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.eurekaClient(EurekaClientAutoConfiguration.java:290) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9.CGLIB$eurekaClient$2(<generated>) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9$$FastClassBySpringCGLIB$$328872d8.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:365) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9.eurekaClient(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:353) at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:390) at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:184) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:193) at com.sun.proxy.$Proxy145.getApplications(Unknown Source) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration.peerAwareInstanceRegistry(EurekaServerAutoConfiguration.java:164) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b.CGLIB$peerAwareInstanceRegistry$5(<generated>) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b$$FastClassBySpringCGLIB$$458f0ac6.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:365) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b.peerAwareInstanceRegistry(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:474) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:583) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1277) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1265) at com.ctrip.framework.apollo.configservice.ConfigServiceApplication.main(ConfigServiceApplication.java:33)Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) at java.net.Socket.connect(Socket.java:606) at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:134) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:173) ... 107 common frames omitted2020-12-23 09:55:19.883 WARN 7022 --- [ main] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with message: java.net.ConnectException: Connection refused (Connection refused)2020-12-23 09:55:19.883 ERROR 7022 --- [ main] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APOLLO-CONFIGSERVICE/172.26.203.178:apollo-configservice:8080 - was unable to refresh its cache! status = Cannot execute request on any known servercom.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:414) at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:269) at org.springframework.cloud.netflix.eureka.CloudEurekaClient.<init>(CloudEurekaClient.java:63) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.eurekaClient(EurekaClientAutoConfiguration.java:290) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9.CGLIB$eurekaClient$2(<generated>) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9$$FastClassBySpringCGLIB$$328872d8.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:365) at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$5cf7ced9.eurekaClient(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:353) at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:390) at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:184) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:350) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:193) at com.sun.proxy.$Proxy145.getApplications(Unknown Source) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration.peerAwareInstanceRegistry(EurekaServerAutoConfiguration.java:164) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b.CGLIB$peerAwareInstanceRegistry$5(<generated>) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b$$FastClassBySpringCGLIB$$458f0ac6.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:365) at org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration$$EnhancerBySpringCGLIB$$ef07d99b.peerAwareInstanceRegistry(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:582) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:474) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1247) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1096) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:535) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:583) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1277) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1265) at com.ctrip.framework.apollo.configservice.ConfigServiceApplication.main(ConfigServiceApplication.java:33)最终咱们就定位到这一行,定位问题的过程是一个非常复杂的事件。所以这里间接写明,并不是一开始我就晓得关键点在这里,这个须要平时多积攒知识面,能力疾速定位关键点 ...

December 23, 2020 · 4 min · jiezi

关于apollo:集成apollo动态日志消灭logbackspringxml

前言动静调整线上日志级别是一个十分常见的场景,借助apollo这种配置核心组件非常容易实现。作为apollo的官网技术支持,博主常常在技术群看到有使用者询问apollo是否能够托管logback的配置文件,毕竟有了配置核心后,毁灭所有的本地配置全副交给apollo治理是咱们的最终目标。可是,apollo不具备间接托管logback-spring.xml配置文件能力,然而,咱们能够基于spring和logback的装载机制,齐全取缔logback-spring.xml配置,以apollo中的配置驱动。而且,革新后,大大提高了日志零碎的灵活性和可扩展性。 apollo动静日志何为apollo动静日志?间接这样说可能会有歧义,认为是apollo里的日志,其实不然。举个简略的例子,比方,咱们我的项目很多中央应用了log.debug()打印日志,为了不便通过日志信息排查问题,然而个别状况下,生产环境的日志级别会配置成info。只有遇到须要排查线上问题的时候才会长期关上debug级别日志。这个时候只能需改配置文件,将日志级别调整成debug,而后从新打包部署验证。不仅流程繁琐耗时,还会毁坏过后的"案发现场的环境",导致判断不精确。如果利用具备了apollo动静日志这种能力,就只需在apollo批改下配置而后提交,就能够热更新日志级别,马上打印debug级别日志。这就是所谓的apollo动静日志。实现这个成果,须要具备两个能力,别离由spring和apollo提供 spring日志零碎热更新日志级别spring利用中,spring适配了支流的日志框架,如logback、log4j2等,在这些日志框架之上,又形象了本人的日志零碎服务,这里咱们用到了spring的LoggingSystem,用它来热更新日志级别,这个类在日志零碎初始化时就增加到了spring的容器中,所以只有在spring的上下文治理范畴内,就能够间接注入,以下为次要应用到的api形容: /** * 设置给定日志记录器的日志级别. * @param loggerName 要设置的日志记录器的名称({@code null}可用于根日志记录器)。 * @param level 日志级别 */ public void setLogLevel(String loggerName, LogLevel level) { throw new UnsupportedOperationException("Unable to set log level"); }apollo日志配置变更动静下发apollo作为分布式配置核心,配置集中管理和配置热更新是其最外围的性能,此外,apollo还提供了配置变更下发监听的性能。基于这个配置监听的设计,实现动静日志就变得非常简单了。而且不仅能够实现日志动静热更,基于这个思路,连接池、数据源等都能够轻松实现。apollo实现监听配置变更有多种形式,能够通过Config实例手动增加,如: @ApolloConfig public Config config; public void addConfigChangeListener(){ config.addChangeListener(changeEvent->{ System.out.println("config change keys" + changeEvent.changedKeys()); }); }也能够通过注解间接驱动 @ApolloConfigChangeListener public void addConfigChangeListener(ConfigChangeEvent changeEvent){ System.out.println("config change keys" + changeEvent.changedKeys()); }实现日志调整热更新有了上述能力,在联合spring反对的日志加载配置形式,如: logging.level.org.springframework.web=debuglogging.level.org.hibernate=error能够实现如下代码实现性能,遇到须要调整日志级别时,批改apollo里的配置,即可实时失效 @Configurationpublic class LogbackConfiguration { private static final Logger logger = LoggerFactory.getLogger(LoggerConfiguration.class); private static final String LOGGER_TAG = "logging.level."; private final LoggingSystem loggingSystem; public LogbackConfiguration(LoggingSystem loggingSystem) { this.loggingSystem = loggingSystem; } @ApolloConfigChangeListener private void onChange(ConfigChangeEvent changeEvent) { for (String key : changeEvent.changedKeys()) { if (this.containsIgnoreCase(key, LOGGER_TAG)) { String strLevel = changeEvent.getChange(key).getNewValue(); LogLevel level = LogLevel.valueOf(strLevel.toUpperCase()); loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level); logger.info("logging changed: {},oldValue:{},newValue:{}", key, changeEvent.getChange(key).getOldValue(), strLevel); } } } private boolean containsIgnoreCase(String str, String searchStr) { if (str == null || searchStr == null) { return false; } int len = searchStr.length(); int max = str.length() - len; for (int i = 0; i <= max; i++) { if (str.regionMatches(true, i, searchStr, 0, len)) { return true; } } return false; }}毁灭logback-spring.xml配置在"毁灭"logback-xml配置之前,先看下这个配置文件有哪些配置信息,起到了哪些作用,上面贴出一个典型的配置文件内容: ...

November 20, 2020 · 2 min · jiezi

关于apollo:apollo在项目的使用

Apollo(阿波罗)是携程框架部门研发的分布式配置核心,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端,并且具备标准的权限、流程治理等个性,实用于微服务配置管理场景。 性能: 对立治理不同环境、不同集群的配置,以命名空间namespace为最小粒度进行配置,一个服务引入了这个命名空间,即应用了该命名空间的配置。配置批改实时失效版本公布治理灰度公布权限治理、公布审核、操作审计客户端配置信息监控应用: 服务端的配置: 新建appId,appId能够了解为是一套利用。在appId新建namespace增加配置内容。Namespace能够了解为是配置的汇合,原先一个yml文件寄存配置,当初能够通过某个环境 ,某个appId下的namespace引入。客户端的应用: 引入maven包并在启动类退出@EnableApollo即可,通过meta.server,appId和namespace找到所需的配置。能够了解为在apollo的配置就在配置文件里。通过@Value,@ConfigurationProperties引入的变量不受影响,对代码的入侵比拟小。监听配置的变动,不同的namespace在我的项目的应用: 把配置信息放入apollo。间接的做法是每个服务应用一个namespace,然而通过梳理发现,有些配置是多个服务独特应用的。服务的配置进行分类: 通用:Log,eureka,feign调用相干的某些服务专用:database(openapi monitor) redis(card openapi double) kafka activemq ElasticSearch各自的服务领有独自的namespace通过分类后,如果要批改数据库地址,redis地址,或者新增一个中间件的地址,只用新增namespace,在配置文件引入/批改该namespace即可。如果想更改某个服务的配置,在相应的namespace下批改,并重启docker服务。能够看到公布历史,有哪些实例在应用。我的项目是用docker部署的,原先一部分配置在服务里,一部分配置在docker-compose里,革新后尽可能所有的配置都放在apollo里,apollo的配置放在docker-compose.yml里,docker-compose.yml能够引入公共的配置文件env_file,真正的apollo配置寄存文件,包含apollo.meta,app.id,apollo.cacheDir,不必再通过profile.active辨别。一些无奈通过apollo配置的放在服务的配置或docker的配置中。实践上能当在服务的配置文件里的都能放在apollo里。每个服务只需一个配置文件,甚至不必配置文件。为了本地开发的不便,在本地搁置了sit环境的配置。通过apollo.meta辨别不同的环境,apollo.meta变量通过docker-compose文件的公共配置env_file引入 须要留神的: 配置的备份假如两个人对同一个服务进行开发,须要批改配置Application里的配置会实时失效,自定义的namespace不会。开关,限流额度,门路对于日志级别,database等须要更新bean的,须要写代码 https://github.com/ctripcorp/apollo-use-casesNamespace的类型: 公有:namespace从属于appId,只有配置了该appId才可拜访私有:只有连上了apollo就能应用,属于所有利用,全局惟一关联:属性是公有的,能够了解为在继承私有属性的根底上,可对私有属性进行批改其余的性能: 密钥治理,爱护配置不被其余利用获取权限调配:以namespace为粒度调配批改,公布,查看的权限增加集群配置笼罩,后面的会笼罩前面的,尽可能不要笼罩,保障配置的唯一性架构:从逻辑上来说比拟清晰,将配置的编辑/公布与客户端获取配置离开,用两个服务实现Portal通过调用admin service接口批改配置Client通过config service接口获取配置为了保障高可用,增加了一层eureka,client和portal通过eureka调用接口服务。为了使不同语言的client可通过http接口即可获取admin service和config service的信息,eureka上搭建Meta service,用来封装服务发现的细节,不必关怀背地的注册核心和服务发现组件(用于不同语言的服务注册到eureka上)。 残缺架构如下:次要模块: Config Service:配置的读取、推送等,服务对象是Apollo客户端Admin Service:配置的批改、公布等,服务对象是Apollo Portal(治理界面)Config Service和Admin Service都是多实例、无状态部署,所以须要将本人注册到Eureka中并放弃心跳Meta Server:在Eureka之上搭建,用于封装Eureka的服务发现接口: Client通过域名拜访Meta Server获取Config Service服务列表(IP+Port),而后间接通过IP+Port拜访服务,同时在Client侧会做load balance、谬误重试Portal通过域名拜访Meta Server获取Admin Service服务列表(IP+Port),而后间接通过IP+Port拜访服务,同时在Portal侧会做load balance、谬误重试为了简化部署,实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM过程中服务端设计:Admin service公布了配置批改的事件,所有config service收到音讯并告诉客户端批改配置。有两个值得去摸索的点: Admin service公布事件的形式:能够用中间件redis,activemq实现。这里为了缩小内部组件的依赖,通过数据库实现。具体的做法是Admin公布一条配置后,这个配置必定属于某个namespace,在ReleaseMessage表插入一条记录AppId+Cluster+Namespace,config service有一个线程每秒扫描ReleaseMessage表,如果有新的音讯记录,就告诉客户端更新配置。所以配置如果有更新,个别一秒内就可告诉到客户端。 Config service告诉客户端的形式:客户端发动获取配置的申请,config service用defferResult将申请挂起,如果60秒内没有感兴趣的namespace配置发生变化,返回304,否则立刻返回变动后的配置。应用defferResult能够进步申请的并发量客户端设计: 客户端和服务端放弃了一个长连贯,从而能第一工夫取得配置更新的推送。(通过Http Long Polling实现)客户端还会定时从Apollo配置核心服务端拉取利用的最新配置。 这是一个fallback机制,为了避免推送机制生效导致配置不更新客户端定时拉取会上报本地版本,所以个别状况下,对于定时拉取的操作,服务端都会返回304 - Not Modified定时频率默认为每5分钟拉取一次,客户端也能够通过在运行时指定System Property: apollo.refreshInterval来笼罩,单位为分钟。客户端从Apollo配置核心服务端获取到利用的最新配置后,会保留在内存中客户端会把从服务端获取到的配置在本地文件系统缓存一份 在遇到服务不可用,或网络不通的时候,仍然能从本地复原配置应用程序能够从Apollo客户端获取最新的配置、订阅配置更新告诉测试环境下多环境部署SIT,QA,UAT,用一套画面治理不同的环境: 与spring的集成原理Spring的ApplicationContext会蕴含一个Environment,在服务启动的时候把参数注入即可。

November 2, 2020 · 1 min · jiezi

apollo使用

增加依赖jar客户端jar <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.5.0</version></dependency>开启配置核心类加注解 @EnableApolloConfig从配置核心读数据1.注入数据 在类外面,注入数据 @ApolloConfigConfig config;2.读配置数据 在办法里读数据 String merQrcodeNum = config.getProperty("merQrcodeNum", "5"); //1.从配置核心读数据 2.如果没有读到数据,就应用默认值5(即第二个参数)配置配置文件增加 ### apollo配置核心# 我的项目idapp.id=xxx-manager-service //在配置核心管理系统增加利用和利用id# 注册核心ip/portapollo.meta=${filter.apollo.meta} //参考https://github.com/ctripcorp/...

July 15, 2020 · 1 min · jiezi