【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

  1. 初始化数据库,ApolloConfigDB和ApolloPortalDB,直接运行项目源码中\scripts\db\migration\configdb和\scripts\db\migration\portaldb下的sql脚本
    在这里插入图片描述

  2. 修改apollo-configservice,apollo-adminservice,apollo-portal项目中的数据库连接地址,使用其提供的脚本打包。当然我们也可以直接下载打包好的文件,下载地址:https://github.com/ctripcorp/apollo/releases
    在这里插入图片描述
    下载好之后,解压,分别修改每个目录文件夹中config文件夹下的application-github.properties的数据库连接地址。

  3. 修改环境配置,在Apollo中,支持LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS多环境,默认使用的DEV环境,所以,我们将\apollo-portal\config下的apollo-env.properties文件的local.meta和dev.meta都修改为本地环境,该地址为Eureka的配置地址。

  4. 依次启动config、admin和portal,执行对应script下的startup.sh脚本即可。Apollo使用Eureka注册服务,启动成功后,可查看Eureka服务状况,默认地址:http://localhost:8080,如果需要修改,可在数据库中自行修改.
    在这里插入图片描述

  5. 浏览器输入:http://localhost:8070 ,看到了Apollo的管理页面,使用用户apollo,密码admin登录

在这里插入图片描述
Apollo Client 使用

在搭建好Apollo Server后,便可以在我们的客户端集成。

  1. 创建项目cloud-apollo-config-client
    在这里插入图片描述
  2. 引入依赖
<dependency>
   <groupId>com.ctrip.framework.apollo</groupId>
   <artifactId>apollo-client</artifactId>
   <version>1.1.0</version>
</dependency>
  1. Apollo 管理页面新建应用并授权
    在这里插入图片描述
    在这里插入图片描述
  2. Apollo 新建并发布配置,后面在客户端代码中读取该配置信息
    在这里插入图片描述
  3. 应用配置application.properties
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
  1. @EnableApolloConfig获取配置信息
@Configuration
@EnableApolloConfig
public class ApolloConfig {

    @Value("${env}")
    private String env;

    public String getEnv() {
        return env;
    }

    public void setEnv(String env) {
        this.env = env;
    }
}
  1. 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

    四. 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要更好用一些,有独立的管理页面、实时发布、回滚等。

    最后,从书中看到了一个比较全面的分布式配置中心的对比总结,给大家分享一下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013034223/article/details/89707448
今日推荐