4Apollo 分布式部署 · SpringCloud微服务实战 · 看云

导航

分布式部署需要事先确定部署的环境以及部署方式。

Apollo目前支持以下环境:

  • DEV
    • 开发环境
  • FAT
    • 测试环境,相当于alpha环境(功能测试)
  • UAT
    • 集成环境,相当于beta环境(回归测试)
  • PRO
    • 生产环境

以ctrip为例,我们的部署策略如下:
0b8477cf4ef193cfc614f3b48d2f083f_MD5.webp

  • 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-configserviceapollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。

Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。

需要注意的是,apollo-configserviceapollo-adminservice是基于内网可信网络设计的,所以出于安全考虑,请不要将apollo-configserviceapollo-adminservice直接暴露在公网。

所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configserviceapollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。

具体文档可以参考Ignore Network Interfaces章节。具体而言,就是分别编辑apollo-configservice/src/main/resources/application.ymlapollo-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版本
33af818c248db319bed034d6fdc61263_MD5.png

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/adminservicefwcloud/apollo/fat/adminservice目录
  • 之后将下载下来的apollo-configservice-1.5.1-github.zip上传到Centos服务器中的fwcloud/apollo/dev/configservicefwcloud/apollo/dev/configservice目录
  • 最后将apollo-portal-1.5.1-github.zip上传到Centos服务器中的fwcloud/apollo/dev/portal目录
    准备工作第一段已经结束

2.3 数据库准备

2.3.1 创建ApolloConfigDB

新建ApolloConfigDBdevApolloConfigDBtest两个环境的配置库(注意库名)
数据库、表的创建和样例数据都分别准备了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注册中心的地址,修改为自己的,多个用逗号隔开
2e2cb60a1d369de9c0abd40437a7a48e_MD5.png

进入ApolloConfigDBtest修改ServerConfig注册中心的地址,修改为自己的,多个用逗号隔开
ac85e4d483360504eabcb9bc26133fd4_MD5.png

进入ApolloPortalDBtest修改ServerConfig支持的环境,默认是dev,我们在添加一个fat,多个用逗号隔开
f9e12b6a5bf6264b4d9b1d84fcb348ef_MD5.png

以上应用和数据库的配置修改已经完成。配置起来有点繁琐,目前只是两个环境的,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
5b470e0581ff9eefdbb095a6822c61ca_MD5.png

浏览器输入ip:8082
f00477b20fcbc37a55a9440b2229591e_MD5.png

以上证明configservice和adminservice 配置和启动正确
浏览器输入ip:8071
f79278bcea75646c4ec207f3c3273bfa_MD5.png

可以看到目前apollo的配置中已经有dev和fat两个环境了。具体的使用可以看 Apollo 客户端使用 章节内容。

本节我们演示了Apollo 分布式部署中的多环境部署,实际造部署的时候每个环境都可以通过注册中心Eureka部署成集群的方式,本节我们只演示了dev、fat 两个环境,类似的我们还可以继续部署uat、prod环境,除了我们使用安装包的方式部署,还可以使用Docker容器的方式进行部署,感兴趣的话可以尝试一下。