一、apollo在项目中的应用
1、pom引入依赖(此处为公司内部的api)
<dependency>
<groupId>com.bestpay.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0.6</version>
</dependency>
2、配置文件
aplollo-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:apollo="http://www.ctrip.com/schema/apollo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.ctrip.com/schema/apollo http://www.ctrip.com/schema/apollo.xsd">
<apollo:config namespaces="application, technology.dubbo-sh, technology.redis, technology.rf-mpersonal_fin, business.config,
technology.kafka-hx, technology.elasticjob-ls, technology.hikaricp.config "/>
</beans>
<import resource="classpath:apollo-context.xml"/>
application.properties
app.id=clp-pay-center
apollo.env=func
apollo.meta=http://172.17.46.16:20880
3.测试
public class Test extends BaseTest {
@Value("${privateTradeType}")
private String merchantNo;
@org.junit.Test
public void test(){
System.out.println(merchantNo);
}
可以看到用了@Value注解后就可以得到apollo所配置的值了
在配置文件中也可以读取apollo的配置
如:
4.apollo配置的监听
@Slf4j
@Service
public class ApolloChangeListener {
/**
* Spring的LoggingSystem
*/
@Autowired
private LoggingSystem loggingSystem;
private void onAppChange(ConfigChangeEvent changeEvent) {
Set<String> changedKeys = changeEvent.changedKeys();
for (String key : changedKeys) {
ConfigChange change = changeEvent.getChange(key);
String oldValue = change.getOldValue();
String newValue = change.getNewValue();
log.info("Apollo配置发生了更新,namespace=[{}], key=[{}], oldValue=[{}], newValue=[{}]",
changeEvent.getNamespace(), key, oldValue, newValue);
System.out.println("Apollo配置发生了更新"+"namespace="+changeEvent.getNamespace()+"key="+key+"oldValue="+oldValue+"newValue="+newValue);
// 日志等级改变
if ("loggingLevelRoot".equals(key)) {
log.info("应用日志级别更新,key=[{}], old=[{}], new=[{}]", key, oldValue, newValue);
loggingSystem.setLogLevel("root", LogLevel.valueOf(newValue.toUpperCase()));
}
}
}
二、apollo简介
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
特点
- 统一管理不同环境、不同集群的配置
- 配置修改实时生效(热发布)
- 版本发布管理
- 灰度发布
- 权限管理、发布审核、操作审计
- 客户端配置信息监控
- 提供 Java和.Net原生客户端
- 提供开放平台 API
- 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客户端的实现原理:
- 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
- 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
- 这是一个fallback机制,为了防止推送机制失效导致配置不更新
- 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
- 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property:
apollo.refreshInterval
来覆盖,单位为分钟。
- 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
- 客户端会把从服务端获取到的配置在本地文件系统缓存一份
- 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
- 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知