目录
  1. 1. 开源配置中心
  2. 2. 配置中心对比
    1. 2.1. 功能特性
    2. 2.2. 技术路线兼容性
    3. 2.3. 可用性与易用性
    4. 2.4. 最终选择
  3. 3. Apollo简介
  4. 4. Apollo编译适配自己的注册中心
SpringCloud架构--配置中心(Apollo)(第六篇上)

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
并且随着采用分布式的开发模式,项目之间的相互引用随着服务的不断增多,相互之间的调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。

开源配置中心

  1. spring-cloud/spring-cloud-config
    spring出品,可以和spring cloud无缝配合

  2. 淘宝diamond
    已经不维护

  3. disconf
    java开发,蚂蚁金服技术专家发起,业界使用广泛

  4. ctrip apollo
    Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,具备规范的权限、流程治理等特性。

配置中心对比

功能特性

我们先从功能层面来对比

功能点 优先级 spring-cloud-config ctrip apollo disconf 备注
静态配置管理 基于file 支持 支持
动态配置管理 支持 支持 支持
统一管理 无,需要github 支持 支持
多环境 无,需要github 支持 支持
本地配置缓存 支持 支持
配置锁 支持 不支持 不支持 不允许动态及远程更新
配置校验 如:ip地址校验,配置
配置生效时间 重启生效,或手动refresh生效 实时 实时 需要结合热加载管理, springcloudconfig需要 git webhook+rabbitmq 实时生效
配置更新推送 需要手工触发 支持 支持
配置定时拉取 支持 配置更新目前依赖事件驱动, client重启或者server端推送操作
用户权限管理 无,需要github 支持 支持 现阶段可以人工处理
授权、审核、审计 无,需要github 支持 现阶段可以人工处理
配置版本管理 Git做版本管理 界面上直接提供发布历史和回滚按钮 操作记录有落数据库,但无查询接口
配置合规检测 不支持 支持(但还需完善)
实例配置监控 需要结合springadmin 支持 支持,可以查看每个配置在哪些机器上加载
灰度发布 不支持 支持 不支持部分更新 现阶段可以人工处理
告警通知 不支持 支持,邮件方式告警 支持,邮件方式告警
依赖关系 不支持 不支持 不支持 配置与系统版本的依赖系统运行时的依赖关系

技术路线兼容性

引入配置中心,需要考虑和现有项目的兼容性,以及是否引入额外的第三方组件。我们的java项目以SpringBoot为主,需要重点关注springboot支持性。

功能点 优先级 spring-cloud-config ctrip apollo disconf 备注
SpringBoot支持 原生支持 支持 与spring boot无相关
SpringCloud支持 原生支持 支持 与spring cloud无相关
客户端支持 Java Java、.Net java
业务系统侵入性 侵入性弱 侵入性弱 侵入性弱,支持注解及xml方式
依赖组件 Eureka Eureka zookeeper

可用性与易用性

引入配置中心后,所有的应用都需要依赖配置中心,因此可用性需要重点关注,另外管理的易用性也需要关注。

功能点 优先级 spring-cloud-config ctrip apollo disconf 备注
单点故障(SPOF) 支持HA部署 支持HA部署 支持HA部署,高可用由zookeeper保证
多数据中心部署 支持 支持 支持
配置获取性能 unkown unkown(官方说比spring快)
配置界面 无,需要通过git操作 统一界面(ng编写) 统一界面

最终选择

  1. 支持不同环境(开发、测试、生产)、不同集群
  2. 完善的管理系统,权限管理、发布审核、操作审计
  3. SpringBoot集成友好 ,较小的迁移成本
  4. 配置修改实时生效(热发布)
  5. 版本发布管理

综上,ctrip applo是较好的选择方案,最终选择applo

Apollo简介

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring BootSpring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

具体参见git:https://github.com/ctripcorp/apollo

Apollo编译适配自己的注册中心

Apollo项目中内置了Eureka注册中心,如果我们想使用自己外部独立的注册中心,就要把Apollo项目中的Eureka剥离。

  1. 下载源代码,地址https://github.com/ctripcorp/apollo,下载后导入到编辑工具中。

  2. 导入数据库文件,数据库文件在源码srcripts/sql下,两个SQL文件,apolloconfigdb.sqlapolloportaldb.sql。MySQL版本需要在5.7以上。

  3. 修改源代码。

    1. apollo-configservice工程修改
      1) ConfigServiceApplication类的@EnableEurekaServer注解改成@EnableEurekaClient
      2) bootstrap.yml中的eureka.client.serviceUrl.defaultZone配置为独立的Eureka Server的地址

    2. apollo-adminservice工程修改
      bootstrap.yml中的eureka.client.serviceUrl.defaultZone配置为独立的Eureka Server的地址

    3. eureka-server工程修改
      1) 把apollo-configservice工程中com.ctrip.framework.apollo.metaservice下的相关类移到eureka-server工程下面,并解决相关的编译问题。
      2) pom.xml引入apollo-core依赖,如:

      1
      2
      3
      4
      5
      6
      7
      8
       <dependency>

          <groupId>com.ctrip.framework.apollo</groupId>

          <artifactId>apollo-core</artifactId>

          <version>RELEASE/version>
      </dependency>

      3) application.yml中的eureka.client.fetchRegistry要设为true
      4) 将apollo-portal模块下的apollo-env.propertiesdev.meta或其他环境地址修改为configservice对应地址

      1
      2
      3
      4
      5
      6
      7
      local.meta=http://localhost:8080
      dev.meta=http://localhost:8080
      fat.meta=http://localhost:8080
      uat.meta=http://localhost:8080
      lpt.meta=http://localhost:8080
      pro.meta=http://localhost:8080
      dev.meta=hhttp://localhost:8080

      5) 打包
      运行项目根目录scriptsbuild.batbuild.sh,执行maven打包命令,打好的jar包在相应模块target目录下。
      6) 修改数据库
      apolloconfigdb serverconfig表的eureka.service.urlvalue值改为自己的eureka服务地址,如http://localhost:8761/eureka/
      apolloportaldb serverconifg表的apollo.portal.envsvalue指改为第三步的对应的地址,如:dev,如果有多个环境用逗号分隔。
      7) 运行
      分别将Apollo-configserviceApollo-adminserviceApollo-Portal模块下target中的zip包拷贝出来,解压后,修改里面配置文件的信息application-github.propertiesapollo-env.properties,包括数据库连接信息、环境信息。如:

      1
      2
      3
      4
      # DataSource
      spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
      spring.datasource.username = root
      spring.datasource.password = root
      1
      2
      3
      4
      5
      6
      local.meta=http://localhost:8080
      dev.meta=http://localhost:8080
      fat.meta=http://localhost:8080
      uat.meta=http://localhost:8080
      lpt.meta=http://localhost:8080
      pro.meta=http://localhost:8080

      然后依次在configserviceadminserviceportal下的scripts目录中运行startup.sh。启动无误后,查看注册中心eureka

      说明已经注册到我们自己的eureka中。
      再次访问配置中心Apollo http://localhost:8070/,输入用户名密码apollo/admin,进入potrtal管理页面:

至此,配置中心服务端改造以及搭建基本完成,下一篇介绍配置中心客户端的使用,包括配置获取、配置同步、更新、以及配置管理等。

文章作者: 李浩
文章链接: https://leehoward.cn/2019/10/18/SpringCloud架构--配置中心(Apollo)(第六篇上)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 leehoward
打赏
  • 微信
  • 支付宝

评论