4Apollo 分布式部署 · SpringCloud微服务实战 · 看云
导航
分布式部署需要事先确定部署的环境以及部署方式。
Apollo目前支持以下环境:
- DEV
- 开发环境
- FAT
- 测试环境,相当于alpha环境(功能测试)
- UAT
- 集成环境,相当于beta环境(回归测试)
- PRO
- 生产环境
以ctrip为例,我们的部署策略如下:
- Portal部署在生产环境的机房,通过它来直接管理FAT、UAT、PRO等环境的配置
- Meta Server、Config Service和Admin Service在每个环境都单独部署,使用独立的数据库
- Meta Server、Config Service和Admin Service在生产环境部署在两个机房,实现双活
- Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程内
1. 网络策略
分布式部署的时候,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中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。
具体文档可以参考Ignore Network Interfaces章节。具体而言,就是分别编辑apollo-configservice/src/main/resources/application.yml和apollo-adminservice/src/main/resources/application.yml,然后把需要忽略的网卡加进去。
如下面这个例子就是对于apollo-configservice,把docker0和veth.*的网卡在注册到Eureka时忽略掉。
spring:
application:
name: apollo-configservice
profiles:
active: ${apollo_profile}
cloud:
inetutils:
ignoredInterfaces:
- docker0
- veth.*
注意,对于application.yml修改时要小心,千万不要把其它信息改错了,如spring.application.name等。
另外一种方式是直接指定要注册的IP,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.ip-address=${指定的IP},也可以通过OS Environment Variable,如EUREKA_INSTANCE_IP_ADDRESS=${指定的IP},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
instance:
ip-address: ${指定的IP}
最后一种方式是直接指定要注册的IP+PORT,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.homePageUrl=http://${指定的IP}:${指定的Port},也可以通过OS Environment Variable,如EUREKA_INSTANCE_HOME_PAGE_URL=http://${指定的IP}:${指定的Port},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
instance:
homePageUrl: http://${指定的IP}:${指定的Port}
preferIpAddress: false
做完上述修改并重启后,可以查看Eureka页面(http://${config-service-url:port})检查注册上来的IP信息是否正确。
如果Apollo部署在公有云上,本地开发环境无法连接,但又需要做开发测试的话,客户端可以升级到0.11.0版本及以上,然后配置跳过Apollo Meta Server服务发现
2. 下面我们会已一种方式演示如何部署(安装包)
默认提供的安装都是dev环境的配置,在实际工作中,我们还要有fat、uat、prod等环境。本次我们将演示dev、fat环境的部署。
本次演示在同一台服务器上部署,因此通过端口区别,如果有多台服务器,不用区别即可
| 应用 | 端口 | 环境 |
|---|---|---|
| configservice | 8081 | dev |
| adminservice | 8091 | dev |
| configservice | 8082 | fat |
| adminservice | 8092 | fat |
| portal | 8071 | dev |
2.1 安装包下载
本次我们使用最新的1.5.1版本
2.2 创建 Apollo 的两个环境的目录
创建开发环境的adminservice
mkdir -p /fwcloud/apollo/dev/adminservice
创建测试环境的adminservice
mkdir -p /fwcloud/apollo/fat/adminservice
创建开发环境的configservice
mkdir -p /fwcloud/apollo/dev/configservice
创建测试环境的configservice
mkdir -p /fwcloud/apollo/fat/configservice
创建开发环境的portal
mkdir -p /fwcloud/apollo/dev/portal
- 需要将下载下来的
apollo-adminservice-1.5.1-github.zip上传到Centos服务器中的fwcloud/apollo/dev/adminservice和fwcloud/apollo/fat/adminservice目录 - 之后将下载下来的
apollo-configservice-1.5.1-github.zip上传到Centos服务器中的fwcloud/apollo/dev/configservice和fwcloud/apollo/dev/configservice目录 - 最后将
apollo-portal-1.5.1-github.zip上传到Centos服务器中的fwcloud/apollo/dev/portal目录
准备工作第一段已经结束
2.3 数据库准备
2.3.1 创建ApolloConfigDB
新建ApolloConfigDBdev和ApolloConfigDBtest两个环境的配置库(注意库名)
数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可
通过各种MySQL客户端导入apolloconfigdb.sql
导入成功后,可以通过执行以下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 |
2.3.2 创建ApolloPortalDB
新建ApolloPortalDBdev库(注意库名)
通过各种MySQL客户端导入apolloportaldb.sql即可
导入成功后,可以通过执行以下sql语句来验证:
select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
| Id | Key | Value | Comment |
|---|---|---|---|
| 1 | apollo.portal.envs | dev | 可支持的环境列表 |
2.4 配置修改
2.4.1 adminservice解压包并修改配置
2.4.1.1 修改开发环境的配置
进入 /fwcloud/apollo/dev/adminservice目录
cd /fwcloud/apollo/dev/adminservice
解压压缩包
unzip apollo-adminservice-1.5.1-github.zip
进入config目录修改
app.properties
- appId=100003172 #保证appId 和scripts里面的startup.sh里的日志配置id保持一样,各应用之间保持唯一
- jdkVersion=1.8 #java 版本
application-github.properties # 开发数据库连接信息
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
修改完之后修改scripts里面的内容
主要修改里面的日志路径和应用端口(根据需要,地址不要冲突)
#!/bin/bash
SERVICE_NAME=apollo-adminservice
## Adjust log dir if necessary
LOG_DIR=/opt/dev/admin/logs/100003172
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8091} #端口
......
2.4.1.2 修改测试环境的配置
进入 /fwcloud/apollo/dev/adminservice目录
cd /fwcloud/apollo/fat/adminservice
解压压缩包
unzip apollo-adminservice-1.5.1-github.zip
进入config目录修改
app.properties
- appId=100004172 #保证appId 和scripts里面的startup.sh里的日志配置id保持一样,各应用之间保持唯一
- jdkVersion=1.8 #java 版本
application-github.properties # 测试数据库连接信息
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
修改完之后修改scripts里面的内容
主要修改里面的日志路径和应用端口(根据需要,地址不要冲突)
#!/bin/bash
SERVICE_NAME=apollo-adminservice
## Adjust log dir if necessary
LOG_DIR=/opt/fat/admin/logs/100004172
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8092} #端口
......
2.4.2 configservice解压包并修改配置
2.4.2.1 修改开发环境的配置
进入 /fwcloud/apollo/dev/configservice目录
cd /fwcloud/apollo/dev/configservice
解压压缩包
unzip apollo-configservice-1.5.1-github.zip
进入config目录修改
app.properties
- appId=100003173 #保证appId 和scripts里面的startup.sh里的日志配置id保持一样,各应用之间保持唯一
- jdkVersion=1.8 #java 版本
application-github.properties # 开发数据库连接信息
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
修改完之后修改scripts里面的内容
主要修改里面的日志路径和应用端口(根据需要,地址不要冲突)
#!/bin/bash
SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
LOG_DIR=/opt/dev/config/logs/100003173
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8081} #端口
......
2.4.2.2 修改测试环境的配置
进入 /fwcloud/apollo/fat/configservice目录
cd /fwcloud/apollo/fat/configservice
解压压缩包
unzip apollo-configservice-1.5.1-github.zip
进入config目录修改
app.properties
- appId=100004173 #保证appId 和scripts里面的startup.sh里的日志配置id保持一样,各应用之间保持唯一
- jdkVersion=1.8 #java 版本
application-github.properties # 开发数据库连接信息
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
修改完之后修改scripts里面的内容
主要修改里面的日志路径和应用端口(根据需要,地址不要冲突)
#!/bin/bash
SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
LOG_DIR=/opt/fat/config/logs/100004173
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8082} #端口
......
2.4.2 portal 配置修改
进入 /fwcloud/apollo/dev/portal目录
cd /fwcloud/apollo/dev/portal
解压压缩包
unzip apollo-portal-1.5.1-github.zip
进入config目录修改
app.properties
- appId=100003174 #保证appId 和scripts里面的startup.sh里的日志配置id保持一样,各应用之间保持唯一
- jdkVersion=1.8 #java 版本
application-github.properties # 开发数据库连接信息
- spring.datasource.url
- spring.datasource.username
- spring.datasource.password
修改完之后修改scripts里面的内容
主要修改里面的日志路径和应用端口(根据需要,地址不要冲突)
#!/bin/bash
SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
LOG_DIR=/opt/fat/config/logs/100003174
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:=8071} #端口
......
apollo-env.properties配置修改(重要)
local.meta=http://localhost:8080
dev.meta=http://localhost:8081 #设置的开发地址
fat.meta=http://localhost:8082 #设置的测试地址
lpt.meta=${lpt_meta}
以上针对应用的配置修改结束。
2.5 数据库修改
进入ApolloConfigDBdev修改ServerConfig注册中心的地址,修改为自己的,多个用逗号隔开
进入ApolloConfigDBtest修改ServerConfig注册中心的地址,修改为自己的,多个用逗号隔开
进入ApolloPortalDBtest修改ServerConfig支持的环境,默认是dev,我们在添加一个fat,多个用逗号隔开
以上应用和数据库的配置修改已经完成。配置起来有点繁琐,目前只是两个环境的,uat和prod的笔者可以自行部署。
2.6 应用启动
分别进入一下路径的目录
- /fwcloud/apollo/dev/configservice/scripts
- /fwcloud/apollo/fat/configservice/scripts
- /fwcloud/apollo/dev/adminservice/scripts
- /fwcloud/apollo/fat/adminservice/scripts
- /fwcloud/apollo/dev/portal/scripts
执行命令
sh startup.sh
全部执行完之后
浏览器输入ip:8081
浏览器输入ip:8082
以上证明configservice和adminservice 配置和启动正确
浏览器输入ip:8071
可以看到目前apollo的配置中已经有dev和fat两个环境了。具体的使用可以看 Apollo 客户端使用 章节内容。
本节我们演示了Apollo 分布式部署中的多环境部署,实际造部署的时候每个环境都可以通过注册中心Eureka部署成集群的方式,本节我们只演示了dev、fat 两个环境,类似的我们还可以继续部署uat、prod环境,除了我们使用安装包的方式部署,还可以使用Docker容器的方式进行部署,感兴趣的话可以尝试一下。







