部署Apollo配置中心
Apollo是什么
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
Apollo整体架构如下图:

Apollo配置中心被分为portal,Config Service,Admin Service三个服务
-
Portal: 提供Apollo配置中心的管理界面,服务对象是开发人员 -
Config Service:提供配置的读取、推送等功能,服务对象是Apollo客户端,该服务包含Eureka,Config Service和Meta Server,他们在同一个JVM进程中。 -
Admin Service:提供配置的修改、发布等功能,服务对象是Apollo Portal管理界面
如果需要Apollo配置中心支持多个环境,Portal管理界面只需要部署一处,Config Service和Admin Service在每一个环境部署一次。
Github地址:https://github.com/apolloconfig/apollo
文档地址:https://www.apolloconfig.com/
环境与依赖
-
Apollo配置中心支持不同的环境,每个环境互相隔离。Apollo目前支持以下环境:DEV开发环境FAT测试环境,相当于alpha环境(功能测试)UAT集成环境,相当于beta环境(回归测试)PRO生产环境
-
要安装
Apollo配置中心需要以下:- 依赖
Java 1.8+MySQL 5.6.5+
- 下载
apollo - 数据库文件
- 依赖
IP端口配置
让Apollo配置中心支持两套环境,需要先规划配置Apollo服务的IP和端口:
Portal:127.0.0.1:8070Dev Config Service:127.0.0.1:8071Dev Admin Service:127.0.0.1:8072Fat Config Service:127.0.0.1:8073Fat Admin Service:127.0.0.1:8074
如果两个环境的数据库和准备部署Apollo的服务器不是同一个,可按需配置,配置方式也是相同的。
数据库配置
ApolloPortalDB
- 创建
ApolloPortalDB数据库 - 运行
apolloportaldb.sql - 配置
ServerConfig表中apollo.portal.envs的值,该值表示可支持的环境列表(例:DEV,FAT)
开发环境ApolloConfigDB
- 创建
ApolloConfigDB数据库dev环境 - 运行
apolloconfigdb.sql - 配置
ServerConfig表中eureka.service.url的值,该值就是Config Service的http://IP:Port地址(例:http://127.0.0.1:8071/eureka/)
测试环境ApolloConfigDB_Test
- 创建
ApolloConfigDB_Test数据库作为fat环境 - 运行
apolloconfigdb.sql - 配置
ServerConfig表中eureka.service.url的值,该值就是Config Service的http://IP:Port地址(例:http://127.0.0.1:8073/eureka/)
配置Portal
Portal作为管理界面,只需要部署一次即可。
Portal首次登陆的默认账号为apollo,密码为admin。
目录结构
解压apollo-portal-2.2.0-github.zip文件,将会得到以下结构目录:
- apollo-portal-2.2.0-github
- config
- apollo-env.properties
- application.properties
- application-github.properties
- scripts
- shutdown.sh
- startup.sh
- apollo-portal.conf
- apollo-portal.jar
- apollo-portal-2.2.0.jar
- apollo-portal-2.2.0-sources.jar
文件配置
apollo-portal.conf
配置
portal的日志文件存储位置
## pid目录
PID_FOLDER=.
## 日志目录
LOG_FOLDER=/data/apollo/logs/portal/
## 日志名称
LOG_FILENAME=apollo-portal.console.log
config/apollo-env.properties
配置
Portal支持的环境
#local.meta=http://localhost:8080
dev.meta=http://127.0.0.1:8071 ## 配置dev环境(Dev Config Service的IP端口)
fat.meta=http://127.0.0.1:8073 ## 配置fat环境(Fat Config Service的IP端口)
#uat.meta=http://fill-in-uat-meta-server:8080
#pro.meta=http://fill-in-pro-meta-server:8080
config/application-github.properties
配置
Portal使用的数据库信息
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_password
scripts/startup.sh
配置
Portal的启动设置
## 配置日志存放位置
LOG_DIR=/data/apollo/logs/portal
## 配置Portal端口
SERVER_PORT=${SERVER_PORT:=8070}
## 配置Portal启动时JAVA选项,一般不进行改动
export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
- 授权
赋予
scripts目录下的sh脚本可执行权限
chmod +x *.sh
配置Config Service
Config Service提供配置的读取、推送等功能,所以再不同的环境下,需要再次部署该服务。
目录结构
解压apollo-configservice-2.2.0-github文件,将会得到以下结构目录,可修改目录名称以支持不同的环境
- apollo-configservice-2.2.0-github(dev-configservice)
- config
- application.properties
- application-github.properties
- scripts
- shutdown.sh
- startup.sh
- apollo-configservice.conf
- apollo-configservice-2.2.0.jar
- apollo-configservice-2.2.0-sources.jar
文件配置
apollo-configservice.conf
配置
Config Service的日志文件存储位置
## pid目录
PID_FOLDER=.
## 日志目录
LOG_FOLDER=/data/apollo/logs/dev
## 日志名称
LOG_FILENAME=dev-apollo-configservice.console.log
config/application-github.properties
配置
Config Service使用的数据库信息
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_password
scripts/startup.sh
配置
Config Service的启动设置
## 配置日志存放位置
LOG_DIR=/data/apollo/logs/dev
## 配置Portal端口
SERVER_PORT=${SERVER_PORT:=8071}
## 配置Portal启动时JAVA选项,一般不进行改动
export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
- 授权
赋予
scripts目录下的sh脚本可执行权限
chmod +x *.sh
本地部署出现的问题
Apollo客户端和Portal会从Config Service获取服务的地址(IP+Port),然后通过服务地址直接访问。而从eureka服务发现的页面会发现,服务地址变成了公网IP,这可能会导致Apollo客户端无法连接上Config Service,所以需要修改startup.sh配置JAVA_OPTS。
## 可以直接找到JAVA_OPTS,在最末尾加上 -Deureka.instance.ip-address=127.0.0.1
JAVA_OPTS="$JAVA_OPTS -Deureka.instance.ip-address=127.0.0.1"
配置Admin Service
目录结构
解压apollo-adminservice-2.2.0-github文件,将会得到以下结构目录,可修改目录名称以支持不同的环境
- apollo-adminservice-2.2.0-github(dev-adminservice)
- config
- application.properties
- application-github.properties
- scripts
- shutdown.sh
- startup.sh
- apollo-adminservice.conf
- apollo-adminservice-2.2.0.jar
- apollo-adminservice-2.2.0-sources.jar
文件配置
apollo-adminservice.conf
配置
Admin Service的日志文件存储位置
## pid目录
PID_FOLDER=.
## 日志目录
LOG_FOLDER=/data/apollo/logs/dev
## 日志名称
LOG_FILENAME=dev-apollo-configservice.console.log
config/application-github.properties
配置
Admin Service使用的数据库信息
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = your_username
spring.datasource.password = your_password
scripts/startup.sh
配置
Admin Service的启动设置
## 配置日志存放位置
LOG_DIR=/data/apollo/logs/dev
## 配置Portal端口
SERVER_PORT=${SERVER_PORT:=8072}
## 配置Portal启动时JAVA选项,一般不进行改动
export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
- 授权
赋予
scripts目录下的sh脚本可执行权限
chmod +x *.sh
本地部署出现的问题
Apollo客户端和Portal会从Config Service获取服务的地址(IP+Port),然后通过服务地址直接访问。而从eureka服务发现的页面会发现,服务地址变成了公网IP,这可能会导致Apollo客户端无法连接上Config Service,所以需要修改startup.sh配置JAVA_OPTS。
## 可以直接找到JAVA_OPTS,在最末尾加上 -Deureka.instance.ip-address=127.0.0.1
JAVA_OPTS="$JAVA_OPTS -Deureka.instance.ip-address=127.0.0.1"
部署
Apollo三个服务都需要启动,所以编写脚本启动是比较好的方式。
启动脚本
#!/bin/sh
#description: start apollo
#开发环境
cd /data/apollo/dev-configservice/scripts
./startup.sh
cd /data/apollo/dev-adminservice/scripts
./startup.sh
#测试环境
cd /data/apollo/fat-configservice/scripts
./startup.sh
cd /data/apollo/fat-adminservice/scripts
./startup.sh
#portal
cd /data/apollo/portal/scripts
./startup.sh
停止脚本
#!/bin/sh
#description: stop apollo
#开发环境
cd /data/apollo/dev-configservice/scripts
./shutdown.sh
cd /data/apollo/dev-adminservice/scripts
./shutdown.sh
#测试环境
cd /data/apollo/fat-configservice/scripts
./shutdown.sh
cd /data/apollo/fat-adminservice/scripts
./shutdown.sh
#portal
cd /data/apollo/portal/scripts
./shutdown.sh
Systemd自启脚本
[Unit]
Description=auto run Apollo
After=network.target
[Service]
Type=simple
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/java/jdk1.8.0_281/bin"
User=root
ExecStart=/data/apollo/start.sh
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target