准备工作
运行时环境
OS
服务端基于Spring Boot,启动脚本理论上支持所有Linux发行版,建议CentOS 7。
Java
- Apollo服务端:需要JDK1.8+
- Apollo客户端:需要JDK1.7+
由于需要同时运行服务端和客户端,所以建议安装Java 1.8+。使用java -version
可以查看当前系统安装的java版本。
MySql
- 版本要求:5.6.5+
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。
连接上MySQL后,可以通过如下命令检查:1
SHOW VARIABLES WHERE Variable_name = 'version';
我使用的是通过Docker安装的MySql 5.7.29。
环境
分布式部署需要事先确定部署的环境以及部署方式。
Apollo目前支持以下环境:
- DEV:开发环境
- FAT:测试环境,相当于alpha环境(功能测试)
- UAT:集成环境,相当于beta环境(回归测试)
- PRO:生产环境
下图是一个部署的示意图:
- Portal部署在生产环境的机房,通过它来直接管理FAT、UAT、PRO等环境的配置
- Meta Server、Config Service和Admin Service在每个环境都单独部署,使用独立的数据库
- Meta Server、Config Service和Admin Service在生产环境部署在两个机房,实现双活
- Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程内
在本文中,我们不做这么复杂的部署,ConfigService、AdminService和Portal都部署在同一个虚拟机上,且都作为DEV环境。
网络策略
分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。
Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。
需要注意的是,apollo-configservice和apollo-adminservice是基于内网可信网络设计的,所以出于安全考虑,请不要将apollo-configservice和apollo-adminservice直接暴露在公网。
部署步骤
部署步骤总体还是比较简单的,Apollo的唯一依赖是数据库,所以需要首先把数据库准备好,然后根据实际情况,选择不同的部署方式。
创建数据库
pollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
需要注意的是ApolloPortalDB只需要在生产环境部署一个即可,而ApolloConfigDB需要在每个环境部署一套,如fat、uat和pro分别部署3套ApolloConfigDB。(在本文中只部署dev一套)。
创建ApolloPortalDB
导入apolloportaldb.sqlSQL文件。
导入成功后,可以通过执行以下sql语句来验证:1
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
Id | Key | Value | Comment |
---|---|---|---|
1 | apollo.portal.envs | dev | 可支持的环境列表 |
创建ApolloConfigDB
导入apolloconfigdb.sqlSQL文件。
导入成功后,可以通过执行以下sql语句来验证:1
select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
Id | Key | Value | Comment |
---|---|---|---|
1 | eureka.service.url | http://127.0.0.1:8080/eureka/ | Eureka服务Url |
调整服务端配置
Apollo自身的一些配置是放在数据库里面的,所以需要针对实际情况做一些调整。
以下配置除了支持在数据库中配置以外,也支持通过-D参数、application.properties等配置,且-D参数、application.properties等优先级高于数据库中的配置
调整ApolloConfigDB配置
配置项统一存储在ApolloConfigDB.ServerConfig表中,需要注意每个环境的ApolloConfigDB.ServerConfig都需要单独配置,修改完一分钟实时生效。
1.eureka.service.url - Eureka服务Url
不管是apollo-configservice还是apollo-adminservice都需要向eureka服务注册,所以需要配置eureka服务地址。 按照目前的实现,apollo-configservice本身就是一个eureka服务,所以只需要填入apollo-configservice的地址即可,如有多个,用逗号分隔(注意不要忘了/eureka/后缀)。
需要注意的是每个环境只填入自己环境的eureka服务地址,比如FAT的apollo-configservice是1.1.1.1:8080和2.2.2.2:8080,那么在FAT环境的ApolloConfigDB.ServerConfig表中设置eureka.service.url为:1
http://1.1.1.1:8080/eureka/,http://2.2.2.2:8080/eureka/
2.namespace.lock.switch - 一次发布只能有一个人修改开关,用于发布审核
这是一个功能开关,如果配置为true的话,那么一次配置发布只能是一个人修改,另一个发布。
生产环境建议开启此选项
3.config-service.cache.enabled - 是否开启配置缓存
这是一个功能开关,如果配置为true的话,config service会缓存加载过的配置信息,从而加快后续配置获取性能。
默认为false,开启前请先评估总配置大小并调整config service内存配置。
开启缓存后必须确保应用中配置的app.id大小写正确,否则将获取不到正确的配置
4.item.key.length.limit - 配置项 key 最大长度限制
默认配置是128。
5.item.value.length.limit - 配置项 value 最大长度限制
默认配置是20000。
调整ApolloPortalDB配置
配置项统一存储在ApolloPortalDB.ServerConfig表中,也可以通过管理员工具 - 系统参数页面进行配置,无特殊说明则修改完一分钟实时生效。
1.apollo.portal.envs - 可支持的环境列表
默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感),如:1
DEV,FAT,UAT,PRO
修改完需要重启生效。
注1:一套Portal可以管理多个环境,但是每个环境都需要独立部署一套Config Service、Admin Service和ApolloConfigDB。
注2:只在数据库添加环境是不起作用的,还需要为apollo-portal添加新增环境对应的meta server地址。参考后面关于配置apollo-portal的配置。
2.apollo.portal.meta.servers - 各环境Meta Service列表
适用于1.6.0及以上版本
Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
样例如下:1
2
3
4
5
6{
"DEV":"http://1.1.1.1:8080",
"FAT":"http://apollo.fat.xxx.com",
"UAT":"http://apollo.uat.xxx.com",
"PRO":"http://apollo.xxx.com"
}
修改完需要重启生效。
注:该配置优先级高于其它方式设置的Meta Service地址。
3.organizations - 部门列表
Portal中新建的App都需要选择部门,所以需要在这里配置可选的部门信息,样例如下:1
[{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"}]
4.superAdmin - Portal超级管理员
超级管理员拥有所有权限,需要谨慎设置。
如果没有接入自己公司的SSO系统的话,可以先暂时使用默认值apollo(默认用户)。等接入后,修改为实际使用的账号,多个账号以英文逗号分隔(,)。
5.consumer.token.salt - consumer token salt
如果会使用开放平台API的话,可以设置一个token salt。如果不使用,可以忽略。
6.wiki.address
portal上“帮助”链接的地址,默认是Apollo github的wiki首页,可自行设置。
7.admin.createPrivateNamespace.switch
是否允许项目管理员创建private namespace。设置为true允许创建,设置为false则项目管理员在页面上看不到创建private namespace的选项。
8.emergencyPublish.supported.envs
配置允许紧急发布的环境列表,多个env以英文逗号分隔。
当config service开启一次发布只能有一个人修改开关(namespace.lock.switch
)后,一次配置发布只能是一个人修改,另一个发布。为了避免遇到紧急情况时(如非工作时间、节假日)无法发布配置,可以配置此项以允许某些环境可以操作紧急发布,即同一个人可以修改并发布配置。
9.configView.memberOnly.envs
只对项目成员显示配置信息的环境列表,多个env以英文逗号分隔。
对设定了只对项目成员显示配置信息的环境,只有该项目的管理员或拥有该namespace的编辑或发布权限的用户才能看到该私有namespace的配置信息和发布历史。公共namespace始终对所有用户可见。
从1.1.0版本开始支持
10.role.create-application.enabled - 是否开启创建项目权限控制
适用于1.5.0及以上版本
默认为false,所有用户都可以创建项目
如果设置为true,那么只有超级管理员和拥有创建项目权限的帐号可以创建项目,超级管理员可以通过管理员工具 - 系统权限管理给用户分配创建项目权限
11.role.manage-app-master.enabled - 是否开启项目管理员分配权限控制
适用于1.5.0及以上版本
默认为false,所有项目的管理员可以为项目添加/删除管理员
如果设置为true,那么只有超级管理员和拥有项目管理员分配权限的帐号可以为特定项目添加/删除管理员,超级管理员可以通过管理员工具 - 系统权限管理给用户分配特定项目的管理员分配权限
12.prefix.path - 设置Portal挂载到nginx/slb后的相对路径
适用于1.6.0及以上版本
如果希望在Portal前挂软负载,一般情况下建议直接使用根目录来挂载,不过如果有些情况希望和其它应用共用nginx/slb,需要加上相对路径,那么可以配置此项,如prefix.path=/apollo,更多信息可以参考Portal挂载到nginx/slb后如何设置相对路径?。
修改完需要重启生效。
虚拟机/物理机部署
1.获取安装包
Apollo服务端包括ConfigService、AdminService和Portal三个服务。
从GitHub Release页面下载最新版本的apollo-configservice-x.x.x-github.zip、apollo-adminservice-x.x.x-github.zip和apollo-portal-x.x.x-github.zip即可。
将下载下来的压缩包上传至服务器,并分别解压。
2.配置数据库连接信息
将apollo-configservice-x.x.x-github.zip、apollo-adminservice-x.x.x-github.zip和apollo-portal-x.x.x-github.zip解压后,在其项目的config目录下有一个application-github.properties
文件,在这个文件中配置正确的数据库地址、用户名和密码。1
2
3
4# DataSource
spring.datasource.url = jdbc:mysql://{mysql服务的ip}:3306/ApolloConfigDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = {用户名}
spring.datasource.password = {密码(如果没有密码,留空即可)}
3.配置apollo-portal的meta service信息
Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
打开apollo-portal-x.x.x-github.zip中config目录下的apollo-env.properties
文件。在这个文件中配置各个环境的ConifgService地址(在本文中我们只配置dev环境的)
注:对于1.6.0及以上版本,也可以通过ApolloPortalDB.ServerConfig表中的配置项来配置Meta Service地址
4.部署
部署apollo-configservice
在apollo-configservice-x.x.x-github.zip解压后的目录中,执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
注1:如果需要修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分。
注2:如要调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-configservice.conf中的LOG_DIR。
注3:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT。另外apollo-configservice同时承担meta server职责,如果要修改端口,注意要同时ApolloConfigDB.ServerConfig表中的eureka.service.url配置项以及apollo-portal和apollo-client中的使用到的meta server信息。
部署apollo-adminservice
在apollo-adminservice-x.x.x-github.zip解压后的目录中,执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
注1:如果需要修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分。
注2:如要调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-adminservice.conf中的LOG_DIR。
注3:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT。
部署apollo-portal
在apollo-portal-x.x.x-github.zip解压后的目录中,执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
注1:如果需要修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分。
注2:如要调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-portal.conf中的LOG_DIR。
注3:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT
5.登录apollo-portal的操作界面
上面的三个项目部署成功后(根据控制台打印的启动日志可以判断),在浏览器中打开http://{apollo-portal服务所在的ip}:8070/
,然后就可以登陆操作台了,默认的管理员帐户是apollo,密码为admin。
至此Apollo服务端就部署完成了。
Docker部署
具体参考官方文档Apollo的分布式部署指南。