【学习背景】
在上一篇博客中,学习并实践了Spring Cloud管理配置文件的组件Config,也用不同方式实现其刷新机制。而对于分布式配置中心,除了Spring Cloud Config,如Apollo、Disconf等,也都可以帮助我们实现分布式配置管理的功能。本篇博客就将实现Spring Cloud应用与Apollo分布式配置的集成。
【学习内容】
一. Apollo简要介绍
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有额外支持。
二. Apollo特征描述
三. Apollo集成步骤
Apollo Server 配置
下载Apollo源码,地址:https://github.com/ctripcorp/apollo
初始化数据库,ApolloConfigDB和ApolloPortalDB,直接运行项目源码中\scripts\db\migration\configdb和\scripts\db\migration\portaldb下的sql脚本
修改apollo-configservice,apollo-adminservice,apollo-portal项目中的数据库连接地址,使用其提供的脚本打包。当然我们也可以直接下载打包好的文件,下载地址:https://github.com/ctripcorp/apollo/releases
下载好之后,解压,分别修改每个目录文件夹中config文件夹下的application-github.properties的数据库连接地址。
修改环境配置,在Apollo中,支持LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS多环境,默认使用的DEV环境,所以,我们将\apollo-portal\config下的apollo-env.properties文件的local.meta和dev.meta都修改为本地环境,该地址为Eureka的配置地址。
依次启动config、admin和portal,执行对应script下的startup.sh脚本即可。Apollo使用Eureka注册服务,启动成功后,可查看Eureka服务状况,默认地址:http://localhost:8080,如果需要修改,可在数据库中自行修改.
浏览器输入:http://localhost:8070 ,看到了Apollo的管理页面,使用用户apollo,密码admin登录
在搭建好Apollo Server后,便可以在我们的客户端集成。
com.ctrip.framework.apollo
apollo-client
1.1.0
apollo.bootstrap.enabled = true
server.port=8989
spring.application.name=cloud-apollo-config-client
### apollo server地址
apollo.meta=http://localhost:8080
### apollo server的应用id
app.id=20190429
@Configuration
@EnableApolloConfig
public class ApolloConfig {
@Value("${env}")
private String env;
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
}
@RestController
public class ConfigController {
@Resource
private ApolloConfig apolloConfig;
@RequestMapping("getConfig")
public String getConfig(){
return apolloConfig.getEnv();
}
}
通过以上Server和Client配置,我们就可以在客户端实时获取到服务端对应的配置信息。
Apollo 集成代码地址
以上客户端配置代码已上传github,地址:https://github.com/huzhiting/spring-cloud-config
四. Apollo更新原理
通过上面的实例集成,可以知道Apollo配置的改变客户端是可以实时获取的,其中的原理就在于Apollo客户端和服务端保持了一个长连接,通过Http Long Polling实现的,从而能第一时间获得配置更新的推送,具体而言:
考虑到会有数万客户端向服务端发起长连,在服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
【学习总结】
在通过使用spring cloud config 和 apollo 实现分布式配置中心后,感觉确实是Apollo要更好用一些,有独立的管理页面、实时发布、回滚等。