Apollo系列
Apollo配置中心总体设计
What is Apollo
Apollo是携程开发的一款注册中心,主要用于参数配置,各种开关,服务器地址等等。具有热发布,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
如图:是Apollo portal(管理界面)
从图中可看出,Apollo的一个应用(Appid)分集群(Cluster),namespace(理解为一个配置文件,存储着各种配置值)
Apollo设计模型
如图:这是Apollo最简单的模型图
上图屏蔽了Apollo服务端的信息
Portal是Apollo的管理界面,通过metaServer,从Eureka中查找AdminService地址,然后修改DB数据
ConfigService负责查找配置信息,AdminService负责修改配置信息。
Apollo重要概念
1.namespace
namespace理解为一个配置文件,相当于SpringBoot中的properties文件,里面存储着各种配置。
2.cluster
每个应用可以分属于不同集群,集群可以按照
3.appid
appid代表着一个应用,如编写的每一个服务,又如图一的SampleDemo即为一个appid。
4.meta.server
- Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port)
- Client通过域名访问Meta Server获取Config Service服务列表(IP+Port)
- Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
- 增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件
- Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致
5.configService
- 提供配置获取接口
- 提供配置更新推送接口(基于Http long polling)
- 服务端使用Spring DeferredResult实现异步化,从而大大增加长连接数量
- 目前使用的tomcat embed默认配置是最多10000个连接(可以调整),使用了4C8G的虚拟机实测可以支撑10000个连接,所以满足需求(一个应用实例只会发起一个长连接)。
- 接口服务对象为Apollo客户端
6.Admin Service
- 提供配置管理接口
- 提供配置修改、发布等接口
- 接口服务对象为Portal
7.Portal
提供Web界面供用户管理配置
通过Meta Server获取Admin Service服务列表(IP+Port),通过IP+Port访问服务
在Portal侧做load balance、错误重试
Apollo实战
Quick Start
1.下载JDK1.8+
2.部署Mysql
3.下载QuickStart示例代码
示例代码:百度网盘地址:提取码9wwe
4.创建表
执行apolloconfigdb.sql,apolloportaldb.sql即可创建ApolloPortalDB,创建ApolloConfigDB
5.启动配置中心
利用下载的代码,运行./demo.sh start 即可启动配置中心,输入localhost:8070打开Portal
6.编写Idea源码
@EnableApolloConfig
@Configuration
public class AppConfig {
@Bean
public TestJavaConfigBean javaConfigBean() {
return new TestJavaConfigBean();
}
}
public class TestJavaConfigBean {
@Value("${timeout:100}")
private int timeout;
private int batch;
@Value("${batch:200}")
public void setBatch(int batch) {
this.batch = batch;
}
public int getTimeout() {
return timeout;
}
public int getBatch() {
return batch;
}
}
public class ApolloUtil {
public void getAndListenChange() {
Config config = ConfigService.getAppConfig();
config.addChangeListener(
new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format(
"Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
change.getPropertyName(), change.getOldValue(),
change.getNewValue(), change.getChangeType()));
}
}
}
);
}
}
@RestController
public class TestController {
@Autowired
private TestJavaConfigBean testJavaConfigBean;
@RequestMapping("get")
public String get() {
int batch = testJavaConfigBean.getBatch();
int timeout = testJavaConfigBean.getTimeout();
Config config = ConfigService.getAppConfig();
// Config config2 = ConfigService.getConfig("");
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
System.out.println
("namespace变更:" + changeEvent.getNamespace() + "变更值:" + "set:" + changeEvent.changedKeys().toString());
}
});
Integer defaultRequestTimeout = 200;
Integer requestTimeout = config.getIntProperty("requestTimeout", defaultRequestTimeout);
return "batch:" + batch + ", timeout:" + timeout + "requestTimeout:" + requestTimeout;
}
}
ApolloUtill的设计
主要用于Apollo meta.server(实际就是ConfigServer的地址)的配置,Config的初始化,以及getProperty()方法的编写。
其它知识
OpenApi,分布式配置,metaserver路由选择。