【Spring Cloud】集成Apollo分布式配置中心
【学习背景】
在上一篇博客中,学习并实践了Spring Cloud管理配置文件的组件Config,也用不同方式实现其刷新机制。而对于分布式配置中心,除了Spring Cloud Config,如Apollo、Disconf等,也都可以帮助我们实现分布式配置管理的功能。本篇博客就将实现Spring Cloud应用与Apollo分布式配置的集成。
【学习内容】
一. Apollo简要介绍
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有额外支持。
二. Apollo特征描述
- 统一管理不同环境、不同集群的配置
- 配置修改实时生效(热发布)
- 版本发布管理
- 灰度发布
- 权限管理、发布审核、操作审计
- 客户端配置信息监控
- 提供Java和.Net原生客户端
- 提供开放平台API
- 部署简单
三. 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 Client 使用
在搭建好Apollo Server后,便可以在我们的客户端集成。
- 创建项目cloud-apollo-config-client
引入依赖
com.ctrip.framework.apollo
apollo-client
1.1.0 Apollo 管理页面新建应用并授权
- Apollo 新建并发布配置,后面在客户端代码中读取该配置信息
应用配置application.properties
apollo.bootstrap.enabled = true
server.port=8989
spring.application.name=cloud-apollo-config-clientapollo server地址
apollo.meta=http://localhost:8080
apollo server的应用id
app.id=20190429
@EnableApolloConfig获取配置信息
@Configuration
@EnableApolloConfig
public class ApolloConfig {@Value("${env}")
private String env;
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
}
Controller获取该配置信息接口
@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][https_github.com_huzhiting_spring-cloud-config]
四. Apollo更新原理
通过上面的实例集成,可以知道Apollo配置的改变客户端是可以实时获取的,其中的原理就在于Apollo客户端和服务端保持了一个长连接,通过Http Long Polling实现的,从而能第一时间获得配置更新的推送,具体而言:
- 客户端发起一个Http请求到服务端
- 服务端会保持住这个连接30秒
- 如果在30秒内有客户端关心的配置变化,被保持住的客户端请求会立即返回,并告知客户端有配置变化的namespace信息,客户端会据此拉取对应namespace的最新配置
如果在30秒内没有客户端关心的配置变化,那么会返回Http状态码304给客户端
客户端在服务端请求返回后会自动重连考虑到会有数万客户端向服务端发起长连,在服务端我们使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
【学习总结】
在通过使用spring cloud config 和 apollo 实现分布式配置中心后,感觉确实是Apollo要更好用一些,有独立的管理页面、实时发布、回滚等。
最后,从书中看到了一个比较全面的分布式配置中心的对比总结,给大家分享一下:
还没有评论,来说两句吧...