apollo分布式部署之环境区分
# 一 、再看部署架构图
在上一节中,我们将apollo portal的配置中心web管理界面安装成功,如上图中的红色部分。portal用来管理多个运行环境,比如:生产环境、测试环境、开发环境等。 本节我们就以DEV(开发环境)来为大家介绍apollo服务端其他组件的部署,也就是config-service和adminservice(上图中的蓝色部分)。为了更贴近实际,并且保障高可用(开发环境也可以是高可用,避免服务不可用导致的开发效率问题),我们将config-service和adminservice分别部署启动3个实例。
上图中蓝色部分并没有体现出DEV环境的config-service和adminservice高可用分布式部署,只体现了单实例。这点我们不同。
下图是我们以DEV(开发环境)为例的部署图。以后我们每增加一套环境,就要完成本节所讲内容的安装与配置。
# 二、准备工作
与上一节中安装Apollo Portal的要求是一样的,需要准备好java环境(1.8+),MysQL环境(5.6.5+)。并且将apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip上传到如下的主机。
环境 | 主机 | ConfigService端口规划 | AdmingService端口规划 |
---|---|---|---|
DEV | 192.168.161.3 | 9431 | 9432 |
DEV | 192.168.161.4 | 9431 | 9432 |
DEV | 192.168.161.5 | 9431 | 9432 |
# 三、安装ConfigService和AdminService
# 3.1.创建ApolloConfigDB数据库
ConfigService 和 AdminServie都需要操作数据库ApolloConfigDB
,官方把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
- 管理员账号执行初始化SQL:sql/apolloconfigdb.sql (opens new window),包含建库、建表及示例数据
# 用管理员账号登录mysql之后执行命令,创建数据库、建表及插入示例数据。
mysql > source 你的SQL所在的linux文件路径/apolloconfigdb.sql
2
虽然我们用管理员账户创建数据库,但是我们一般不用管理员用户访问业务数据库,所以我建立了一个test用户,并对其进行赋权。
CREATE USER 'test'@'%' IDENTIFIED BY '你的密码';
GRANT ALL ON ApolloConfigDB.* TO 'test'@'%' IDENTIFIED BY '你的密码'; //只有执行了这一句才可以远程登陆
FLUSH PRIVILEGES;
2
3
4
# 3.2.修改ConfigService和AdminService数据库连接配置文件
apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip解压之后,config目录下面也都有一个config/application-github.properties文件,修改其中的mysql ip地址、端口、用户名、密码信息,指向ApolloConfigDB所在的mysql数据库。
# 创建目录,并解压到该目录
mkdir ./configservice && unzip apollo-configservice-1.6.1-github.zip -d ./configservice
mkdir ./adminservice&& unzip apollo-adminservice-1.6.1-github.zip -d ./adminservice
2
3
apollo-configservice-1.6.1-github.zip和apollo-adminservice-1.6.1-github.zip与portal解压之后的文件结构大同小异。如果有问题,可以看上一节内容。不同之处我会单独讲解。
- 根据你的数据库地址将localhost修改为ApolloConfigDB数据库主机ip
- 根据你的ApolloConfigDB数据库修改用户名密码,我的用户名是test(上文新建的)
spring.datasource.url = jdbc:mysql://你的mysql所在主机ip:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = test
spring.datasource.password = 你的用户密码
2
3
# 3.3.修改Eureka服务注册中心连接配置
- ConfigService和AdminService是Spring Cloud微服务,所以二者需要向服务注册中心注册
- ConfigService包含eureka,所以实际上就是向ConfigService注册。我们规划的ConfigService接口是9431。
- ConfigService和AdminService都操作ApolloConfigDB,为了避免重复配置,所以官方将eureka连接配置放在了数据库里面。
在ApolloConfigDB中执行如下的SQL,配置eureka集群连接。
UPDATE apolloconfigdb.ServerConfig
SET ServerConfig.`Value`='http://192.168.161.3:9431/eureka/,http://192.168.161.4:9431/eureka/,http://192.168.161.5:9431/eureka/'
WHERE `Key`='eureka.service.url';
2
3
# 四、ConfigService和AdminService服务启动
# 4.1 先改端口
ConfigService和AdminService的默认端口是8080, 8090端口,按照我们的规划改成9431和9432。修改scripts/startup.sh脚本(三台服务器182.168.161.3,192.168.161.4,192.168.161.5都要改,所以可以将zip里面文件中端口改好之后再上传服务器):
同时要把这2个端口在防火墙上开放出来
firewall-cmd --zone=public --add-port=9431/tcp --permanent;
firewall-cmd --zone=public --add-port=9432/tcp --permanent;
firewall-cmd --reload
2
3
# 4.2.执行启动脚本
分别进入三台服务器182.168.161.3,192.168.161.4,192.168.161.5的configservice、adminservice目录下。脚本的启动顺序没有必然的先后(连接失败可以重试),但最好先启动configservice。执行startup.sh脚本(脚本的路径根据你自己的主机目录修改):
/root/apollo/configservice/scripts/startup.sh; #先在每台机器上执行这个,因为包含eureka。
/root/apollo/adminservice/scripts/startup.sh; #然后每台机器上执行这个
2
# 四、部署结果验证
- 验证eureka访问:http://192.168.161.3:9431/,http://192.168.161.4:9431/,http://192.168.161.5:9431/,然后去检查所有实例是否启动成功。
按照上图中的红色标记检查部署结果。
# 五、部署问题解决
# 5.1.多网卡问题解决
之前我们讲过eureka的多网卡选择问题,eureka是一spring cloud(boot)服务,所以该解决方案适用于所有的spring cloud(boot)服务。也就适用于configService和adminservice。在二者的application-github.properties文件中加入网卡选择配置(参考eureka多网卡选择章节学习)
spring.cloud.inetutils.preferredNetworks=192.168
spring.cloud.inetutils.ignoredInterfaces[0]=enp0s3
spring.cloud.inetutils.ignoredInterfaces[1]=docker0
eureka.instance.hostname=peer1
eureka.instance.instance-id: ${spring.application.name}-${eureka.instance.hostname}:${server.port}
2
3
4
5
6
将hostname为peer1、peer2、peer3分别应用于三台主机,配置修改完成之后,重启configservice、adminservice
我们部署了configService,configService中默认包含了eureka,所以未来所有eureka遇到的问题都可以在configService应用中通过配置解决。
# 六、修改Portal环境配置
因为我们新增了DEV开发环境,并且部署了ConfigService和AdminService,所以需要将其告知Apollo Portal。方法就是修改portal应用(上一节部署)的配置文件是config/apollo-env.properties。
dev.meta=http://192.168.161.3:9431,http://192.168.161.4:9431,http://192.168.161.5:9431
将dev.meta的配置指向configService服务。Config service地址也可以填入IP,0.11.0版本之前只支持填入一个IP。从0.11.0版本开始支持填入以逗号分隔的多个地址。如上配置所示。
不过对于生产环境还是建议使用域名,通过SLB(Software Load Balancer:nginx or haproxy)做动态负载均衡,因为机器扩容、缩容等都可能导致IP列表的变化。
因为我们修改了portal配置文件,所以portal也要重启。
/root/apollo/portal/scripts/startup.sh;
# 七、调整ApolloPortal配置
服务配置项统一存储在ApolloPortalDB.ServerConfig表中,可以通过管理员工具 - 系统参数
页面进行配置:apollo.portal.envs - 可支持的环境列表
默认值是dev(开发环境),不用改。如果我们本节内容新增的是生产环境的配置,应该写上“dev,pro”,然后保存。查看管理员工具->系统信息,如下: