一篇带给你 Apollo 配置中心详细教程

时间:2022-09-07 14:09:56

一篇带给你 Apollo 配置中心详细教程

一、简介

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端 不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端 不依赖任何框架,能够运行于所有.Net运行时环境。

官方 GitHub: https://github.com/ctripcorp/apollo

官方 Gitee: https://gitee.com/nobodyiam/apollo

二、安装部署

2.1 环境准备

java:JDK 1.8.+

maven: 3.3.9

mysql: 版本要求(5.6.5+)

查看数据库版本:SHOW VARIABLES WHERE Variable_name = 'version';

Apollo服务端:1.9+

Apollo客户端:1.7+

2.2 安装包下载

1.源码下载 从(Apollo-github[1]) 下载最新的源码,也可以通过 git 命令下载到本地

git clone https://github.com/ctripcorp/apollo

2.下载安装包 地址:https://github.com/ctripcorp/apollo/releases

注意: 本文中使用的方式为 1.源码下载,进行演示。

2.3 创建数据库

Apollo 服务端总共需要两个数据库:ApolloPortalDB和 ApolloConfigDB

我们可以在下载的源码包里面找到,文件目录为:apollo\scripts\sql,路径如下图所示:

一篇带给你 Apollo 配置中心详细教程

或者通过下载地址来获取SQL

ApolloPortalDB

SQL下载地址:https://github.com/ctripcorp/apollo/tree/master/scripts/sql 导入成功后,验证SQL:select * from `ApolloPortalDB`.`ServerConfig`;

一篇带给你 Apollo 配置中心详细教程

ApolloConfigDB

SQL下载地址:https://github.com/ctripcorp/apollo/tree/master/scripts/sql 导入成功后,验证SQL:select * from `ApolloConfigDB`.`ServerConfig`;

一篇带给你 Apollo 配置中心详细教程

2.4 服务端配置调整(可选项)

1. ApolloPortalDB库配置

操作表:ServerConfig

一篇带给你 Apollo 配置中心详细教程

2. ApolloConfigDB库配置

操作表:ServerConfig

一篇带给你 Apollo 配置中心详细教程

2.5 打开工程

将下载下来的 Apollo 源码导入 idea 中,需要关注的项目主要是下面这三个:

一篇带给你 Apollo 配置中心详细教程

一篇带给你 Apollo 配置中心详细教程

我们找到 /apollo/scripts/build.bat的文件(Linux 是 bulid.sh)

一篇带给你 Apollo 配置中心详细教程

修改数据库配置信息,注意这是两个库(ApolloPortalDB和 ApolloConfigDB):

  1. remapolloconfigdbinfo(这个是ApolloConfigDB库)
  2. setpollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?serverTimezone=UTC&characterEncoding=utf-8"
  3. setapollo_config_db_username="root"
  4. setapollo_config_db_password="123456"
  5.  
  6. remapolloportaldbinfo(这个是ApolloPortalDB库)
  7. setpollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?serverTimezone=UTC&characterEncoding=utf-8"
  8. setapollo_portal_db_username="root"
  9. setapollo_portal_db_password="123456"
  10.  
  11. remmetaserverurl,differentenvironmentsshouldhavedifferentmetaserveraddresses
  12. rem配置各环境metaservice地址(configservice部署的地址)
  13. rem后面版本也是可以再运行时指定:-apollo.meta=http://192.168.*.*:8080
  14. setdev_meta="http://localhost:8080"
  15. setfat_meta="http://someIp:8080"
  16. setuat_meta="http://anotherIp:8080"
  17. setpro_meta="http://yetAnotherIp:8080"

注意: 数据库连接,需要添加serverTimezone=UTC否则可能会报错

修改完上面的配置以后,我们就可以执行build.bat批处理命令进行编译打包。在windows 运行build.bat文件,如果是LInux 运行 build.sh

第一次会执行比较慢,需要下载Maven jar

一篇带给你 Apollo 配置中心详细教程

