Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
这里是官方介绍: https://github.com/ctripcorp/apollo/wiki
项目的demo放在git地址: https://github.com/475cheng/apollo-demo-cheng
以下是个人在实践中的一些理解
一、Apollo 服务端
Apollo服务端需要启动3个进程
1. Apollo Config Service(提供配置获取接口、提供配置推送接口、服务于Apollo客户端)
进程中包含两个字模块
1. Eureka
基于Eureka和Spring Cloud Netflix提供服务注册和发现,Config Service和Admin Service会向Eureka注册服务,并保持心跳
2. 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
2. Apollo Admin Service(提供配置管理接口、提供配置修改发布接口、服务于管理界面Portal)
3. Apollo-Portal(配置管理界面、通过Meta Server获取Admin Service的服务列表、使用客户端软负载SLB方式调用AdminService)
二、Apollo 客户端
Apollo Clinet(通过访问Meta Server获取Config Service服务列表)而后直接通过IP+Port访问服务
官方准备好了服务端的启动包,包含了上面的3个进程,可以一个命令直接启动 服务端部署详情请查看官方文档https://github.com/ctripcorp/apollo/wiki/Quick-Start#%E4%B8%89%E5%90%AF%E5%8A%A8apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83
在部署完Apollo 服务端之后,就是把apollo client客户端 与项目集成了,这里以springboot为例
* 引入pom.xml
```xml
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
```
* 配置文件application.properties
```application.properties
#应用名
app.id=SampleApp
#Apollo Config Service地址 可以选择环境dev or pro
apollo.meta=http://localhost:8080
#开启集成apollo ApolloAutoConfiguration类上的注解
apollo.bootstrap.enabled = true
#配置文件的命名空间 默认是application.properties,多个逗号隔开 如果引入多个namespace的key相同,配置在前面的namespace生效。
apollo.bootstrap.namespaces = application,cheng
#如果指定集群名称 启动时java -jar a.jar -Dapollo.cluster=cluster
```
图解如下:
* 获取Apollo中的配置如下 或者通过@Value("${redis.cache.clusterNodes}")方式获取配置信息,如果实体中是@Value可以实时改变.
```java
@ConfigurationProperties(prefix = "redis.cache") //配置文件前缀
@Component("sampleRedisConfig") //bean的name
@RefreshScope //动态更新
public class SampleRedisConfig {
private int expireSeconds;
private String clusterNodes;
private int commandTimeout;
//set get
}
```
* **更新配置文件**
* 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送
* 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置,可以适当调长,运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟
注意:配置中心能保证的是配置推送到应用程序,对于一些需要初始化的场景(比如数据库连接、redis连接、zk连接等),是需要额外的逻辑来实现热切换的
如果想热切换有2种方式
第一种是调用 post请求调用http://localhost:3005/refresh 接口
第二种是下面这种方式
```controller
@Autowired
private SampleRedisConfig sampleRedisConfig;
@Autowired
private RefreshScope refreshScope;
public void test(){
refreshScope.refresh("sampleRedisConfig");//刷新SampleRedisConfig这个类的最新配置
}
```
灰度发布:灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度发布界面操作