一、简介Apollo(阿波罗)是携程框架部开发的分布式配置中心。它可以集中管理不同环境和不同集群的配置。推送到应用端,具有标准化权限和流程治理的特点,适用于微服务配置管理场景。服务器基于SpringBoot和SpringCloud开发,打包后直接运行,无需额外安装Tomcat等应用容器。Java客户端不依赖任何框架,可以运行在所有的Java运行环境中,对Spring/SpringBoot环境也有很好的支持。.Net客户端不依赖于任何框架,可以运行在所有.Net运行环境中。官方GitHub:https://github.com/ctripcorp/apollo官方Gitee:https://gitee.com/nobodyiam/apollo二、安装部署2.1环境准备java:JDK1.8.+maven:3.3.9mysql:版本要求(5.6.5+)查看数据库版本:SHOWVARIABLESWHEREVariable_name='version';Apolloserver:1.9+Apolloclient:1.7+2.2安装包下载1.源码下载从(Apollo-github[1])下载最新的源码也可以下载到本地gitclonehttps://github.com/ctripcorp/apollo通过git命令https://github.com/ctripcorp/apollo2。下载安装包地址:https://github.com/ctripcorp/apollo/releases注意:本文使用的方法是1.下载源码进行演示。2.3创建数据库Apollo服务器一共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们可以在下载的源码包中找到。文件目录为:apollo\scripts\sql,路径如下图所示:或通过下载地址获取SQLApolloPortalDBSQL下载地址:https://github.com/ctripcorp/apollo/tree/master/scripts/sql导入成功后,验证SQL:select*from`ApolloPortalDB`.`ServerConfig`;ApolloConfigDBSQL下载地址:https://github.com/ctripcorp/apollo/tree/master/scripts/sql导入成功后,验证SQL:select*from`ApolloConfigDB`.`ServerConfig`;2.4服务器配置调整(可选)1、ApolloPortalDB库配置操作表:ServerConfig2。ApolloConfigDB库配置操作表:ServerConfig2.5打开项目,将下载的Apollo源码导入到idea中。需要注意的主要有以下三个:我们找到/apollo/scripts/build.bat文件(Linux是bulid.sh)修改数据库配置信息,注意这是两个库(ApolloPortalDB和ApolloConfigDB):remapolloconfigdbinfo(这是ApolloConfigDB库)setpollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?serverTimezone=UTC&characterEncoding=utf-8"setapollo_config_db_username="root"setapollo_config_db_password="123456"remapolloportaldbinfo(这是ApolloPortalDB库)setpollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?serverTimezone=UTC&characterEncoding=utf-8"setapollo_portal_db_username="root"setapollo_portal_db_password="123456"remmetaserverurl,differentenvironmentsshouldhavedifferentmetaserveraddressesrem配置每个环境版本后面部署的metaservice的地址)(reconfigservice吧)也可以在运行时指定:-apollo.meta=http://192.168.*.*:8080setdev_meta="http://localhost:8080"setfat_meta="http://someIp:8080"setuat_meta="http://anotherIp:8080"setpro_meta="http://yetAnotherIp:8080"注意:连接数据库需要加上serverTimezone=UTC,否则可能会报错。修改完上面的配置,我们就可以执行构建了.bat批处理命令编译打包在Windows下运行build.bat文件,如果在LInux上运行build.sh,第一次执行会比较慢,需要下载Mavenjar,三个jar包都有已经打包的都复制出来放在单独的目录,方便我们启动。如下图所示:启动顺序为:apollo-configservice>apollo-adminservice>apollo-portal三个服务。启动脚本,放在记事本中,修改后缀为.bat,即可一键启动三个服务。@echooffstartcmd/c"java-jarapollo-configservice-1.10.0-SNAPSHOT.jar"startcmd/c"java-jarapollo-adminservice-1.10.0-SNAPSHOT.jar"startcmd/c"java-jarapollo-portal-1.10.0-SNAPSHOT.jar"spause//防止操作完成后直接关闭界面。全部启动成功后,打开浏览器输入:http://localhost:8070/,看到Apollo登录页面,说明启动成功。用户名和密码:ap??ollo/admin输入http://localhost:8080,如果出现eureka的管理界面,说明服务启动正常。3.客户端使用客户端使用指南[2]3.1导入jar包com.ctrip.framework.apolloapollo-client1.7.0数据库jar-->mysqlmysql-connector-javaruntimeorg.springframework.bootspring-boot-starter-data-jpa1.5.9.RELEASE3.2发布配置创建应用1.AppId:0012.AppId:mxn-front-gatewayAppId是应用程序的身份信息,是从服务器获取配置的重要信息。AppId:001配置内容AppId:mxn-front-gateway配置内容以上两张图是我们Apollo配置中心的详细配置页面。页面左上方的环境列表模块展示了所有的环境和集群,用户可以自由切换。页面中央显示两个命名空间的配置信息,默认以表格方式显示和编辑。用户还可以切换到文本模式,以文件的形式查看和编辑文件。发布、回滚、灰度、授权、查看变更历史、发布历史等操作都可以在页面方便的进行3.3操作配置项输入配置内容3.4发布配置添加发布信息4.SpringBoot集成Apollo在SpringBoot中使用apollo配置More方便,我们只需要在相应的配置(yml或properties)中设置apollo(appid和meta)和namespace即可。application.yml配置app:id:001apollo:meta:http://localhost:8080bootstrap:enabled:truenamespaces:dev.yml,test.propertiesSpringBoot启动类,添加@EnableApolloConfig@SpringBootApplication@EnableApolloConfigpublicclassApolloMxnApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ApolloMxnApplication.class,args);}}测试类,实时获取配置信息.web.bind.annotation.RestController;/***@program:apollo-mxn*@ClassNameTestController*@description:*@author:lyy*@create:2021-09-1517:45*@Version1.0**/@RestControllerpublicclassTestController{@Value(value="${mxn.name}")privateStringname;@RequestMapping("test")publicStringtest(){return"helloworld"+name;}}所以我们可以从meta(apollo-adminservice和apollo-configservice)是用Apollo5配置的,实现配置热加载ing创建配置热加载实现类importcom.ctrip.framework.apollo.core.ConfigConsts;importcom.ctrip.framework.apollo.model.ConfigChangeEvent;importcom.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework。boot.autoconfigure.jdbc.DataSourceProperties;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.cloud.context.config.annotation.RefreshScope;importorg.springframework.context.ApplicationContext;importorg.springframework.context.annotation。Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;/***@program:apollo-mxn*@ClassNameDataSourceConfig*@description:现实配置信息热加载*@author:lyy*@create:2021-09-1516:41*@Version1.0**/@Configuration@EnableConfigurationProperties(DataSourceProperties.class)@Slf4jpublicclassConfigHotLoad{@RefreshScope@Bean(“dataSource_Bean”)publicDataSourcedataSource(DataSourcePropertiesdataSourceProperties){returndataSourceProperties.initializeDataSourceBuilder().build();}@AutowiredprivateApplicationContextapplicationContext;@Autowiredprivateorg.springframework.cloud.context.scope.refresh.RefreshScoperefreshScope;/**@Authorlyy*@Description@/TODOapolloDate16的配置变更监控:502021/9/15*@Param*@return**/@ApolloConfigChangeListener(value={ConfigConsts.NAMESPACE_APPLICATION,"dev"},interestedKeyPrefixes={"spring.datasource"})publicvoidonChange(ConfigChangeEventconfigChangeEvent){//重新编译DataSource初始化beanrefreshScope.refresh("dataSource_Bean");log.info("Apolloconfigchanged{}",applicationContext.getBean(DataSourceProperties.class).toString());}}我们输入地址http://localhost:yourport/test[3】可以看到对应的配置名称,然后修改apollo中的信息。发布后,我们可以在不启动项目的情况下更新我们的配置信息。ApollolocalcacheLinux:/opt/data/{appId}/config-cacheWindows:C:\opt\data{appId}\config-cache6.Apollo官方案例是什么:UsecaseDemo可以参考Apollo使用场景和示例代码[4]6.1诞生背景随着程序的功能越来越复杂,程序的配置也越来越多:各种功能的开关、参数的配置、服务器的地址……对程序的配置的期望也越来越高越来越高:配置修改后实时生效,灰色在这样一个大环境下,配置文件、数据库等传统方式越来越不能满足开发者对配置管理的需求。Apollo配置中心应运而生!6.2Apollo描述Apollo(阿波罗)是携程框架部开发的开源配置管理中心。它可以集中管理不同环境和不同集群的配置。具有权限规范化、流程化管理的特点。Apollo支持四个维度来管理Key-Value格式的配置:1.application(应用)2.environment(环境)3.cluster(集群)4.namespace(命名空间)同时,Apollo是基于开源模型,开源地址:https://github.com/ctripcorp/apollo6.3基本模型Apollo的基本模型:1、用户在配置中心修改配置并发布。2、配置中心通知Apollo客户端有配置更新。3.Apollo客户端从配置中心更新配置。拉取最新配置,更新本地配置并通知应用VII.Apollo特点由于配置的特殊性,Apollo从设计之初到完善,都立志做一个具备治理能力的配置中心平台。Apollo的特点主要体现在以下几个方面统一配置的配置管理三个方面1.Apollo提供统一的接口来集中管理不同环境、集群、命名空间的配置。2、相同的代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等。3、通过命名空间(namespace),方便支持多个不同的应用共享同一个配置,以及它还允许应用共享配置被覆盖,配置修改实时生效(热发布)1.用户在Apollo中修改并发布配置后,客户端可以实时(1秒)收到最新的配置并通知应用版本发布管理1.所有配置发布都有版本概念,可以方便的支持配置回滚灰度发布1.支持配置灰度发布,比如点击发布后,只对部分应用实例生效,以及等待一段时间,看没有问题再推送授权管理,发布审核,运营auditforallapplicationinstances1.应用和配置管理有完善的授权管理机制,配置管理分为编辑和发布两个环节,减少人为失误。2、所有操作都有审计日志,可以方便地跟踪问题。客户端配置信息监控1.界面上可以很方便的看到配置在哪些实例上使用提供Java和.Net原生客户端1.提供Java和.Net原生客户端,方便应用集成2.支持SpringPlaceholder、Annotation和SpringBoot的ConfigurationProperties,方便应用程序使用(需要Spring3.1.1+)3.同时提供Http接口,非Java和.Net应用程序也可以简单易用提供开放平台API1.Apollo本身提供了比较完善的统一配置管理接口,支持多环境、多数据中心的配置管理、权限、流程治理等特性。但是,为了通用性,Apollo不会对配置修改做太多的限制。只要符合基本格式,就可以保存。不会针对不同的配置值,如数据库用户名、密码、Redis服务地址等进行针对性校验。2、对于此类应用配置,Apollo支持应用方通过开放的方式在Apollo上修改发布配置平台API,并有完善的权限和权限控制。部署简单1、配置中心作为一项基础服务,对可用性的要求非常高,这就要求Apollo尽可能少的对外依赖。2、目前外部依赖只有MySQL,所以部署非常简单。只要安装了Java和MySQL,Apollo就可以运行。3、Apollo还提供打包脚本,一键生成所有需要的安装包,自定义运行时参数。八、Apollo的原理上图简要描述了Apollo客户端的实现原理:1.客户端和服务端保持长连接,以便连接后可以立即获取配置更新的推送。2、客户端会定时从Apollo配置中心服务器拉取应用的最新配置。这是一种回退机制。为了防止push机制失效导致配置不更新,客户端定时pull会上报本地版本。因此,正常情况下,对于预定的拉取操作,服务器会返回304-NotModified。默认的定时频率是每5分钟Pull一次。客户端也可以通过在运行时指定System>Property:apollo.refreshInterval来覆盖它,单位是分钟。3、客户端从Apollo配置中心服务器获取到应用的最新配置后,存储到内存中。4.当服务不可用时,客户端将从服务器获取的配置副本缓存在本地文件系统中。或者当网络断开时,仍然可以在本地恢复配置。5、应用从Apollo客户端获取最新配置,并订阅配置更新通知。可以按照数据中心划分集群,也支持自定义集群。比如可以为A机房的某台机器和B机房的某台机器创建一个集群,使用一组配置。Apollo默认会使用应用实例所在的数据中心作为集群,所以如果两者一致,则不需要额外配置。如果集群与数据中心不一致,那么需要通过SystemProperty方法指定运行时集群:-Dapollo.cluster=SomeCluster这里注意apollo.cluster全部小写。变得重要。例如,应用部署在A机房,但在Apollo中没有新建集群。阿波罗此时的行为是怎样的呢?或者在运行时指定了cluster=SomeCluster,但是Apollo中并没有创建新的集群。阿波罗此时的行为是怎样的呢??10.1应用自身配置获取规则当应用使用如下语句获取配置时,我们称之为获取应用自身配置,即应用自身应用命名空间的配置。配置config=ConfigService.getAppConfig();这种情况的配置获取规则简述如下:1.首先查找运行时集群的配置(由apollo.cluster指定)2.如果没有找到,再查找数据中心的集群配置3.如果还是没有找到,返回默认集群配置图如下:那么如果应用部署在A数据中心,但是用户没有在Apollo中创建集群,那么获取到的配置就是默认集群(default)。如果应用部署在A数据中心,运行时指定了SomeCluster,但Apollo中没有创建集群,那么获取到的配置就是A数据中心集群的配置。如果没有配置A数据中心集群,则获取的配置为默认配置。集群(默认)。11.总体设计上图简要描述了Apollo的总体设计,我们从下到上可以看到:ConfigService提供读取和推送配置等功能,服务对象为Apollo客户端AdminService提供修改和发布配置等功能,服务对象是ApolloPortal(管理接口)ConfigService和AdminService是多实例,无状态部署,所以需要自己在Eureka注册,心跳保持在Eureka之上。我们设置一层MetaServer来封装Eureka的服务发现接口Client通过域名访问MetaServer获取ConfigService服务列表(IP+Port),然后直接通过IP+Port访问服务。同时在Client端进行负载均衡和错误重试。Portal通过域名访问MetaServer获取AdminService服务列表(IP+Port),然后直接通过IP+Port访问服务,同时会在Portal端进行负载均衡和错误重试.为了简化部署,我们实际上会将ConfigService、Eureka和MetaServer这三种逻辑角色部署在同一个JVM进程中。12.这里总结一下Apollo,讲解到此结束。其实可以把Apollo理解为一个好用的配置管理中心。在这里,小农也理解的有点肤浅。如果您有什么不明白的地方,请留言。我是小农,怕是道理讲不完,后面还会有更多的欢乐,大家加油~