# Apollo配置中心
上图简要描述了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进程中
Apollo客户端
- 客户端和服务端直接保持了一个长连接(Http Long Polling,服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求),从而能第一时间获得配置更新的推送
- 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置
- 这是一个fallback机制,为了防止推送机制失效导致配置不更新
- 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
- 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property:
apollo.refreshInterval
来覆盖,单位为分钟
- 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
- 客户端会把从服务端获取到的配置在本地文件系统缓存一份
- 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
- 应用程序从Apollo客户端获取最新的配置、订阅配置更新通知
# Spring整合Apollo
SpringBoot 整合Apollo (opens new window) 配置中心
- 导入jar包:
<!--apollo-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
1
2
3
4
5
6
2
3
4
5
6
- 配置apollo必要参数
SpringBoot的话最简单的一种是直接在application.properties里配置
#apollo
app.id=your-app-id
apollo.meta=http://config-server-url/
1
2
3
2
3
- 获取配置
- 调用API方式,最简单,最灵活
/**
* 获取配置方式一
* 调用API方式,最简单,最灵活
* @return
*/
private String getApolloConfig() {
Config config = ConfigService.getConfig("my-namespace");
String someKey = "myConfigKey";
String someDefaultValue = "none";
String value = config.getProperty(someKey, someDefaultValue);
return value;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- Java配置方式
@EnableApolloConfig(value = "AppVersion") //AppVersion指定了namespace
@Configuration
public class ApolloConfig {
//可以直接通过这种方式获取配置值
@Value("${IOSVerCode}")
public String iosVerCode;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8