apollo配置中心使用
- Apollo配置中心
- Apollo配置中心-简介
- apollo源码
- Apollo配置基本概念
- Apollo特性
- Apollo基础模型
- Apollo架构设计
- Apollo架构设计-实时推送设计
- Apollo架构设计-可用性
- Apollo架构设计-监控
- Apollo架构设计-扩展
- Apollo-本地部署
- 准备工作
- 安装步骤
- mysql命令行创建ApolloPortalDB
- mysql客户端创建ApolloPortalDB
- 创建ApolloConfigDB
- 配置数据库连接信息
- 启动Apollo配置中心
- docker安装
- mysql
- Apollo Config Service
- Apollo Admin Service
- Apollo Portal
- 登录测试
Apollo配置中心
Apollo配置中心-简介
Apollo(阿波罗)是由作者宋顺基于开源模式开发,他是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
更多产品介绍参见Apollo配置中心介绍
本地快速部署请参见Quick Start
演示环境(Demo):
http://81.68.181.139
账号/密码:apollo/admin
如访问GitHub速度缓慢,可以访问Gitee镜像,不定期同步
apollo源码
apollo官网源码:https://github.com/apolloconfig/apollo
快速安装指南:https://github.com/apolloconfig/apollo-quick-start
apollo gitee源码:https://gitee.com/apolloconfig/apollo
如访问GitHub速度缓慢,可以访问Gitee镜像,不定期同步
apollo使用文档:https://www.apolloconfig.com/#/zh/README
Apollo配置基本概念
配置是独立于程序的只读变量
配置首先是独立于程序的,同一份程序在不同的配置下会有不同的行为。
其次,配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置。
常见的配置有:DB Connection Str、Thread Pool Size、Buffer Size、Request Timeout、Feature Switch、Server Urls等。
配置伴随应用的整个生命周期: 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。
配置可以有多种加载方式: 配置也有很多种加载方式,常见的有程序内部hard code,配置文件,环境变量,启动参数,基于数据库等。
配置需要治理
权限控制:由于配置能改变程序的行为,不正确的配置甚至能引起灾难,所以对配置的修改必须有比较完善的权限控制
不同环境、集群配置管理:同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理
框架类组件配置管理:还有一类比较特殊的配置 - 框架类组件配置,比如CAT客户端的配置。虽然这类框架类组件是由其他团队开发、维护,但是运行时是在业务实际应用内的,所以本质上可以认为框架类组件也是应用的一部分。这类组件对应的配置也需要有比较完善的管理方式。
Apollo特性
正是基于配置的特殊性,所以Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:
统一管理不同环境、不同集群的配置: Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置;一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等;通过命名空间(namespace)可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖。
**配置修改实时生效(热发布): ** 用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。
**版本发布管理:**所有的配置发布都有版本概念,从而可以方便地支持配置的回滚。
**灰度发布:**支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
权限管理、发布审核、操作审计: 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误;所有的操作都有审计日志,可以方便地追踪问题。
客户端配置信息监控: 可以在界面上方便地看到配置在被哪些实例使用。
提供Java和.Net原生客户端: 提供了Java和.Net的原生客户端,方便应用集成;支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+);同时提供了Http接口,非Java和.Net应用也可以方便地使用。
提供开放平台API: Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等;对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制。
部署简单: 配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少;目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来;Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数。
Apollo基础模型
1.用户在配置中心对配置进行修改并发布
2.配置中心通知Apollo客户端有配置更新
3.Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
Apollo架构设计
4大核心模块:
Config Service:提供配置的读取、推送等功能,服务对象是Apollo客户端。
Admin Service:提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)。
Client:为应用获取配置,支持实时更新、通过MetaServer获取ConfigService的服务列表、使用客户端软负载SLB方式调用ConfigService,同时在Client侧会做load balance、错误重试(即通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务)。
Portal:配置管理界面、通过MetaServer获取AdminService的服务列表、使用客户端软负载SLB方式调用AdminService,同时在Portal侧会做load balance、错误重试(即通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务)。
3大辅助模块:
Eureka:用于服务发现和注册、Config/AdminService注册实例并定期报心跳、和ConfigService住在一起部署。
MetaServer:
封装Eureka的服务发现接口,相当于一个Eureka Proxy。
Portal通过域名访问MetaServer获取AdminService的地址列表。
Client通过域名访问MetaServer获取ConfigService的地址列表。
逻辑角色,和ConfigService住在一起部署。
NginxLB:
和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表。
和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表。
和域名系统配合,协助用户访问Portal进行配置管理。
为了简化部署,实际上把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中。
Apollo架构设计-实时推送设计
1、用户在Portal操作配置发布。
2、Portal调用Admin Service的接口操作发布。
3、Admin Service发布配置后,发送ReleaseMessage给各个Config Service。
4、Config Service收到ReleaseMessage后,通知对应的客户端。
Apollo架构设计-可用性
Apollo架构设计-监控
CAT: Apollo客户端和服务端目前支持CAT自动打点,所以如果自己公司内部部署了CAT的话,只要引入cat-client后Apollo就会自动启用CAT打点。如果不使用CAT的话,也不用担心,只要不引入cat-client,Apollo是不会启用CAT打点的。
Apollo也提供了Tracer相关的SPI,可以方便地对接自己公司的监控系统。
参考:https://github.com/apolloconfig/apollo/releases/tag/v0.4.0
SkyWalking: 可以参考@hepyu贡献的apollo-skywalking-pro样例。
Metrics: 从1.5.0版本开始,Apollo服务端支持通过/prometheus暴露prometheus格式的metrics,如http://${someIp:somePort}/prometheus
Apollo架构设计-扩展
1、Portal实现用户登录功能:参考文档
2、Portal接入邮件服务:参考文档
3、Portal 共享 session:参考文档
4、Portal启用webhook通知:参考文档
Apollo-本地部署
参考部署文档:https://github.com/apolloconfig/apollo-quick-start
参考官网本地部署,该部署以linux服务器为例介绍部署,如果需要再windows上执行部署,需要下载源码自行编译打包部署。
准备工作
1、jak 版本要求: 1.8+
2、mysql 版本要求:5.6.5+
3、下载Quick Start安装包:checkout或下载apollo-build-scripts项目。或者通过网盘链接下载,提取码: 9wwe,下载到本地后,在本地解压apollo-quick-start.zip。
安装步骤
1、创建数据库:Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
注意:以下介绍mysql 5.7通过命令行及客户端两种方式导入脚本文件。
mysql命令行创建ApolloPortalDB
下面以MySQL原生客户端为例:windows》mysql安装目录》选择 mysql 5.7command line client.
输入登录mysql数据库密码,查看数据: show databases ,如果已经存在,则备份数据库即可。
mysql命令行执行:source sql文件绝对路径, windows和linux同理。
windows机器命令行复制粘贴: 选中要复制的内容》右键( 即复制), 在需要粘贴的位置在右键(即粘贴)。
查看apolloportaldb是否已经创建成功。
使用库:use apolloportaldb
查看表: show tables;
导入成功后,可以通过执行以下sql语句来验证:
select Id
, AppId
, Name
from ApolloPortalDB.App;
以上表示sql文件执行成功。
mysql客户端创建ApolloPortalDB
通过各种MySQL客户端导入sql/apolloportaldb.sql即可。以下介绍navicat创建数据库并导入数据。
运行navicat,点击文件》新建数据库连接》mysql.
数据连接数据ip、端口、用户账号、密码,点击连接测试,提示连接成功,则表示数据库正常。
选中创建的连接》右键》选择新建数据库》
输入数据库名称 ApolloPortalDB、字符集为 utf8mb4、排序规则为 utf8mb4_general_ci
创建成功如下:
找到自己下载的apolloportaldb.sql 文件,注释或删除2行创建数据库命令。
选择刚创建的数据库 apolloportaldb》选择运行sql文件
选择修改后的 apolloportaldb.sql 文件,点击运行即可。
运行结果如下,日志中错误没有提示及日志内容提示successfully,表示sql文件执行成功。
选中apolloportaldb数据库》右键》关闭数据库,然后重新打开结果如下,表示sql文件执行成功。
创建ApolloConfigDB
同上创建《创建ApolloPortalDB》。
配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。
注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/apolloconfigdb?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/apolloportaldb?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)注意:数据库名大小写,可以通过命令设置不区分大小写。默认创建都是小写。
启动Apollo配置中心
1、 确保端口未被占用
Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
例如,在Linux/Mac下,可以通过如下命令检查:
lsof -i:8080
2、脚本执行启动脚本
sh demo.sh start
当看到如下输出后,就说明启动成功了!
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!
docker安装
Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub,可以按照如下步骤获取。
mysql
1、mysql安装
参考《docker安装mysql服务》
2、客户端连接测试
Apollo Config Service
1、获取镜像
docker pull apolloconfig/apollo-configservice:${version}
version:指定下载版本,可以不指定,默认下载最新版本latest
2、运行镜像
docker run -p 8080:8080 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.3.103:3306/apolloconfigdb?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
-dit -v /tmp/logs:/opt/logs --name apollo-configservice apolloconfig/apollo-configservice:latest
参数说明:
SPRING_DATASOURCE_URL: 对应环境ApolloConfigDB的地址
SPRING_DATASOURCE_USERNAME: 对应环境ApolloConfigDB的用户名
SPRING_DATASOURCE_PASSWORD: 对应环境ApolloConfigDB的密码
Apollo Admin Service
1、获取镜像
docker pull apolloconfig/apollo-adminservice:${version}
version:指定下载版本,可以不指定,默认下载最新版本latest
2、运行镜像
docker run -p 8090:8090 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.3.103:3306/apolloconfigdb?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
-dit -v /tmp/logs:/opt/logs --name apollo-adminservice apolloconfig/apollo-adminservice:latest
参数说明:
SPRING_DATASOURCE_URL: 对应环境ApolloConfigDB的地址
SPRING_DATASOURCE_USERNAME: 对应环境ApolloConfigDB的用户名
SPRING_DATASOURCE_PASSWORD: 对应环境ApolloConfigDB的密码
Apollo Portal
1、获取镜像
docker pull apolloconfig/apollo-portal
默认下载最新版本latest
2、运行镜像
docker run -p 8070:8070 \
-e SPRING_DATASOURCE_URL="jdbc:mysql://192.168.3.103:3306/apolloportaldb?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=123456 \
-e APOLLO_PORTAL_ENVS=dev \
-e DEV_META=http://192.168.3.103:8080 \
-dit -v /tmp/logs:/opt/logs --name apollo-portal apolloconfig/apollo-portal:latest
参数说明:
SPRING_DATASOURCE_URL: 对应环境ApolloPortalDB的地址
SPRING_DATASOURCE_USERNAME: 对应环境ApolloPortalDB的用户名
SPRING_DATASOURCE_PASSWORD: 对应环境ApolloPortalDB的密码
APOLLO_PORTAL_ENVS(可选): 对应ApolloPortalDB中的apollo.portal.envs配置项,如果没有在数据库中配置的话,可以通过此环境参数配置
DEV_META/PRO_META(可选): 配置对应环境的Meta Service地址,以${ENV}_META命名,需要注意的是如果配置了ApolloPortalDB中的apollo.portal.meta.servers配置,则以apollo.portal.meta.servers中的配置为准。
安装完成如下,3个服务全部启动成功。
登录测试
浏览器访问: http://192.168.3.103:8070/ ,登录账号/密码: apollo/admin
登录成功如下: