apollo部署
本文档介绍了如何按照分布式部署的方式编译、打包、部署Apollo配置中心,从而可以在开发、测试、生产等环境分别部署运行。
一、准备工作
1.1 运行时环境
1.1.1 OS
服务端基于Spring Boot,启动脚本理论上支持所有Linux发行版,建议CentOS 7
1.1.2 Java
- Apollo服务端:1.8+
- Apollo客户端:1.7+
由于需要同时运行服务端和客户端,所以建议安装Java 1.8+。
对于Apollo客户端,运行时环境只需要1.7+即可。
注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6
在配置好后,可以通过如下命令检查:
java -version
样例输出:
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
1.2 Mysql
- 版本要求:5.6.5+
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。
连接上MySQL后,可以通过如下命令检查:
SHOW VARIABLES WHERE Variable_name = 'version';点击复制错误复制成功
Variable_name | Value |
version | 5.7.11 |
1.3 环境
分布式部署需要事先确定部署的环境以及部署方式。
Apollo目前支持以下环境:
DEV
开发环境
FAT
测试环境,相当于alpha环境(功能测试)
UAT
集成环境,相当于beta环境(回归测试)
PRO
生产环境
如果希望添加自定义的环境名称,具体步骤可以参考Portal如何增加环境 (opens new window)
1.4 网络策略
分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。
Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。
需要注意的是,apollo-configservice和apollo-adminservice是基于内网可信网络设计的,所以出于安全考虑,请不要将apollo-configservice和apollo-adminservice直接暴露在公网。
所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice和apollo-adminservice中做相关配置来解决连通性问题。
1.4.1 忽略某些网卡
可以分别修改apollo-configservice和apollo-adminservice的startup.sh,通过JVM System Property传入-D参数,也可以通过OS Environment Variable传入,下面的例子会把docker0和veth开头的网卡在注册到Eureka时忽略掉。
JVM System Property示例:
-Dspring.cloud.inetutils.ignoredInterfaces[0]=docker0
-Dspring.cloud.inetutils.ignoredInterfaces[1]=veth.*
OS Environment Variable示例:
SPRING_CLOUD_INETUTILS_IGNORED_INTERFACES[0]=docker0
SPRING_CLOUD_INETUTILS_IGNORED_INTERFACES[1]=veth.*
1.4.2 指定要注册的ip
可以分别修改apollo-configservice和apollo-adminservice的startup.sh,通过JVM System Property传入-D参数,也可以通过OS Environment Variable传入,下面的例子会指定注册的IP为1.2.3.4。
JVM System Property示例:
-Deureka.instance.ip-address=1.2.3.4
OS Environment Variable示例:
EUREKA_INSTANCE_IP_ADDRESS=1.2.3.4
1.4.3 指定要注册的url
可以分别修改apollo-configservice和apollo-adminservice的startup.sh,通过JVM System Property传入-D参数,也可以通过OS Environment Variable传入,下面的例子会指定注册的URL为http://1.2.3.4:8080。
JVM System Property示例:
-Deureka.instance.homePageUrl=http://1.2.3.4:8080
-Deureka.instance.preferIpAddress=false
OS Environment Variable示例:
EUREKA_INSTANCE_HOME_PAGE_URL=http://1.2.3.4:8080
EUREKA_INSTANCE_PREFER_IP_ADDRESS=false
1.4.4 直接指定apollo-configservice地址
如果Apollo部署在公有云上,本地开发环境无法连接,但又需要做开发测试的话,客户端可以升级到0.11.0版本及以上,然后配置跳过Apollo Meta Server服务发现 (opens new window)
二 部署步骤
部署步骤总体还是比较简单的,Apollo的唯一依赖是数据库,所以需要首先把数据库准备好,然后根据实际情况,选择不同的部署方式:
2.1 创建数据库
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
需要注意的是ApolloPortalDB只需要在生产环境部署一个即可,而ApolloConfigDB需要在每个环境部署一套,如fat、uat和pro分别部署3套ApolloConfigDB。
注意:如果你本地已经创建过Apollo数据库,请注意备份数据。我们准备的sql文件会清空Apollo相关的表。
2.1.1 创建ApolloPortalDB
可以根据实际情况选择通过手动导入SQL
2.1.1.1 手动导入sql创建
通过各种MySQL客户端导入apolloportaldb.sql (opens new window)即可。
以MySQL原生客户端为例:
source /your_local_path/scripts/sql/apolloportaldb.sql
2.1.1.2 验证
导入成功后,可以通过执行以下sql语句来验证:
select Id
, Key
, Value
, Comment
from ApolloPortalDB
.ServerConfig
limit 1;点击复制错误复制成功
Id | Key | Value | Comment |
1 | apollo.portal.envs | dev | 可支持的环境列表 |
注:ApolloPortalDB只需要在生产环境部署一个即可
2.1.2 创建apolloconfigdb
可以根据实际情况选择通过手动导入SQL
2.1.2.1 手动导入sql
通过各种MySQL客户端导入apolloconfigdb.sql (opens new window)即可。
以MySQL原生客户端为例:
source /your_local_path/scripts/sql/apolloconfigdb.sql
2.1.2.2 验证
导入成功后,可以通过执行以下sql语句来验证:
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 |
注:ApolloConfigDB需要在每个环境部署一套,如fat、uat和pro分别部署3套ApolloConfigDB
2.1.2.3 从别的环境导入apolloconfigdb数据
如果是全新部署的Apollo配置中心,请忽略此步。
如果不是全新部署的Apollo配置中心,比如已经使用了一段时间,这时在Apollo配置中心已经创建了不少项目以及namespace等,那么在新环境中的ApolloConfigDB中需要从其它正常运行的环境中导入必要的项目数据。
主要涉及ApolloConfigDB的下面4张表,下面同时附上需要导入的数据查询语句:
- App
- 导入全部的App
- 如:insert into 新环境的ApolloConfigDB.App select * from 其它环境的ApolloConfigDB.App where IsDeleted = 0;
- AppNamespace
- 导入全部的AppNamespace
- 如:insert into 新环境的ApolloConfigDB.AppNamespace select * from 其它环境的ApolloConfigDB.AppNamespace where IsDeleted = 0;
- Cluster
- 导入默认的default集群
- 如:insert into 新环境的ApolloConfigDB.Cluster select * from 其它环境的ApolloConfigDB.Cluster where Name = 'default' and IsDeleted = 0;
- Namespace
- 导入默认的default集群中的namespace
- 如:insert into 新环境的ApolloConfigDB.Namespace select * from 其它环境的ApolloConfigDB.Namespace where ClusterName = 'default' and IsDeleted = 0;
同时也别忘了通知用户在新的环境给自己的项目设置正确的配置信息,尤其是一些影响面比较大的公共namespace配置。
如果是为正在运行的环境迁移数据,建议迁移完重启一下config service,因为config service中有appnamespace的缓存数据
2.1.3 调整服务端配置
Apollo自身的一些配置是放在数据库里面的,所以需要针对实际情况做一些调整,具体参数说明请参考三、服务端配置说明 (opens new window)。
大部分配置可以先使用默认值,不过 apollo.portal.envs (opens new window) 和 eureka.service.url (opens new window) 请务必配置正确后再进行下面的部署步骤。
2.2 虚拟机/物理机部署
2.2.1 获取安装包
可以通过两种方式获取安装包:
- 直接下载安装包
- 从GitHub Release (opens new window)页面下载预先打好的安装包
- 如果对Apollo的代码没有定制需求,建议使用这种方式,可以省去本地打包的过程
- 通过源码构建
- 从GitHub Release (opens new window)页面下载Source code包或直接clone源码 (opens new window)后在本地构建
- 如果需要对Apollo的做定制开发,需要使用这种方式
2.2.1.1 直接下载安装包
2.2.1.1.1 获取apollo-configservice、apollo-adminservice、apollo-portal安装包
从GitHub Release (opens new window)页面下载最新版本的apollo-configservice-x.x.x-github.zip、apollo-adminservice-x.x.x-github.zip和apollo-portal-x.x.x-github.zip即可。
2.2.1.1.2 配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,数据库连接串信息位于上一步下载的压缩包中的config/application-github.properties中。
2.2.1.1.2.1 配置apollo-configservice的数据库连接信息
- 解压apollo-configservice-x.x.x-github.zip
- 用程序员专用编辑器(如vim,notepad++,sublime等)打开config目录下的application-github.properties文件
- 填写正确的ApolloConfigDB数据库连接串信息,注意用户名和密码后面不要有空格!
- 修改完的效果如下:
# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = someuser
spring.datasource.password = somepwd点击复制错误复制成功
注:由于ApolloConfigDB在每个环境都有部署,所以对不同的环境config-service需要配置对应环境的数据库参数
2.2.1.1.2.2 配置apollo-adminservice的数据库连接信息
- 解压apollo-adminservice-x.x.x-github.zip
- 用程序员专用编辑器(如vim,notepad++,sublime等)打开config目录下的application-github.properties文件
- 填写正确的ApolloConfigDB数据库连接串信息,注意用户名和密码后面不要有空格!
- 修改完的效果如下:
# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = someuser
spring.datasource.password = somepwd点击复制错误复制成功
注:由于ApolloConfigDB在每个环境都有部署,所以对不同的环境admin-service需要配置对应环境的数据库参数
2.2.1.1.2.3 配置apollo-portal的数据库连接信息
- 解压apollo-portal-x.x.x-github.zip
- 用程序员专用编辑器(如vim,notepad++,sublime等)打开config目录下的application-github.properties文件
- 填写正确的ApolloPortalDB数据库连接串信息,注意用户名和密码后面不要有空格!
- 修改完的效果如下:
# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = someuser
spring.datasource.password = somepwd点击复制错误复制成功
2.2.1.1.2.4 配置apollo-portal的meta service信息
Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。默认情况下,meta service和config service是部署在同一个JVM进程,所以meta service的地址就是config service的地址。
对于1.6.0及以上版本,可以通过ApolloPortalDB.ServerConfig中的配置项来配置Meta Service地址,详见apollo.portal.meta.servers - 各环境Meta Service列表 (opens new window)
使用程序员专用编辑器(如vim,notepad++,sublime等)打开apollo-portal-x.x.x-github.zip中config目录下的apollo-env.properties文件。
假设DEV的apollo-configservice未绑定域名,地址是1.1.1.1:8080,FAT的apollo-configservice绑定了域名apollo.fat.xxx.com,UAT的apollo-configservice绑定了域名apollo.uat.xxx.com,PRO的apollo-configservice绑定了域名apollo.xxx.com,那么可以如下修改各环境meta service服务地址,格式为${env}.meta=http://${config-service-url:port},如果某个环境不需要,也可以直接删除对应的配置项(如lpt.meta):
dev.meta=http://1.1.1.1:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com点击复制错误复制成功
除了通过apollo-env.properties方式配置meta service以外,apollo也支持在运行时指定meta service(优先级比apollo-env.properties高):
- 通过Java System Property
${env}_meta
可以通过Java的System Property ${env}_meta来指定
如java -Ddev_meta=http://config-service-url -jar xxx.jar
也可以通过程序指定,如System.setProperty("dev_meta", "http://config-service-url");
- 通过操作系统的System Environment
${ENV}_META
- 如DEV_META=http://config-service-url
- 注意key为全大写,且中间是_分隔
注1: 为了实现meta service的高可用,推荐通过SLB(Software Load Balancer)做动态负载均衡
注2: meta service地址也可以填入IP,0.11.0版本之前只支持填入一个IP。从0.11.0版本开始支持填入以逗号分隔的多个地址(PR #1214 (opens new window)),如http://1.1.1.1:8080,http://2.2.2.2:8080,不过生产环境还是建议使用域名(走slb),因为机器扩容、缩容等都可能导致IP列表的变化。
2.2.1.2 通过源码构建
2.2.1.2.1 配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑scripts/build.sh (opens new window),修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。
注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?useSSL=false&characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)点击复制错误复制成功
注1:由于ApolloConfigDB在每个环境都有部署,所以对不同的环境config-service和admin-service需要使用不同的数据库参数打不同的包,portal只需要打一次包即可
注2:如果不想config-service和admin-service每个环境打一个包的话,也可以通过运行时传入数据库连接串信息实现,具体可以参考 Issue 869 (opens new window)
注3:每个环境都需要独立部署一套config-service、admin-service和ApolloConfigDB
2.2.1.2.2 配置各环境meta service地址
Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以需要在打包时提供这些信息。
假设DEV的apollo-configservice未绑定域名,地址是1.1.1.1:8080,FAT的apollo-configservice绑定了域名apollo.fat.xxx.com,UAT的apollo-configservice绑定了域名apollo.uat.xxx.com,PRO的apollo-configservice绑定了域名apollo.xxx.com,那么编辑scripts/build.sh (opens new window),如下修改各环境meta service服务地址,格式为${env}_meta=http://${config-service-url:port},如果某个环境不需要,也可以直接删除对应的配置项:
dev_meta=http://1.1.1.1:8080
fat_meta=http://apollo.fat.xxx.com
uat_meta=http://apollo.uat.xxx.com
pro_meta=http://apollo.xxx.com
META_SERVERS_OPTS="-Ddev_meta=$dev_meta -Dfat_meta=$fat_meta -Duat_meta=$uat_meta -Dpro_meta=$pro_meta"
除了在打包时配置meta service以外,apollo也支持在运行时指定meta service:
- 通过Java System Property
${env}_meta
可以通过Java的System Property ${env}_meta来指定
如java -Ddev_meta=http://config-service-url -jar xxx.jar
也可以通过程序指定,如System.setProperty("dev_meta", "http://config-service-url");
- 通过操作系统的System Environment
${ENV}_META
- 如DEV_META=http://config-service-url
- 注意key为全大写,且中间是_分隔
注1: 为了实现meta service的高可用,推荐通过SLB(Software Load Balancer)做动态负载均衡
注2: meta service地址也可以填入IP,0.11.0版本之前只支持填入一个IP。从0.11.0版本开始支持填入以逗号分隔的多个地址(PR #1214 (opens new window)),如http://1.1.1.1:8080,http://2.2.2.2:8080,不过生产环境还是建议使用域名(走slb),因为机器扩容、缩容等都可能导致IP列表的变化。
2.2.1.2.3 执行编译、打包
做完上述配置后,就可以执行编译和打包了。
注:初次编译会从Maven中央仓库下载不少依赖,如果网络情况不佳时很容易出错,建议使用国内的Maven仓库源,比如阿里云Maven镜像 (opens new window)
./build.sh
该脚本会依次打包apollo-configservice, apollo-adminservice, apollo-portal。
注:由于ApolloConfigDB在每个环境都有部署,所以对不同环境的config-service和admin-service需要使用不同的数据库连接信息打不同的包,portal只需要打一次包即可
2.2.1.2.4 获取apollo-configservice安装包
位于apollo-configservice/target/目录下的apollo-configservice-x.x.x-github.zip
需要注意的是由于ApolloConfigDB在每个环境都有部署,所以对不同环境的config-service需要使用不同的数据库参数打不同的包后分别部署
2.2.1.2.5 获取apollo-adminservice安装包
位于apollo-adminservice/target/目录下的apollo-adminservice-x.x.x-github.zip
需要注意的是由于ApolloConfigDB在每个环境都有部署,所以对不同环境的admin-service需要使用不同的数据库参数打不同的包后分别部署
2.2.1.2.6 获取apollo-portal安装包
位于apollo-portal/target/目录下的apollo-portal-x.x.x-github.zip
2.2.1.2.7 启用外部nacos服务注册中心替换内置eureka
- 修改build.sh/build.bat,将config-service和admin-service的maven编译命令更改为
mvn clean package -Pgithub,nacos-discovery -DskipTests -pl apollo-configservice,apollo-adminservice -am -Dapollo_profile=github,nacos-discovery -Dspring_datasource_url=$apollo_config_db_url -Dspring_datasource_username=$apollo_config_db_username -Dspring_datasource_password=$apollo_config_db_password点击复制错误复制成功
- 分别修改apollo-configservice和apollo-adminservice安装包中config目录下的application-github.properties,配置nacos服务器地址
nacos.discovery.server-addr=127.0.0.1:8848
# 更多 nacos 配置
nacos.discovery.access-key=
nacos.discovery.username=
nacos.discovery.password=
nacos.discovery.secret-key=
nacos.discovery.namespace=
nacos.discovery.context-path=
2.2.1.2.8 启用外部Consul服务注册中心替换内置eureka
- 修改build.sh/build.bat,将config-service和admin-service的maven编译命令更改为
mvn clean package -Pgithub -DskipTests -pl apollo-configservice,apollo-adminservice -am -Dapollo_profile=github,consul-discovery -Dspring_datasource_url=$apollo_config_db_url -Dspring_datasource_username=$apollo_config_db_username -Dspring_datasource_password=$apollo_config_db_password
- 分别修改apollo-configservice和apollo-adminservice安装包中config目录下的application-github.properties,配置consul服务器地址
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500点
2.2.2 部署Apollo服务端
2.2.2.1 部署apollo-configservice
将对应环境的apollo-configservice-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
记得在scripts/startup.sh中按照实际的环境设置一个JVM内存,以下是我们的默认设置,供参考:
export JAVA_OPTS="-server -Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=18"点击复制错误复制成功
注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信息,详见:2.2.1.1.2.4 配置apollo-portal的meta service信息 (opens new window)和1.2.2 Apollo Meta Server (opens new window)。
注4:如果ApolloConfigDB.ServerConfig的eureka.service.url只配了当前正在启动的机器的话,在启动apollo-configservice的过程中会在日志中输出eureka注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了。
注5:如果你看到了这里,相信你一定是一个细心阅读文档的人,而且离成功就差一点点了,继续加油,应该很快就能完成Apollo的分布式部署了!不过你是否有感觉Apollo的分布式部署步骤有点繁琐?是否有啥建议想要和作者说?如果答案是肯定的话,请移步 #1424 (opens new window),期待你的建议!
2.2.2.2 部署apollo-adminservice
将对应环境的apollo-adminservice-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
记得在scripts/startup.sh中按照实际的环境设置一个JVM内存,以下是我们的默认设置,供参考:
export JAVA_OPTS="-server -Xms2560m -Xmx2560m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:SurvivorRatio=22"
注1:如果需要修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分。
注2:如要调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-adminservice.conf中的LOG_DIR。
注3:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT。
2.2.2.3 部署apollo-portal
将apollo-portal-x.x.x-github.zip上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
记得在startup.sh中按照实际的环境设置一个JVM内存,以下是我们的默认设置,供参考:
export JAVA_OPTS="-server -Xms4096m -Xmx4096m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=1536m -XX:MaxNewSize=1536m -XX:SurvivorRatio=22"
注1:如果需要修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分。
注2:如要调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-portal.conf中的LOG_DIR。
注3:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT。