1、Apollo介绍
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务项目配置管理场景。
2、使用目的
1、安全。如果配置在本地项目中,开发人员可以看到测试环境甚至是生产环境的各种地址、账号、密码等等,特别是支付宝/微信等平台支付/退款密匙,这是非常不安全的;
2、配置热更新。用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。不需要再重启程序,配置才能进行更新。
3、配置的版本发布。改动版本有版本的控制,可以快速回滚/查看历史配置。
4、灰度发布。支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例
5、统一化配置管理,开发人员只需要维护自己的配置文件,公共的配置文件不需要改动。避免开发人员改错某项配置后提交上去,导致不必要的问题发生。
3、项目初始化
创建Springboot项目,添加项目依赖
<!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-client -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.9.2</version>
</dependency>
修改application.properties
配置文件,如下
app.id=apollo-test
# apollo的configServer地址
apollo.meta=http://192.168.80.243:8080
# apollo的configServer地址
apollo.config-service= http://192.168.80.243:8080
apollo.bootstrap.enabled=true
apollo.bootstrap.eagerLoad.enabled=true
2、测试使用
2.1 界面说明
创建项目,项目的AppId要和配置文件application.properties
一致
表格:以表格的形式显示所有配置,通常使用它来修改单一配置
文本:以文本框的形式显示所有配置,通常使用它来批量增加配置
更改历史:显示历史的修改情况
实例列表:显示使用这些配置的所有实例
2.2 配置迁移
点击文本,右边按钮变动。点击修改配置
按钮,可以在里面添加配置,注意:需要是**properties
**格式的。如果之前有项目可以直接把之前的项目配置复制里面去。
添加完成配置后,点击右上角的提交修改
。修改完成后需要点击上面的发布
程序才能识别到。
server.port=8081
spring.application.name=apollo-test
logging.file.path=D:\Downloads\apollo-use-cases-master\apollo-test
apollo.value=11
点击发布,apollo上面的配置就算完成了
启动项目,会发现项目正常启动,修改端口号或者路径配置,重启项目也会发现配置会生效
2.3 热更新
在项目中添加类,来获取配置中的值
/**
* @Description:
* @author: zhuiFeng
* @date: 2022年01月12日 14:55
*/
@RestController
public class Controller {
@Value("${apollo.value}")
private String apolloValue;
@RequestMapping("")
public String test(){
return "获取到apollo.value的值为:"+apolloValue;
}
}
重启项目,请求接口http://localhost:8081/,返回的结果是:
获取到apollo.value的值为::11
修改apollo中配置中 apollo.value
的值为 我爱北京天安门
,点击发布
后,调用接口返回的结果是:
获取到apollo.value的值为:我爱北京天安门
2.4 命名空间
有时侯项目的配置太多,在一个文件里不太容易维护。有时候这些配置可能和其他项目有些公共的地方,维护起来不太方便,我们可以使用命名空间来解决这些问题
命名空间:可以创建公有的一些配置,也可以创建私有的个性化的配置,支持yml
,properties
,txt
,xml
,json
等格式
2.4.1 创建
进入项目界面
,点击右下角的添加Namespace
,进入添加NameSpace界面后,选择创建NameSpace
创建一个名为 common1
,格式为yml
文件,类型为public
,如下
点击提交后,返回项目界面,就会出现项目中
2.4.2 测试使用
编辑公共配置common1
,添加如下配置,添加完成后进行发布
apollo:
value1: 编码中。。
在项目中添加接口
@Value("${apollo.value1}")
private String apolloValue1;
@RequestMapping("/getConfig1")
public String getConfig(){
return "获取到apollo.value1的值为:"+apolloValue1;
}
修改项目中的application.properties
配置文件,添加配置。
注意:非properties
配置文件需要带上后缀名,公共的配置需要加上部门前缀,我们的部门为 TEST1
,所以文件名为 TEST1.common1.yml
apollo.bootstrap.namespaces=application,TEST1.common1.yml
重启项目,调用接口http://localhost:8081/getConfig1,获取到了 apollo.value1
的值
获取到apollo.value1的值为:编码中。。
2.4.3 优先级关系
修改application的配置以及公共配置common1,添加apollo.value
和apollo.value1
的配置,点击发布
。
发现输出的都是apollo里application的内容。
修改项目中的配置application.properties
文件内容,把公共配置提前,重启项目
# 之前
apollo.bootstrap.namespaces=application,TEST1.common1.yml
# 之后
apollo.bootstrap.namespaces=TEST1.common1.yml,application
调用接口发现,结果是通用配置中的内容
结论:配置的覆盖是由先后顺序造成的,可以根据先后顺序个性化调整配置内容。两个配置文件中的内容如果有重复的,位置在前的配置文件内容会覆盖后面配置文件里重复的内容