Apollo分布式配置中心-轻松入门,快速上手
1.1什么是配置?
应用程序中的系统参数,比如:数据库连接参数、启动参数等。
应用程序在启动和运行的时候会读取一些配置信息,像properties、yml、yaml文件名称结尾配置信息等。
配置的几个特点:
-
配置是独立于程序的只读变量
① 配置首先是独立于程序的,同一份程序在不同的配置下会有不同的行为。
② 配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置。
-
配置伴随应用的整个生命周期
① 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
- 配置可以有多种加载方式
① 常见的有程序内部硬编码、配置文件、环境变量、启动参数、基于数据库等。
-
配置需要治理
① 权限控制:由于配置能改变程序的行为,不正确的配置甚至能引起灾难,所以对配置的修改必须有比较完善的权限控制。
② 不同环境、集群配置管理:同一份程序在不同的环境(开发、测试、生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理。
1.2什么是配置中心?
配置中心就是把配置集中起来进行管理。
单体应用:一个应用一份配置文件。
分布式:特点共享性,配置文件集中管理。
2Apollo简介
2.1Apollo的简介
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、 不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特 性,适用于微服务配置管理场景。
官方地址:https://github.com/ctripcorp/apollo
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot 环境也有较好的支持。
2.2Apollo的特性
基于配置的特殊性,Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:
1.统一管理不同环境、不同集群的配置
① Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
② 同一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等。
③ 通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖。
2.配置修改实时生效(热发布)
用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。
3.版本发布管理所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。
4.灰度发布① 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
5.权限管理、发布审核、操作审计① 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
② 所有的操作都有审计日志,可以方便的追踪问题。
6.客户端配置信息监控① 可以在界面上方便的看到配置在被哪些实例使用。
7.提供Java和.Net原生客户端① 提供了Java和.Net的原生客户端,方便应用集成。
② 支持Spring Placeholder,Annotation和SpringBoot的ConfigurationProperties,方便应用使用(需要Spring3.1.1+)。
③ 同时提供了http接口,非Java和.Net应用也可以方便的使用。
8.提供开放平台API① Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验。如数据库用户名、密码、Redis服务地址等。
② 对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制。
3Apollo快速入门
3.1执行流程
操作流程如下:
1.用户在Apollo配置中心上的管理界面上添加或修改配置信息,比如数据库的连接参数等等。
2.应用程序通过Apollo的客户端连接Apollo的配置中心(Apollo服务端)来拉取信息给应用程序使用。
用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:一种是Apollo配置中心会向客户端推送最新的配置;另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置,通过以上两种机制共同来保证应用程序能及时获取到配置。
3.2安装Apollo
运行时环境
Java:Apollo服务端:1.8+
Apollo客户端:1.7+
MySQL:5.6.5+
MySQL下载路径:https://downloads.mysql.com/archives/community/
下载配置
下载路径:https://github.com/apolloconfig/apollo/tags
选择下载版本:apollo-adminservice-2.0.1-github.zip 、apollo-configservice-2.0.1-github.zip 、apollo-portal-2.0.1-github.zip
解压后将Apollo-configservice-版本号.jar,Apollo-adminservice-版本号.jar,Apollo-portal-版本号.jar放到Apollo目录下。
创建数据库
Apollo服务端需要两个数据库:ApolloPortalDB(生产部署一个)和ApolloConfigDB(每个环境部署一套)。
创建ApolloPortalDB脚本
下载路径:
https://github.com/apolloconfig/apollo-quick-start/blob/master/sql/apolloconfigdb.sql
执行命令:
source 路径/apolloconfigdb.sql
校验语句:
select id,`key`,`value`,`comment` from ApolloPortalDB.serverconfig limit 1;
创建ApolloConfigDB脚本
下载路径:
https://github.com/apolloconfig/apollo-quick-start/blob/master/sql/apolloportaldb.sql
执行命令:
source 路径/apolloportaldb.sql
校验语句:
select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
启动Apollo
Apollo默认端口:8070,8080,8090端口(保证当前环境端口不被占用)
启动Apollo-configService,修改默认端口-Dserver.port=8080
执行脚本
java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf-8&serverTimezone=Asia/Shanghai -Dspring.datasource.username=root -Dspring.datasource.password=root -Dsever.port=8080 -jar apollo-configservice-2.0.1.jar
启动Apollo-adminService,修改默认端口-Dserver.port=8090
执行脚本
java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf-8&serverTimezone=Asia/Shanghai -Dspring.datasource.username=root -Dspring.datasource.password=root -Dsever.port=8090 -jar apollo-adminservice-2.0.1.jar
启动Apollo-portalService,修改默认端口-Dserver.port=8070
执行脚本
java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloPortalDB?serverTimezone=Asia/Shanghai -Dspring.datasource.username=root -Dspring.datasource.password=root -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dsever.port=8070 -jar apollo-portalservice-2.0.1.jar
tip:注意-Ddev_meta=http://localhost:8080/这里指定的是Eureka注册中心的地址和端口
附上bat的window服务器的启动脚本
echo
set url="localhost:3306"
set username="root"
set password="root"
start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url="jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-2.0.1.jar
start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url="jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-2.0.1.jar
start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url="jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-2.0.1.jar
3.3编写测试类读取配置
发布配置
进入Apollo-portal,操作流程
创建应用-> 选择部门-> AppId-> 应用名称-> 应用负责人-> 应用管理员
我的应用-> 新增配置-> 填写key-> 填写value-> 填写comment-> 选择集群
发布配置-> 填写comment-> 发布
应用读取配置
编写获取配置测试类
public class GetConfigTest {
public static void main(String[] args) {
//读取默认的namespace
Config appConfig = ConfigService.getAppConfig();
//获取配置信息,参数为key,默认值
String someKey= "sms.enable";
String value = appConfig.getProperty(someKey, null);
System.out.println("sms.enable:"+value);
}
}
添加VM options配置
-Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
-Dapp.id:唯一标识 -Denv:环境 -Ddev_meta:config-service服务的地址
热发布-修改配置
public class GetConfigTest {
public static void main(String[] args) throws InterruptedException {
Config appConfig = ConfigService.getAppConfig();
//获取配置信息,参数为key,默认值
String someKey= "sms.enable";
while (true){
String value = appConfig.getProperty(someKey, null);
System.out.println("sms.enable:"+value);
Thread.sleep(2000L);
}
}
}
控制台输出
sms.enable:true
sms.enable:false
4 Apollo应用
4.1Apollo工作原理
各模块职责
-
Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
-
Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
-
Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的
-
Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
-
在Eureka之上架了一层Meta Server用于封装Eureka的服务发现接口
-
Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
-
Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
-
为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中
分步执行流程:
-
Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。
-
Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server
-
Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
-
Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
-
获取到正确的Config Service和Admin Service的服务信息后,Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能
4.2核心概念
application (应用)
这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
关键字:appId
environment (环境)
配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
关键字:env
cluster (集群)
一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
关键字:cluster
namespace
一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
关键字:namespaces
图解:
4.3应用管理
添加部门
管理员工具-> 系统参数-> 搜索key为organizations-> 添加多一个json格式的数据
{"orgId":"TEST1","orgName":"样例部门1"}
添加用户
管理员工具-> 用户管理-> 添加(用户登录账号、用户名称、密码、邮箱)
授权-> 修改权、发布权
删除应用
管理员工具-> 删除应用、集群、AppNamespace
4.4配置管理
新增配置-> 添加key-> 添加value-> 发布
修改配置-> 修改-> 发布
删除配置-> 删除-> 发布
添加Namespace-> 选择创建-> 类型-> 名称类型-> 备注-> 提交-> 修改权限-> 发布权限
代码读取指定namespace
Config config = ConfigService.getConfig("namespace名称");
4.5多应用配置
添加公共配置
创建应用-> 添加namespace-> 名称-> 类型公共
添加Namespace-> 选择关联公共
个性化-> 修改-> 覆盖(会成为该项目私有)
4.6集群管理
添加集群-> 集群名字-> 环境 (环境列表展示DEV和各集群名字)
需要公共的namespace需要手动再关联一下
需要某个项目信息配置的,需要手动同步一下(先选择namespace-> 再选择集群-> 同步-> 在发布)
个性化-> 修改-> 覆盖(会成为该项目私有)
代码读取指定集群
-Dapollo.cluster=集群名字
-Dapp.id=apollo-quickstart -Denv=DEV -Dapollo.cluster=集群名字 -Ddev_meta=http://localhost:8080
4.7配置发布原理
图解:
上图简要描述了配置发布的主要过程:
用户在Portal操作配置发布
Portal调用Admin Service的接口操作发布
Admin Service发布配置后,发送ReleaseMessage给各个Config Service
Config Service收到ReleaseMessage后,通知对应的客户端
图解NotifificationControllerV2得到配置发布的AppId+Cluster+Namespace后通知客户端
tip:定时拉取频率5分钟一次
5Apollo应用于分布式系统
5.1项目应用场景
用作微服务的配置中心
5.2SpringBoot应用集成Apollo
添加maven坐标
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.0.1</version>
</dependency>
配置应用
在配置文件(application.properties或者application.yml)中添加Apollo的配置信息
app.id = 应用id
apollo.bootstrap.enable = true
apollo.bootstrap.namespace = namespace名字,namespace名字
配置环境
创建apollo-env.properties文件
dev.meta=http://localhost:8080
配置集群
配置到启动脚本
-Dapollo.cluster=集群名字
tip:本地缓存 -Dapollo.cacheDir=/opt/data/apollo-config
完整配置
-Denv=DEV -Dapollo.cacheDir=/opt/data/apollo-config -Dapollo.cluster=default
必须配置链接数据库!!
5.3生产环境部署
共部署三套环境
Apollo-configservice:生产pro、仿真uat、开发dev 各部署一套
Apollo-adminservice:生产pro、仿真uat、开发dev 各部署一套
Apollo-portal:只部署一套
图解:
配置启动参数-> 修改eureka地址-> 调整ApolloPortal服务配置-> 修改apollo-env.properties文件-> 修改VM options配置-> 启动ApolloPortal 验证配置
tip:
修改eureka地址
use ApolloConfigDBPRO;
update ServerConfig set `vaule` = "http://localhost:8081/eureka/" where `key` = "eureka.service.url";
Apollo-configservice和Apollo-adminservice启动脚本
echo
set url="localhost:3306"
set username="root"
set password="root"
start "configService" java -Dserver.port=8081 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url="jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-2.0.1.jar
start "adminService" java -Dserver.port=8091 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url="jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-2.0.1.jar
Apollo-portal启动脚本
echo
set url="localhost:3306"
set username="root"
set password="root"
start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Ddev_meta=http://localhost:8081/ -Dserver.port=8070 -Dspring.datasource.url="jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai" -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-2.0.1.jar
修改apollo-env.properties文件
dev.meta=http://localhost:8080
pro.meta=http://localhost:8081
修改VM options配置
-Denv=PRO
5.4灰度发布
灰度发布 定义
灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用 产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁 移到B上面来。
Apollo实现的功能
-
对于一些对程序有比较大影响的配置,可以先在一个或者多个实例生效,观察一段时间没问题后再全量发布 配置。
-
对于一些需要调优的配置参数,可以通过灰度发布功能来实现A/B测试。可以在不同的机器上应用不同的配 置,不断调整、测评一段时间后找出较优的配置再全量发布配置
操作流程
添加多个实例链接Apollo-> 创建灰度-> 选择灰度版本->(修改配置)-> 新增灰度规则-> 选择灰度实例的ip-> 发布
灰度版本里面-> 全量发布
笔者: 沙漏倒装回忆1024
出处:https://www.cnblogs.com/lpan1024/
版权所有,欢迎保留原文链接进行转载!
请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。
版权所有,转载请注明原文链接: https://www.cnblogs.com/lpan1024/p/16634350.html
请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。