打包成功后,我们找到 apollo-configservice、apollo-adminservice、apollo-portal下target 目录,找到已经打好的三个jar包,copy 出来放到一个单独的目录,方便我们启动。

如下图所示:

一篇带给你 Apollo 配置中心详细教程

启动顺序为:apollo-configservice > apollo-adminservice > apollo-portal三个服务。

启动脚本,放到记事本,修改后缀名为 .bat就可以一键启动三个服务了。

  1. @echooff
  2. startcmd/c"java-jarapollo-configservice-1.10.0-SNAPSHOT.jar"
  3. startcmd/c"java-jarapollo-adminservice-1.10.0-SNAPSHOT.jar"
  4. startcmd/c"java-jarapollo-portal-1.10.0-SNAPSHOT.jar"
  5. spause//防止运行完毕后直接关闭界面

全部启动成功之后,打开浏览器输入:http://localhost:8070/,看到 Apollo 登录页面说明启动成功。

用户名密码: apollo/admin

一篇带给你 Apollo 配置中心详细教程

输入 http://localhost:8080 ,如果出现eureka 的管理界面,说明服务启动正常。

一篇带给你 Apollo 配置中心详细教程

三、客户端使用

客户端使用指南[2]

3.1 导入jar包

  1. com.ctrip.framework.apollo
  2. apollo-client
  3. 1.7.0
  4.  
  5. 数据库jar-->
  6. mysql
  7. mysql-connector-java
  8. runtime
  9.  
  10. org.springframework.boot
  11. spring-boot-starter-data-jpa
  12. 1.5.9.RELEASE
  13.  

3.2 发布配置

一篇带给你 Apollo 配置中心详细教程

创建应用

1.AppId:001

2.AppId:mxn-front-gateway

AppId是应用的身份信息,是从服务端获取配置的一个重要信息。

AppId:001的配置内容

一篇带给你 Apollo 配置中心详细教程

AppId:mxn-front-gateway的配置内容

一篇带给你 Apollo 配置中心详细教程

上面的两张图,就是我们Apollo配置中心的详细配置页面

  • 在页面左上方的环境列表模块展示了所有的环境和集群,用户可以*切换。
  • 页面*展示了两个namespace 的配置信息,默认按照表格模式展示、编辑。用户也可以切换到文本模式,以文件形式查看、编辑。
  • 页面上可以方便地进行发布、回滚、灰度、授权、查看更改历史和发布历史等操作

3.3 操作配置项

一篇带给你 Apollo 配置中心详细教程

输入配置内容

一篇带给你 Apollo 配置中心详细教程

3.4 发布配置

一篇带给你 Apollo 配置中心详细教程

添加发布信息

一篇带给你 Apollo 配置中心详细教程

四、Spring Boot 集成 Apollo

在Spring Boot中使用 apollo 配置比较方便,我们只需要在对应的配置(yml或者properties)中设置 apollo的(appid和meta)以及命名空间就行。

application.yml 配置

  1. app:
  2. id:001
  3. apollo:
  4. meta:http://localhost:8080
  5. bootstrap:
  6. enabled:true
  7. namespaces:dev.yml,test.properties

Spring Boot 启动类,添加 @EnableApolloConfig

  1. @SpringBootApplication
  2. @EnableApolloConfig
  3. publicclassApolloMxnApplication{
  4.  
  5. publicstaticvoidmain(String[]args){
  6. SpringApplication.run(ApolloMxnApplication.class,args);
  7. }
  8.  
  9. }

测试类,实时获取配置信息

  1. importorg.springframework.beans.factory.annotation.Value;
  2. importorg.springframework.web.bind.annotation.RequestMapping;
  3. importorg.springframework.web.bind.annotation.RestController;
  4.  
  5. /**
  6. *@program:apollo-mxn
  7. *@ClassNameTestController
  8. *@description:
  9. *@author:lyy
  10. *@create:2021-09-1517:45
  11. *@Version1.0
  12. **/
  13. @RestController
  14. publicclassTestController{
  15.  
  16. @Value(value="${mxn.name}")
  17. privateStringname;
  18.  
  19. @RequestMapping("test")
  20. publicStringtest(){
  21. return"helloworld"+name;
  22. }
  23.  
  24. }

