部署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:8070
Dev Config Service
:127.0.0.1:8071
Dev Admin Service
:127.0.0.1:8072
Fat Config Service
:127.0.0.1:8073
Fat 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