Apollo学习(三): 分布式部署

x33g5p2x  于2021-12-20 转载在 其他  
字(4.9k)|赞(0)|评价(0)|浏览(452)

说明

通过之前的博文《在本地Windows系统下搭建Apollo配置中心》,学习了Apollo利用脚本在本地部署,但是使用这种方式部署,有很多限制如端口号无法修改,无法增加自定义环境、部门信息,无法让其他计算机使用配置中心等。本篇博文通过学习Apollo的分布式部署,弥补了之前的不足,在这里记录总结下。

正文

在之前的博文中我使用的是通过网盘下载的压缩包快速部署,在本篇博文中通过git将apollo项目克隆的本地来进行修改部署。克隆地址

分布式部署结构

通过在实际的开发中,我们会有不同的环境,如开发环境,测试环境,正式环境等。每个环境都需要有各自的配置服务,分布式部署就是为不同环境配置配置管理服务,同时要保证服务的高可用。
下图为Apollo官方提供的部署策略图

可以看到整体分为4部分,在每部分中都有多个相同的服务和db。接下解释下每部分代表什么含义。
这里的每部分都表示不同的环境,有FAT,UAT,PROD. 目前Apollo支持以下几种环境

  • DEV 开发环境
  • FAT 测试环境
  • UAT 集成环境
  • PRO 生产环境 (包括图上的PROD)
    通过阅读源码,可以发现还支持其他环境,这里只做了解即可

通过图片我们还可以看到

  • Portal部署在生产环境,通过它直接来管理其他不同环境的配置
  • Meta Server、Config Service和Admin Service在每个环境都单独部署,使用独立的数据库
  • Meta Server和Config Service部署在同一个JVMji进程中,Admin
    Service部署在同一服务器的另一个JVM进程中
  • Meta Server、Config Service和Admin Servcie在生产环境中部署在两个机房,实现双活
    由于条件限制无法实现上图的部署方式,接下来在通过介绍在本地环境添加自定义环境,修改服务端口号,修改服务的注册方式来进行学习。

自定义环境

假设我们我们需要添加TEST,DEMO环境

1. 修改apollo-core项目中的Env枚举类

修改com.ctrip.framework.apollo.core.enums.Env类,在其中添加需要添加环境的名称

public enum Env{
  LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS, UNKNOWN, DEMO, TEST;
	...
}

2.修改EnvUtils类

修改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;
 }

3.修改apollo-portal项目中的apollo-env.porperties配置文件

修改apollo-env.properties配置文件,在该文件中添加环境所需的meta server地址

demo.meta=${demo_meta}
test.meta=${test_meta}

这里由于在本地,可以将其配置成和dev相同的值,在启动时,如果不指定具体的值portal会心跳检测,一直报错

4.修改apollo-core项目中的LegacyMetaServerProvider类

修改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")));
  }

5.修改apolloportaldb库中serverconfig表

修改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的地址,这里由于条件限制,本地无法实现。更多详细内容请查看官方文档

1.配置数据库信息

分别修改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来实现

2. 修改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的配置。

3.注册到单独的Eureka Server上

  • 修改ConfigServiceApplication 将@EnableEurekaServer修改为@EnableEurekaClient
  • 修改ApolloConfigDB.ServerConfig表中的eureka.service.url,指向自己的Eureka地址
  • 修改apollo-confgservice和apollo-adminservice的eureka.client.serviceUrl.defaultZone的值

参考资料:
https://github.com/ctripcorp/apollo/wiki/分布式部署指南
https://blog.csdn.net/Michael_HM/article/details/80310606

相关文章