这样我们就可以 从 meta 中 拉取两个命名空间(apollo-adminservice和apollo-configservice)的配置了Apollo

五、实现配置热加载

创建配置热加载实现类

  1. importcom.ctrip.framework.apollo.core.ConfigConsts;
  2. importcom.ctrip.framework.apollo.model.ConfigChangeEvent;
  3. importcom.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
  4. importlombok.extern.slf4j.Slf4j;
  5. importorg.springframework.beans.factory.annotation.Autowired;
  6. importorg.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
  7. importorg.springframework.boot.context.properties.EnableConfigurationProperties;
  8. importorg.springframework.cloud.context.config.annotation.RefreshScope;
  9. importorg.springframework.context.ApplicationContext;
  10. importorg.springframework.context.annotation.Bean;
  11. importorg.springframework.context.annotation.Configuration;
  12.  
  13. importjavax.sql.DataSource;
  14.  
  15. /**
  16. *@program:apollo-mxn
  17. *@ClassNameDataSourceConfig
  18. *@description:实现配置信息热加载
  19. *@author:lyy
  20. *@create:2021-09-1516:41
  21. *@Version1.0
  22. **/
  23. @Configuration
  24. @EnableConfigurationProperties(DataSourceProperties.class)
  25. @Slf4j
  26. publicclassConfigHotLoad{
  27.  
  28. @RefreshScope
  29. @Bean("dataSource_Bean")
  30. publicDataSourcedataSource(DataSourcePropertiesdataSourceProperties){
  31. returndataSourceProperties.initializeDataSourceBuilder().build();
  32. }
  33.  
  34. @Autowired
  35. privateApplicationContextapplicationContext;
  36.  
  37. @Autowired
  38. privateorg.springframework.cloud.context.scope.refresh.RefreshScoperefreshScope;
  39.  
  40. /**@Authorlyy
  41. *@Description//TODO监听apollo的配置变更
  42. *@Date16:502021/9/15
  43. *@Param
  44. *@return
  45. **/
  46. @ApolloConfigChangeListener(value={ConfigConsts.NAMESPACE_APPLICATION,"dev"},interestedKeyPrefixes={"spring.datasource"})
  47. publicvoidonChange(ConfigChangeEventconfigChangeEvent){
  48. //重新编译DataSource初始化bean
  49. refreshScope.refresh("dataSource_Bean");
  50. log.info("Apolloconfigchanged{}",applicationContext.getBean(DataSourceProperties.class).toString());
  51.  
  52. }
  53.  
  54. }

一篇带给你 Apollo 配置中心详细教程

我们 输入地址 http://localhost:你的端口/test[3] 就可以看到,对应的配置名字,然后修改apollo里面的信息,发布后,再不启动项目的情况下,就可以更新我们的配置信息了

一篇带给你 Apollo 配置中心详细教程

一篇带给你 Apollo 配置中心详细教程

Apollo 本地缓存

Linux:/opt/data/{appId}/config-cache Windows:C:\opt\data{appId}\config-cache

六、什么是 Apollo

官方案例: 使用案例Demo可以参考Apollo使用场景和示例代码[4]。

6.1 诞生背景

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……

对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……

在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。

Apollo配置中心应运而生!

6.2 Apollo 说明

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

Apollo支持4个维度管理Key-Value格式的配置:

1.application (应用)

2.environment (环境)

3.cluster (集群)

4.namespace (命名空间)

同时,Apollo基于开源模式开发,开源地址:https://github.com/ctripcorp/apollo

6.3 基础模型

一篇带给你 Apollo 配置中心详细教程

Apollo的基础模型:

1.用户在配置中心对配置进行修改并发布

2.配置中心通知Apollo客户端有配置更新

3.Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

