通过之前的博文《在本地Windows系统下搭建Apollo配置中心》,学习了Apollo利用脚本在本地部署,但是使用这种方式部署,有很多限制如端口号无法修改,无法增加自定义环境、部门信息,无法让其他计算机使用配置中心等。本篇博文通过学习Apollo的分布式部署,弥补了之前的不足,在这里记录总结下。
在之前的博文中我使用的是通过网盘下载的压缩包快速部署,在本篇博文中通过git将apollo项目克隆的本地来进行修改部署。克隆地址
通过在实际的开发中,我们会有不同的环境,如开发环境,测试环境,正式环境等。每个环境都需要有各自的配置服务,分布式部署就是为不同环境配置配置管理服务,同时要保证服务的高可用。
下图为Apollo官方提供的部署策略图
可以看到整体分为4部分,在每部分中都有多个相同的服务和db。接下解释下每部分代表什么含义。
这里的每部分都表示不同的环境,有FAT,UAT,PROD. 目前Apollo支持以下几种环境
通过图片我们还可以看到
假设我们我们需要添加TEST,DEMO环境
修改com.ctrip.framework.apollo.core.enums.Env类,在其中添加需要添加环境的名称
public enum Env{
LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS, UNKNOWN, DEMO, TEST;
...
}
修改com.ctrip.framework.apollo.core.enums.EnvUtils类,在其中添加环境的转换逻辑
switch (envName.trim().toUpperCase()) {
...
case "DEMO":
return Env.DEMO;
case "TEST":
return Env.TEST;
default:
return Env.UNKNOWN;
}
修改apollo-env.properties配置文件,在该文件中添加环境所需的meta server地址
demo.meta=${demo_meta}
test.meta=${test_meta}
这里由于在本地,可以将其配置成和dev相同的值,在启动时,如果不指定具体的值portal会心跳检测,一直报错
修改com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider类,添加需要环境的获取meta server地址的逻辑
private void initialize() {
...
domains.put(Env.DEMO,
env.getProperty("demo_meta", prop.getProperty("demo.meta")));
domains.put(Env.TEST,
env.getProperty("test_meta", prop.getProperty("test.meta")));
}
修改serverconfig表的apollo.portal.envs字段,添加需要的环境名称,用 , 分割
这里可以根据需要修改organizations的值来添加部门信息,按照前面的格式添加json串
之前通过脚本部署,config service为8080 admin service为8090 portal service为8070,通过分别修改apollo-configservice、apollo-adminservice、apollo-portal项目的application.yml文件,修改server.port的值
注意
在修改端口号后,如果依然使用的是configservice作为eureka注册中心,一定要修改bootstrap.yml配置文件中服务的注册地址端口号,其值为config service的端口号,需要修改apollo-configservice和apollo-adminservice项目的注册端口号
defaultZone: http://${eureka.instance.hostname}:8088/eureka/
这里将configservice的server.port修改为8088
在将config service的端口后修改后必须在apolloconfigdb库中修改serverconfig表,在eureka.service.url 添加新的eureka地址,用,分隔。这里为了让其他计算机也可以使用本地的注册中心,所以使用ip+端口的形式
eureka.service.url 添加 http://ip:8088/eureka/
在分布式部署中,每个环境都有各自对应的数据库,需要修改不同环境的的eureka地址,修改apolloconfigdb.serviceconfig表中eureka.service.url的值,对应config service的地址,这里由于条件限制,本地无法实现。更多详细内容请查看官方文档
分别修改apollo-configservice和apollo-adminservice的application-github.properties文件,在其中添加数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3307/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=**
再修改apollo-portal的application-github.properties文件
spring.datasource.url = jdbc:mysql://localhost:3307/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username =***
spring.datasource.password =**
注意:configservice和adminservice使用的是ApolloConfigDB数据库,portal使用的是ApolloPortalDB数据库
在添加了数据库连接信息后,需要在启动类添加配置信息
分别在PortalApplication、ConfigServiceApplication、AdminServiceApplication添加配置
@PropertySource(value = {"classpath:application-github.properties"})
这里介绍另一种方式,直接在各自项目的配置文件添加数据库连接信息,configservice在configservice.properties文件,adminservice在adminservice.properties文件添加
apollo_profile=github
spring.datasource.url=jdbc:mysql://localhost:3307/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=**
在apollo-portal中需要在resources目录下创建portal.properties文件,在其中添加
apollo_profile=github
spring.datasource.url=jdbc:mysql://localhost:3307/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username=***
spring.datasource.password=***
添加完后,需要在PortalApplication启动类上添加配置信息
@PropertySource(value = {"classpath:portal.properties"})
在分布式部署中,每个环境都需要单独配置,使用各自的数据库。
之前讲到脚本配置启动后,其他计算机无法使用本地的Apollo的配置中心,这里通过修改服务的ip来实现
分别修改apollo-configservice和apollo-adminservice的服务注册地址及服务实例的ip地址
这里需要注意在使用ip-adress配置了ip地址后,preferIpAddress的值必须设置为true,否则当调用该服务时,会通过主机名称+端口的方式调用,也就是hostname+server-port的方式,会导致调用不到。同时修改defaultZone的值,由于这里使用的configservice自带的eureka服务,所以两个项目的值都是configservice的ip+server-port。要注意之前我们修改的configdb中eureka.service.url的值的ip一定要与configservice对应
eureka.instance.ip-address=${ip地址}
eureka.instance.preferIpAddress=true
配置启动后,其他计算机就可以通过使用http://configservice-ip:port/eureka/地址将项目注册到该注册中心,发现Apollo配置中心的服务实例。
这里再介绍另一种注册方式,以上都是使用的configservice集成的eureka服务,如果已经有了一个eureka配置中心,需要使用同一个注册中心统一管理时,我们需要修改apollo-configservice的配置。
参考资料:
https://github.com/ctripcorp/apollo/wiki/分布式部署指南
https://blog.csdn.net/Michael_HM/article/details/80310606
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/sinat_36553913/article/details/83051557
内容来源于网络,如有侵权,请联系作者删除!