1 配置
Apollo作为大型互联网系统生产级别的配置中心,在开发的积累当中构建了自己的配置维度体系。
1.1 配置四层维度
(1)Application(项目应用)
维度中的最顶层,在实际开发中我们一般以项目来作为最外层配置的区分维度。
(2)Environment(开发环境)
在实际开发当中从开发到上线一般都需要经过各种环境的验证的,Apollo在这个维度下根据携程实际的应用提供了若干环境:
dev:开发环境
fat:功能验收测试环境
uat:用户验收测试环境
lpt:性能测试环境
pro:生成环境
(3)cluster(集群)
一般系统可能没有这一层,但是如果大型的互联网系统则会因为本地多机房,异地多活而会出现统一环境下不同区域的部署,这个时候就需要集群这个维度来进一步细分。
(4)namespace(配置文件(命名空间))
等同于我们平常的boostrap.yml就是一个配置文件集合。
2 接入Apollo
引入依赖
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.8.0</version>
</dependency>
添加配置
app:
id: APOLLO_DEV
apollo:
cacheDir: /Users/kirra/Desktop/project/logs
cluster: default
meta: http://127.0.0.1:8080/
bootstrap:
enabled: true
namespaces: TEST1.AUTH.yml,kafka.yml
app.id 应用ID
apollo.cacheDir 配置文件缓存目录
这里可以参考apollo的可用性考虑
场景影响降级原因某台Config Service下线无影响 Config Service无状态,客户端重连其它Config Service所有Config Service下线客户端无法读取最新配置,Portal无影响客户端重启时,可以读取本地缓存配置文件。如果是新扩容的机器,可以从其它机器上获取已缓存的配置文件,具体信息可以参考Java客户端使用指南 - 1.2.3 本地缓存路径 某台Admin Service下线无影响 Admin Service无状态,Portal重连其它Admin Service所有Admin Service下线客户端无影响,Portal无法更新配置 某台Portal下线无影响 Portal域名通过SLB绑定多台服务器,重试后指向可用的服务器全部Portal下线客户端无影响,Portal无法更新配置 某个数据中心下线无影响 多数据中心部署,数据完全同步,Meta Server/Portal域名通过SLB自动切换到其它存活的数据中心数据库宕机客户端无影响,Portal无法更新配置Config Service开启配置缓存后,对配置的读取不受数据库宕机影响
apollo.cluster 集群
apollo.meta 拉取配置文件的meta服务地址
apollo.bootstrap.enabled 是否开启 Apollo
apollo.bootstrap.namespaces 需要加载的配置文件,以逗号隔开,需要填写配置全称如*.yml
访问代码
package scan.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Value("${apollo.test.name}")
private String name;
@RequestMapping("name")
public String name()
{
return name;
}
}
结果
3 版本回滚
Apollo默认只支持本版本的上一个版本的配置回滚
3.1 跨版本回滚
1.7.0版本开始支持了properties的跨版本回滚
- Support revoking modified but unpublished configurations #2952
- Avoid unnecessary retry for non-existing configurations in apollo-client #3056
- Use Spring Boot native datasource variables instead of custom ones in startup script #3098
- Show namespace comment as tooltip and item modified count in lazy init mode #3112
- Support rollback to specified releases #3093
- Add kubernetes native service discovery support and helm chart templates #3055 #3176 #3205
- Change pom's static version number to ${revision} variable #3151
- Support extracting placeholder from non-normalized expressions in apollo-client, e.g. ${user.address}/user/gateway #3178
- Support exporting multiple configs #3088
注意:Apollo的回滚在界面上配置的值不会回滚到回滚版本的值,而是Apollo向订阅配置的客户端推送回滚的配置。
如果发现已发布的配置有问题,可以通过点击『回滚』按钮来将客户端读取到的配置回滚到上一个发布版本。
这里的回滚机制类似于发布系统,发布系统中的回滚操作是将部署到机器上的安装包回滚到上一个部署的版本,但代码仓库中的代码是不会回滚的,从而开发可以在修复代码后重新发布。
Apollo中的回滚也是类似的机制,点击回滚后是将发布到客户端的配置回滚到上一个已发布版本,也就是说客户端读取到的配置会恢复到上一个版本,但页面上编辑状态的配置是不会回滚的,从而开发可以在修复配置后重新发布。
4 加密
Apollo暂时和Nacos一样没有自己的加密机制,官方推荐引入jasypt进行加密,在没有新修复之前暂时建议使用1.16版:https://github.com/ctripcorp/apollo/issues/2170
引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.16</version>
</dependency>
追加配置
jasypt:
encryptor:
password: ero
使用加密配置
apollo:
test:
name: stephaniestephanie
encryptname: ENC(xoA7RdQgV1VAJ6LWoz0bcRiDrSeb02/z)
结果
5 灰度发布
Apollo支持IP级别的实例灰度发布
创建灰度发布
编辑灰度配置和规则
结果
灰度发布前
172.16.0.4服务:这是灰度发布中端口:1234服务的time值:200
172.16.0.11服务:这是灰度发布中端口:1234服务的time值:200
灰度发布后
172.16.0.4服务:这是灰度发布中端口:1234服务的time值:500
172.16.0.11服务:这是灰度发布中端口:1234服务的time值:200
6 动态刷新
Apollo已经默认给接入的客户端启动动态刷新功能,Portal对配置进行修改就会向客户端推送配置
2021-04-29 21:47:06.538 INFO 45478 --- [Apollo-Config-2] c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: 500, key: time, beanName: testController, field: scan.controller.TestController.time
动态刷新是可以通过配置apollo.autoUpdateInjectedSpringProperties来设置,但是目前配置在某些版本加载会有问题,可以通过增加vm启动配置来保证配置正确加载
-Dapollo.autoUpdateInjectedSpringProperties=false
7 日志配置云部署
Appollo在1.20版本开始可以通过设置配置在Portal中统一控制日志的输出
从1.2.0版本开始,如果希望把日志相关的配置(如
logging.level.root=info
或logback-spring.xml
中的参数)也放在Apollo管理,那么可以额外配置apollo.bootstrap.eagerLoad.enabled=true
来使Apollo的加载顺序放到日志系统加载之前,不过这会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!
设置配置
当apollo.bootstrap.eagerLoad.enabled=false时候,控制台还会输出AutoUpdateConfigChangeListener日志
当apollo.bootstrap.eagerLoad.enabled=true时候,控制台会禁止输出AutoUpdateConfigChangeListener日志