随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
并且随着采用分布式的开发模式,项目之间的相互引用随着服务的不断增多,相互之间的调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。
开源配置中心
spring-cloud
/spring-cloud-config
spring
出品,可以和spring cloud
无缝配合淘宝
diamond
已经不维护disconf
java开发,蚂蚁金服技术专家发起,业界使用广泛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编写) | 统一界面 |
最终选择
- 支持不同环境(开发、测试、生产)、不同集群
- 完善的管理系统,权限管理、发布审核、操作审计
SpringBoot
集成友好 ,较小的迁移成本- 配置修改实时生效(热发布)
- 版本发布管理
综上,ctrip applo
是较好的选择方案,最终选择applo
。
Apollo
简介
Apollo
(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot
和Spring Cloud
开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot
环境也有较好的支持。
具体参见git:https://github.com/ctripcorp/apollo
Apollo
编译适配自己的注册中心
Apollo
项目中内置了Eureka
注册中心,如果我们想使用自己外部独立的注册中心,就要把Apollo
项目中的Eureka
剥离。
下载源代码,地址https://github.com/ctripcorp/apollo,下载后导入到编辑工具中。
导入数据库文件,数据库文件在源码
srcripts/sql
下,两个SQL文件,apolloconfigdb.sql
和apolloportaldb.sql
。MySQL版本需要在5.7以上。修改源代码。
apollo-configservice
工程修改
1)ConfigServiceApplication
类的@EnableEurekaServer
注解改成@EnableEurekaClient
2)bootstrap.yml
中的eureka.client.serviceUrl.defaultZone
配置为独立的Eureka Server
的地址apollo-adminservice
工程修改bootstrap.yml
中的eureka.client.serviceUrl.defaultZone
配置为独立的Eureka Server
的地址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.properties
中dev.meta
或其他环境地址修改为configservice
对应地址1
2
3
4
5
6
7local.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:80805) 打包
运行项目根目录scripts
下build.bat
或build.sh
,执行maven
打包命令,打好的jar包在相应模块target目录下。
6) 修改数据库
将apolloconfigdb serverconfig
表的eureka.service.url
的value
值改为自己的eureka
服务地址,如http://localhost:8761/eureka/
将apolloportaldb serverconifg
表的apollo.portal.envs
的value
指改为第三步的对应的地址,如:dev
,如果有多个环境用逗号分隔。
7) 运行
分别将Apollo-configservice
、Apollo-adminservice
、Apollo-Portal
模块下target
中的zip包拷贝出来,解压后,修改里面配置文件的信息application-github.properties
、apollo-env.properties
,包括数据库连接信息、环境信息。如:1
2
3
4# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root1
2
3
4
5
6local.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然后依次在
configservice
、adminservice
、portal
下的scripts
目录中运行startup.sh
。启动无误后,查看注册中心eureka
:
说明已经注册到我们自己的eureka中。
再次访问配置中心Apollo
http://localhost:8070/,输入用户名密码apollo/admin
,进入potrtal
管理页面:
至此,配置中心服务端改造以及搭建基本完成,下一篇介绍配置中心客户端的使用,包括配置获取、配置同步、更新、以及配置管理等。