Apollo分布式配置中心-轻松入门,快速上手

1基本概念

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.zipapollo-configservice-2.0.1-github.zipapollo-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进程中

分步执行流程:

  1. Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。

  2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server

  3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client

  4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试

  5. 获取到正确的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实现的功能

  1. 对于一些对程序有比较大影响的配置,可以先在一个或者多个实例生效,观察一段时间没问题后再全量发布 配置。

  2. 对于一些需要调优的配置参数,可以通过灰度发布功能来实现A/B测试。可以在不同的机器上应用不同的配 置,不断调整、测评一段时间后找出较优的配置再全量发布配置

     

操作流程

添加多个实例链接Apollo-> 创建灰度-> 选择灰度版本->(修改配置)-> 新增灰度规则-> 选择灰度实例的ip-> 发布

灰度版本里面-> 全量发布

 

笔者: 沙漏倒装回忆1024

出处https://www.cnblogs.com/lpan1024/

版权所有,欢迎保留原文链接进行转载!

请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。

posted @ 2022-08-28 23:06  沙漏倒装回忆1024  阅读(122)  评论(0编辑  收藏  举报