分布式配置中⼼Apollo详解(⼆):Apollo设计原理、将ConfigService和。。。
五、Apollo设计原理
1、架构模块
上图简要描述了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进程中
2、客户端设计
上图简要描述了Apollo客户端的实现原理:
1)、客户端和服务端保持了⼀个长连接,从⽽能第⼀时间获得配置更新的推送(通过Http Long Polling实现)
2)、客户端还会定时从Apollo配置中⼼服务端拉取应⽤的最新配置
这是⼀个fallback机制,为了防⽌推送机制失效导致配置不更新
客户端定时拉取会上报本地版本,所以⼀般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
定时频率默认为每5分钟拉取⼀次,客户端也可以通过在运⾏时指定System Property: freshInterval来覆盖,单位为分钟3)、客户端从Apollo配置中⼼服务端获取到应⽤的最新配置后,会保存在内存中
4)、客户端会把从服务端获取到的配置在本地⽂件系统缓存⼀份
在遇到服务不可⽤,或⽹络不通的时候,依然能从本地恢复配置
Mac/Linux:/opt/data/{appId}/config-cache
Windows:C:\opt\data{appId}\config-cache
⽂件名格式如下:ego什么意思
{appId}+{cluster}+{namespace}.properties
5)、应⽤程序可以从Apollo客户端获取最新的配置、订阅配置更新通知在线英语学习
详细查看官⽅⽂档
六、Apollo服务端配置调整
1、调整ApolloPortalDB配置
配置项统⼀存储在ApolloPortalDB.ServerConfig表中,也可以在管理员⼯具中的系统参数页⾯进⾏配置,⽆特殊说明则修改完⼀分钟实时⽣效
1)、vs(可⽀持的环境列表)
默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(⼤⼩写不敏感),如:
DEV,FAT,UAT,PRO
修改完需要重启⽣效
注1:⼀套Portal可以管理多个环境,但是每个环境都需要独⽴部署⼀套Config Service、Admin Service和ApolloConfigDB 注2:只在数据库添加环境是不起作⽤的,还需要为apollo-portal添加新增环境对应的meta rver地址
2)、organizations(部门列表)
Apollo中新建的项⽬都需要选择部门,所以需要在这⾥配置可选的部门信息
[{"orgId":"HAND","orgName":"技术1部"},{"orgId":"HAND","orgName":"技术2部"},{"orgId":"HAND","org
Name":"技术3部"}]
3)、superAdmin(Portal超级管理员)
超级管理员拥有所有权限,需要谨慎设置
如果没有接⼊⾃⼰的SSO系统的话,可以先暂时使⽤默认值apollo(默认⽤户)。等接⼊后,修改为实际使⽤的账号,多个账号以英⽂逗号分隔,
4)、ken.salt(consumer token salt)
如果会使⽤开放平台API的话,可以设置⼀个token salt。如果不使⽤,可以忽略
5)、wiki.address
portal上“帮助”链接的地址,默认是Apollo github的wiki⾸页,可⾃⾏设置
6)、atePrivateNamespace.switch
是否允许项⽬管理员创建private namespace。设置为true允许创建,设置为fal则项⽬管理员在页⾯上看不到创建private namespace 的选项
7)、vs
只对项⽬成员显⽰配置信息的环境列表,多个env以英⽂逗号分隔
对设定了只对项⽬成员显⽰配置信息的环境,只有该项⽬的管理员或拥有该namespace的编辑或发布权限的⽤户才能看到该私有namespace的配置信息和发布历史。公共namespace始终对所有⽤户可见
2、调整ApolloConfigDB配置
配置项统⼀存储在ApolloConfigDB.ServerConfig表中,需要注意每个环境的ApolloConfigDB.ServerConfig都需要单独配置,修改完⼀分钟实时⽣效
1)、eureka.rvice.url(Eureka服务Url)
不管是apollo-configrvice还是apollo-adminrvice都需要向eureka服务注册,所以需要配置eureka服务地址
bully什么意思
合肥游戏按照Apollo的实现,apollo-configrvice本⾝就是⼀个eureka服务,所以只需要填⼊apollo-configrvice的地址即可,如有多个,⽤逗号分隔
2)、namespace.lock.switch(⼀次发布只能有⼀个⼈修改开关,⽤于发布审核)
这是⼀个功能开关,如果配置为true的话,那么⼀次配置发布只能是⼀个⼈修改,另⼀个发布(⽣产环境建议开启此选项)
3)、abled(是否开启配置缓存)
这是⼀个功能开关,如果配置为true的话,config rvice会缓存加载过的配置信息,从⽽加快后续配置获取性能
默认为fal,开启前请先评估总配置⼤⼩并调整config rvice内存配置
4)、item.key.length.limit(配置项 key 最⼤长度限制)
默认配置是128
5)、item.value.length.limit(配置项 value 最⼤长度限制)
默认配置是20000
3、将Config Service和Admin Service注册到⾃⼰的Eureka Server上
1)、修改apollo-configrvice⼯程下ip.figrvice包下的ConfigServiceApplication,把
@EnableEurekaServer改为@EnableEurekaClient并重新打包
@EnableEurekaClient
@EnableAspectJAutoProxy
@EnableAutoConfiguration// (exclude = EurekaClientConfigBean.class)
@Configuration
@EnableTransactionManagement
budget
@PropertySource(value ={"classpath:configrvice.properties"})
@ComponentScan(baPackageClass ={ApolloCommonConfig.class,
ApolloBizConfig.class,
ConfigServiceApplication.class,
ApolloMetaServiceConfig.class})
public class ConfigServiceApplication {
public static void main(String[] args)throws Exception {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
2)、修改ApolloConfigDB.ServerConfig表中的eureka.rvice.url,指向⾃⼰的Eureka地址
效果如下图:
复仇者联盟台词
需要注意的是更改Eureka地址只需要改ApolloConfigDB.ServerConfig表中的eureka.rvice.url即可,不需要修改meta rver地址
默认情况下,meta rvice和config rvice是部署在同⼀个JVM进程,所以meta rvice的地址就是config rvice的地址,修改Eureka地址时不需要修改meta rver地址
七、Apollo配置信息加密
navyals
Apollo中存储的⼀些⽐较重要的配置信息,⽐如密码之类的敏感配置,我们希望将配置加密存储,保证安全性。Apollo框架本⾝没有提供数据加密的功能,如果想要实现数据加密的功能有两种⽅式,可以基于第三⽅的框架来对数据进⾏解密
jasypt-spring-boot是⼀个基于Spring Boot开发的框架,可以将properties中加密的内容⾃动解密,在Apollo中也可以借助于jasypt-spring-boot这个框架来实现数据的加解密操作july怎么读
1、添加依赖
<dependency>
<groupId>com.github.ulisbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>gio
<version>1.16</version>
</dependency>
shrimp
<dependency>
<groupId&ip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>