随着项目的功能越来越复杂,各种各样的配置也越来越多,渐渐的开始面临以下问题:
各种配置到处都是,没有集中管理。
配置的存放方式也多种多样,如程序内部hard code、配置文件中、数据库中等等。
同一种配置,各处不统一。
配置修改后不能实时生效。
配置的修改没有完善的审核机制,想改就改等,出问题很难追溯。
基于此,就需要有一个完善的配置中心。Apollo便应用而生。
Apollo(阿波罗)是携程框架部门基于Spring Boot和Spring Cloud研发的配置中心,能集中化管理不同环境、不同集群、不同应用的配置,配置修改后能够实时推送到应用端,并且具有权限管理、流程控制、版本发布、灰度发布、一键回滚、集中审计日志等功能。
本文基于Apollo Wiki文档学习实践整理而成。
这里简单起见,只有两个环境:Pro(生产环境)、Dev(开发环境)。架构如下:
注意:
Portal部署在Pro生产环境,通过它来管理Pro、Dev环境的配置。
Meta Server、Config Service和Admin Service需要在每个环境的每个节点都部署。
Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程。基于目前的实现,启动Config Service进程就相当于也启动了Meta Server服务。
每个环境使用独立数据库。资源有限,这里数据库均是单节点。Mysql数据库最好在5.6.5+以上(Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本)。
此次部署省略了SLB部分,工作中用nginx等配置即可。
JDK最好在1.8以上。
由上图可以,节点规划如下:
节点 | 角色 |
---|---|
node1-Pro 环境 | apollo-adminservice进程、apollo-configservice进程、ApolloConfigDB库、apollo-portal进程 、ApolloPortalDB库 |
node2-Pro 环境 | apollo-adminservice进程、apollo-configservice进程、apollo-portal进程 |
node3-Dev 环境 | apollo-adminservice进程、apollo-configservice进程、ApolloConfigDB库、 |
node4-Dev 环境 | apollo-adminservice进程、apollo-configservice进程 |
第一步:下载
#下载apollo-configservice
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-configservice-1.3.0-github.zip
#下载apollo-adminservice
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-adminservice-1.3.0-github.zip
#下载apollo-portal
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/releases/download/v1.3.0/apollo-portal-1.3.0-github.zip
第二步: 解压
#解压apollo-configservice
[root@node1 /data/software]# unzip apollo-configservice-1.3.0-github.zip -d apollo-configservice
#解压apollo-adminservice
[root@node1 /data/software]# unzip apollo-adminservice-1.3.0-github.zip -d apollo-adminservice
#解压apollo-portal
[root@node1 /data/software]# unzip apollo-portal-1.3.0-github.zip -d apollo-portal
第三步: 分发
#将apollo-configservice拷贝至node2、node3、node4
[root@node1 /data/software]# scp -r apollo-configservice root@node2:/data/software/
[root@node1 /data/software]# scp -r apollo-configservice root@node3:/data/software/
[root@node1 /data/software]# scp -r apollo-configservice root@node4:/data/software/
#将apollo-adminservice拷贝至node2、node3、node4
[root@node1 /data/software]# scp -r apollo-adminservice root@node2:/data/software/
[root@node1 /data/software]# scp -r apollo-adminservice root@node3:/data/software/
[root@node1 /data/software]# scp -r apollo-adminservice root@node4:/data/software/
#将apollo-portal拷贝至node2
[root@node1 /data/software]# scp -r apollo-portal root@node2:/data/software/
源码中包含所需的建库sql语句。
#下载apollo源码
[root@node1 /data/software]# wget https://github.com/ctripcorp/apollo/archive/v1.3.0.tar.gz
#解压源码
[root@node1 /data/software]# tar -zxvf v1.3.0.tar.gz
#分发源码至node3节点
[root@node1 /data/software]# scp -r apollo-1.3.0 root@node3:/data/software/
#创建ApolloPortalDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/portaldb/V1.0.0__initialization.sql
#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
+----+--------------------+-------+--------------------------+
| Id | Key | Value | Comment |
+----+--------------------+-------+--------------------------+
| 1 | apollo.portal.envs | dev | 可支持的环境列表 |
+----+--------------------+-------+--------------------------+
#创建ApolloConfigDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql
#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
+----+--------------------+-------------------------------+------------------------------------------------------+
| Id | Key | Value | Comment |
+----+--------------------+-------------------------------+------------------------------------------------------+
| 1 | eureka.service.url | http://localhost:8080/eureka/ | Eureka服务Url,多个service以英文逗号分隔 |
+----+--------------------+-------------------------------+------------------------------------------------------+
#创建ApolloConfigDB
mysql> source /data/software/apollo-1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql
#验证
mysql> select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
+----+--------------------+-------------------------------+------------------------------------------------------+
| Id | Key | Value | Comment |
+----+--------------------+-------------------------------+------------------------------------------------------+
| 1 | eureka.service.url | http://localhost:8080/eureka/ | Eureka服务Url,多个service以英文逗号分隔 |
+----+--------------------+-------------------------------+------------------------------------------------------+
注意:要确保有对应数据库的权限。否则,启动时会有权限异常的问题。
#node1、node2的apollo-configservice 配置如下
[root@node1 ~]# vim /data/software/apollo-configservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd
#node3、node4的apollo-configservice 配置如下
[root@node3 /data/software]# vim /data/software/apollo-configservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node3:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd
#node1、node2的apollo-adminservice 配置如下
[root@node1 ~]# vim /data/software/apollo-adminservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd
#node3、node4的apollo-adminservice 配置如下
[root@node3 ~]# vim /data/software/apollo-adminservice/config/application-github.properties
spring.datasource.url = jdbc:mysql://node3:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd
#node1、node2的apollo-portal 配置如下
[root@node1 ~]# vim /data/software/apollo-portal/config/application-github.properties
spring.datasource.url = jdbc:mysql://node1:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_passwd
Apollo Portal需要访问不同环境下的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。
注意:默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
# node1、node2的apollo-portal meta service信息配置如下。
[root@node1 ~]# vim /data/software/apollo-portal/config/apollo-env.properties
dev.meta=http://node3:8080,http://node4:8080
pro.meta=http://node1:8080,http://node2:8080
默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感)。
mysql> update ApolloPortalDB.ServerConfig set Value="dev,pro" where `key`='apollo.portal.envs';
Portal中新建Application都需要选择部门,所以需要在这里配置可选的部门信息,默认如下:
[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
mysql> update ApolloPortalDB.ServerConfig set Value='[{"orgId":"bigdata","orgName":"大数据部门"}]' where `key`='organizations';
apollo-configservice、apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。
按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(不要忘了/eureka/后缀)。
注意:每个环境只填入自己环境的eureka服务地址。
#Pro环境
mysql> update ApolloConfigDB.ServerConfig set Value='http://node1:8080/eureka/,http://node2:8080/eureka/' where `key`='eureka.service.url';
#Dev环境
update ApolloConfigDB.ServerConfig set Value='http://node3:8080/eureka/,http://node4:8080/eureka/' where `key`='eureka.service.url';
启动apollo-configservice
[root@node1 /data/software]# apollo-configservice/scripts/startup.sh
[root@node2 /data/software]# apollo-configservice/scripts/startup.sh
[root@node3 /data/software]# apollo-configservice/scripts/startup.sh
[root@node4 /data/software]# apollo-configservice/scripts/startup.sh
启动apollo-adminservice
[root@node1 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node2 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node3 /data/software]# apollo-adminservice/scripts/startup.sh
[root@node4 /data/software]# apollo-adminservice/scripts/startup.sh
启动apollo-portal
[root@node1 /data/software]# apollo-portal/scripts/startup.sh
[root@node2 /data/software]# apollo-portal/scripts/startup.sh
查看任意一台Apollo Portal WebUI,如这里http://node2:8070
,默认用户名密码apollo:admin
,即可看到如下界面:
查看管理员工具=>系统信息
即可看到各环境下的Config Services
和Admin Services
。
手动挂掉某一节点后,服务正常。
通过首页=>创建项目=>创建如下项目。
注意:一个项目下可以有多个Namespace,一个Namespace就相当于某一个配置文件。
通过首页=>点击test_apollo
=>添加Namespace来创建如下Namespace,并添加Namespace的修改和发布权限。
创建Namespace后即可添加配置,然后发布即可。
注意:
发布时需要在两个环境都发布,才会在两个环境都生效。
生产中可以先发布到Dev环境,没问题后,再发布到Pro环境。
URL: {config_server_url}/configs/{appId}/{clusterName}/{namespaceName}?releaseKey={releaseKey}&ip={clientIp}
[wangpei@localhost ~]$ curl -s 'http://node2:8080/configs/test_apollo/default/bigdata.public_config?ip=192.168.99.228'|jq
{
"appId": "test_apollo",
"cluster": "default",
"namespaceName": "bigdata.public_config",
"configurations": {
"kafka.brokers": "kafkaNode1:9092,kafkaNode2:9092,kafkaNode3:9092",
"kibana.url": "http://kibanaNode:5601"
},
"releaseKey": "20190303010149-7fee7b8c0c72f5a1"
}
2.获取Dev环境配置
[wangpei@localhost ~]$ curl -s 'http://node4:8080/configs/test_apollo/default/bigdata.public_config?ip=192.168.99.228'|jq
{
"appId": "test_apollo",
"cluster": "default",
"namespaceName": "bigdata.public_config",
"configurations": {
"kafka.brokers": "kafkaNode1:9092,kafkaNode2:9092,kafkaNode3:9092",
"kibana.url": "http://kibanaNode:5601"
},
"releaseKey": "20190303005628-7fee76237a673284"
}
手动挂掉某一节点后,查询等正常。