七、Apollo特性

由于配置的特殊性,所以Apollo 从开始设计到完善就立志作为一个有治理能力的配置中心平台,Apollo的特性主要体现在以下几个方面

  • 统一配置的配置管理

1.Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。

2.同一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等

3.通过命名空间(namespace)可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖

  • 配置修改实时生效(热发布)

1.用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序

  • 版本发布管理

1.所有的配置发布都有版本概念,从而可以方便地支持配置的回滚

  • 灰度发布

1.支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例

  • 权限管理、发布审核、操作审计

1.应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。

2.所有的操作都有审计日志,可以方便地追踪问题

  • 客户端配置信息监控

1.可以在界面上方便地看到配置在被哪些实例使用

  • 提供Java和.Net原生客户端

1.提供了Java和.Net的原生客户端,方便应用集成

2.支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)

3.同时提供了Http接口,非Java和.Net应用也可以方便地使用

  • 提供开放平台API

1.Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等

2.对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改 和发布,并且具备完善的授权和权限控制

  • 部署简单

1.配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少

2.目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来

3.Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

八、Apollo原理

一篇带给你 Apollo 配置中心详细教程

上图简要描述了Apollo客户端的实现原理:

1.客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。

2.客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

  • 这是一个fallback机制,为了防止推送机制失效导致配置不更新
  • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
  • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System >Property: apollo.refreshInterval来覆盖,单位为分钟。

3.客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中

4.客户端会把从服务端获取到的配置在本地文件系统缓存一份

  • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置

5.应用程序从Apollo客户端获取最新的配置、订阅配置更新通知

九、自定义Cluster

9.1 新建Cluster

一篇带给你 Apollo 配置中心详细教程

点击后就进入到集群添加页面,一般情况下可以按照数据中心来划分集群 不过也支持自定义集群,比如可以为A机房的某一台机器和B机房的某一台机创建一个集群,使用一套配置。

一篇带给你 Apollo 配置中心详细教程

Apollo会默认使用应用实例所在的数据中心作为cluster,所以如果两者一致的话,不需要额外配置。

如果cluster和数据中心不一致的话,那么就需要通过System Property方式来指定运行时cluster:

  • -Dapollo.cluster=SomeCluster
  • 这里注意apollo.cluster为全小写

十、配置获取规则

在有了cluster概念后,配置的规则就显得重要了。比如应用部署在A机房,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?或者在运行时指定了cluster=SomeCluster,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?

10.1 应用自身配置的获取规则

当应用使用下面的语句获取配置时,我们称之为获取应用自身的配置,也就是应用自身的application namespace的配置。

Config config = ConfigService.getAppConfig();

对这种情况的配置获取规则,简而言之如下:

1.首先查找运行时cluster的配置(通过apollo.cluster指定)

2.如果没有找到,则查找数据中心cluster的配置

3.如果还是没有找到,则返回默认cluster的配置

图示如下:

一篇带给你 Apollo 配置中心详细教程

所以如果应用部署在A数据中心,但是用户没有在Apollo创建cluster,那么获取的配置就是默认cluster(default)的。

如果应用部署在A数据中心,同时在运行时指定了SomeCluster,但是没有在Apollo创建cluster,那么获取的配置就是A数据中心cluster的配置,如果A数据中心cluster没有配置的话,那么获取的配置就是默认cluster(default)的。

十一、总体设计

一篇带给你 Apollo 配置中心详细教程

上图简要描述了Apollo的总体设计,我们可以从下往上看:

  • Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
  • Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
  • Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
  • 在Eureka之上我们架了一层Meta Server用于封装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进程中

十二、总结

到这里Apollo,就讲解完了,其实Apollo 可以理解成一个好用的配置管理中心,这里小农也是了解了一点皮毛,大家有不懂的地方,欢迎留言。

我是牧小农,怕什么真理无穷,进一步有进一步的欢喜,大家加油~

原文链接:https://mp.weixin.qq.com/s/izTRQEx0WpzJ0KyieXHB4w