# Apollo配置中心

jZXzdA.png

上图简要描述了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客户端

  1. 客户端和服务端直接保持了一个长连接(Http Long Polling,服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求),从而能第一时间获得配置更新的推送
  2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置
    • 这是一个fallback机制,为了防止推送机制失效导致配置不更新
    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
    • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟
  3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
  4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份
    • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
  5. 应用程序从Apollo客户端获取最新的配置、订阅配置更新通知

# Spring整合Apollo

SpringBoot 整合Apollo (opens new window) 配置中心

  1. 导入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
  1. 配置apollo必要参数
    SpringBoot的话最简单的一种是直接在application.properties里配置
#apollo
app.id=your-app-id
apollo.meta=http://config-server-url/
1
2
3
  1. 获取配置
  • 调用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
  • Java配置方式
@EnableApolloConfig(value = "AppVersion") //AppVersion指定了namespace
@Configuration
public class ApolloConfig {
   //可以直接通过这种方式获取配置值
   @Value("${IOSVerCode}")
   public String iosVerCode;
  
}
1
2
3
4
5
6
7
8