apollo配置中心架构剖析
架构图
1. ConfigService
提供配置获取接口
提供配置推送接口
服务于Apollo客户端
2.AdminService
提供配置管理接口
提供配置修改发布接口
服务于管理界面Portal
3.Client
为应用获取配置,支持实时更新
通过MetaServer获取ConfigService的服务列表
使用客户端软负载SLB方式调用ConfigService
4.Portal
配置管理界面
通过MetaServer获取AdminService的服务列表
使用客户端软负载SLB方式调用AdminService
Eureka
用于服务发现和注册
Config/AdminService注册实例并定期报心跳
和ConfigService住在一起部署
MetaServer
Portal通过域名访问MetaServer获取AdminService的地址列表
Client通过域名访问MetaServer获取ConfigService的地址列表
相当于一个Eureka Proxy
逻辑角色,和ConfigService住在一起部署
·
NginxLB
和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表
和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表
和域名系统配合,协助用户访问Portal进行配置管理
总结:
1.该服务依赖mysql
2.多环境配置需要configserver和adminserver ,2 个项目
3.Configserver的mysqlDB不同
4.有写配置文件在源码中进行修改
服务下载地址:https://github.com/ctripcorp/apollo
架构参考文档:https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ
说明参考文档 : https://github.com/ctripcorp/apollo
Apollo搭建
Git地址 : https://github.com/ctripcorp/apollo
1.下载并解压目录
2. 修改 /自己目录/scripts目录下的build.sh
注意: 如果需要修改DB或者配置多个环境的地址的话。必须重新进行编译,从该步骤重新执行
3. 初始化数据库
进入mysql
Mysql -u用户 -p密码
Source /自己的目录/scripts/sql/apolloconfigdb.sql (多环境需要多个)
Source /自己的目录/scripts/sql/apolloportaldb.sql (只需要一个)
4. 执行 /自己目录/scripts目录下的build.sh 进行编译
第一次执行会比较慢。会编译所有的项目
5. 解压已编译的服务
需要的服务 apollo-configservice(服务) 和 apollo-adminservice(管理)和 apollo-portal(管理界面)
注意:多环境下 apollo-configservice(服务) 和 apollo-adminservice(管理)需要部署多个,但是apollo-portal(管理界面)只需要部署一个
进入/自己的目录/apollo-configservice/target/
解压apollo-configservice-0.11.0-SNAPSHOT-github.zip 到需要部署的目录
Unzip apollo-configservice-0.11.0-SNAPSHOT-github.zip -d 目录
apollo-adminservice和apollo-portal 服务解压同上
6.进入以上3个解压完服务的目录
需要修改/服务的目录/scripts/startup.sh
7.启动服务
Sh /服务的目录/scripts/startup.sh
停止
Sh /服务的目录/scripts/shutdown.sh
先启动所有环境的configserver和adminserver
最后启动portalserver
Apollo管理界面
详细文档参考git :
https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E4%BB%8B%E7%BB%8D
默认用户超级管理员
apollo/admin
1. 创建用户
2. 创建项目
3.新增配置
有权限的人员才能进行配置,点击授权按钮可以对用户进行新增配置和发布进行授权
输入配置信息:
4.发布配置
有权限的用户才能进行发布
Apollo java Api 接入
详细文档参考
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
· Java: 1.7+
· Guava: 15.0+
o Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0
Apollo客户端依赖于AppId,Environment等环境信息来工作,所以请确保阅读下面的说明并且做正确的配置:
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。
请确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:
app.id=YOUR-APP-ID
注:app.id是用来标识应用身份的唯一id,格式为string。
参考位置:
Apollo支持应用在不同的环境有不同的配置,所以Environment是另一个从服务器获取配置的重要信息。
Environment可以通过以下3种方式的任意一个配置:
1.通过Java System Property:
可以通过Java的System Property env来指定环境
在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar
注意key为全小写
2.通过操作系统的System Environment:
还可以通过操作系统的System Environment ENV来指定
注意key为全大写
3.通过配置文件(暂时用了这个)
最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
(修改路径需要修改源码重新编译)
文件内容形如:
env=DEV
目前,env支持以下几个值(大小写不敏感):
DEV(开发)
FAT(测试)
UAT(预发)
PRO(发布)
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。
· Mac/Linux: /opt/data/{appId}/config-cache
· Windows: C:\opt\data\{appId}\config-cache
本地配置文件会以下面的文件名格式放置于本地缓存路径下:
{appId}+{cluster}+{namespace}.properties
· appId就是应用自己的appId,如100004458
· cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default
· namespace就是应用使用的配置namespace,一般是application
文件内容以properties格式存储,比如如果有两个key,一个是request.timeout,另一个是batch,那么文件内容就是如下格式:
request.timeout=2000batch=2000
注:本地缓存路径也可用于容灾目录,如果应用在所有configservice都挂掉的情况下需要扩容,那么也可以先把配置从已有机器上的缓存路径复制到新机器上的相同缓存路径
由于客户端jar包中会包含meta server信息,无法上传一个统一的jar包到中央仓库,应用在实际使用时只需要按照如下方式引入即可。
注:经过测试需要上传私服,导入apollo-core-0.11.0-SNAPSHOT.jar和apollo-client-0.11.0-SNAPSHOT.jar
Apollo支持API方式和Spring整合方式,该怎么选择用哪一种方式?
· API方式灵活,功能完备,配置值实时更新(热发布),支持所有Java环境。
· Spring方式接入简单,结合Spring有N种酷炫的玩法,如
o Spring boot的@ConfigurationProperties方式
· Spring方式也可以结合API方式使用,如注入Apollo的Config对象,就可以照常通过API方式获取配置了:
@ApolloConfig
private Config config;
Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
String someKey = "someKeyFromDefaultNamespace";
String someDefaultValue = "someDefaultValueForTheKey";
String value = config.getProperty(someKey, someDefaultValue);
通过上述的config.getProperty可以获取到someKey对应的实时最新的配置值。
另外,配置值从内存中获取,所以不需要应用自己做缓存。
Apollo同时还增加了两个新的Annotation来简化在Spring环境中的使用。
1. @ApolloConfig
用来自动注入Config对象
2. @ApolloConfigChangeListener
用来自动注册ConfigChangeListener
文档太简单了好多问题很难解决:
加QQ群:375526581
问题论坛:https://github.com/ctripcorp/apollo/issues
自己做了一个springboot的demo
Git地址: https://github.com/smillbob/apolloDemo
需要自己搞2个包。。。详见上面的打包流程