基础设施切换
[一]背景
微服务系统不同于单体系统,是无法独立运行的,必须依赖大量的基础设施支持,才能保证整个系统的正常运行。而在诸多基础能力:服务发现、服务注册、熔断降级等,通常都需要依赖于第三方的组件或者基础设施支持。
虽然,在我们正常开发使用过程中,一般都只会使用一种或者一个厂商的系列产品,一旦组件产品确定就很少会更换。
但是由于第三方基础设施的开发,通常由不同的厂商、不同的团队进行开发,对于问题处理的及时性、版本更新迭代的时效性、项目开发的持续性、Spring 社区产品适配性等均有较大差异,这对于微服务系统的升级开发都是一种潜在的风险。等确实出现以上问题而导致不得不更换基础设施时,不仅要投入大量时间研究、调整适配代码、更改数据配置,还会对系统的正常开发使用产生延迟。
为此,Dante Cloud 在系统架构方面,提早进行了设计和支持。一方面:让用户进需要投入极少的时间和精力,无需大量技术研究,就可以快速切换基础设施;另一方面,用户可以根据自己的喜好,灵活选择基础设施体系,更增加了系统的灵活性和通用性。
目前,Dante Cloud 支持以下几种基础设施生态
- Spring Cloud Alibaba 生态:即 Nacos、Sentinel、Seata 等。
- Spring Cloud Tencent 生态:即 PolarisMesh 套件(Spring Cloud Tencent 不同于 Spring Cloud Alibaba,是将微服务所需内容整合为一个产品)
- Spring Cloud 原生生态:即使用 Spring Cloud Zookeeper、Spring Cloud Consul 等搭建基础设施环境
[二]默认基础设施
Dante Cloud 默认使用 Spring Cloud Alibaba 生态相关组件,如果符合您的需求,直接使用即可。
[三]切换基础设施
[1]修改依赖模块
不同的厂商基础设施,除了需要安装的套件不同以外,最大区别在于代码中所需要依赖的模块不同。为了方便切换,Dante Cloud 已经将不同厂商所需的依赖包,进行了统一的封装形成独立的模块。
主要涉及模块:
facility-alibaba-spring-boot-starter
:对应 Spring Cloud Alibaba 生态facility-tencent-spring-boot-starter
:对应 Spring Cloud Tencent 生态facility-original-spring-boot-starter
:对应 Spring Cloud 原生生态
修改 facility-spring-boot-starter
模块依赖
切换基础设施第一步就是更换依赖的模块。在主工程的 packages
模块下,找到 facility-spring-boot-starter
模块。在该模块的 pom.xml
文件中,添加自己需要使用基础设施对应的模块。
例如:想要改用 Spring Cloud Tencent 生态组件,就找到 facility-spring-boot-starter
模块的 pom.xml
文件,将其中依赖的 facility-alibaba-spring-boot-starter
模块配置注释掉,然后新增 facility-tencent-spring-boot-starter
依赖配置,如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>packages</artifactId>
<groupId>cn.herodotus.reactive</groupId>
<version>3.3.2.0</version>
</parent>
<artifactId>facility-spring-boot-starter</artifactId>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>cn.herodotus.stirrup</groupId>-->
<!-- <artifactId>facility-alibaba-spring-boot-starter</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>cn.herodotus.stirrup</groupId>
<artifactId>facility-tencent-spring-boot-starter</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.herodotus.stirrup</groupId>-->
<!-- <artifactId>facility-original-spring-boot-starter</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>cn.herodotus.stirrup</groupId>
<artifactId>micrometer-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.herodotus.stirrup</groupId>
<artifactId>logging-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
修改 herodotus-cloud-gateway
服务依赖
因为,Spring Cloud Alibaba 生态的各个模块比较独立,所以正常情况下,在使用 Spring Cloud Alibaba 时,基于 Spring Cloud Gateway 的网关服务,需要额外依赖 Spring Cloud Alibaba 提供的、独立网关相关模块才能使用。
所以,在 Dante Cloud 中,除了与不同生态对应的 facility-alibaba-spring-boot-starter
、facility-tencent-spring-boot-starter
和 facility-original-spring-boot-starter
三个模块以外,还有一个针对 Spring Cloud Alibaba 对网关支持的独立模块 facility-gateway-spring-boot-starter
。
- 如果要使用 Spring Cloud Alibaba 生态,除了需要在
facility-spring-boot-starter
模块中修改依赖以外,还要在herodotus-cloud-gateway
网关服务中,增加facility-gateway-spring-boot-starter
依赖。 - 如果使用的是 Spring Cloud Tencent 生态或者 Spring Cloud 原生生态,那么除了需要在
facility-spring-boot-starter
模块中修改依赖以外,还需要将在herodotus-cloud-gateway
网关服务中依赖的facility-gateway-spring-boot-starter
注释掉或者删除。
[2]导入和修改配置文件
依赖模块修改完成之后,根据使用的生态导入对应的配置文件。Spring Cloud Tencent 使用的配置文件与 Spring Cloud Alibaba 生态使用的批量导入包格式不同。如果使用 Spring Cloud 原生生态,需要自己手动导入相关配置。
配置文件以及导入包,在工程 ${project_home}/configurations/backup
目录下可以找到。
导入完成之后,根据实际情况修改配文件中的参数。
[3]修改pom.xml配置
找到工程根目录下的 pom.xml
,找到 <profiles>
节点,根据自己使用的多环境,修改对应的配置参数,如下所示:
<profile>
<id>development</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--当前环境-->
<profile>development</profile>
<database>postgresql</database>
<!--基础设施:tencent、alibaba、original-->
<facility>alibaba</facility>
<!--代码构建控制-->
<!--跳过构建源代码包-->
<skip.build.source.package>false</skip.build.source.package>
<!--不copy代码包到docker构建目录-->
<skip.copy.docker.resource>false</skip.copy.docker.resource>
<!--不执行git commit 构建-->
<skip.build.git.commit.info>false</skip.build.git.commit.info>
<!--Spring Cloud Alibaba 配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<alibaba.namespace>00a14001-348d-40a7-82aa-e2e032f6e03c</alibaba.namespace>
<!--Spring Cloud Alibaba 鉴权用户名-->
<alibaba.username>nacos</alibaba.username>
<!--Spring Cloud Alibaba 鉴权密码-->
<alibaba.password>nacos</alibaba.password>
<!--Spring Cloud Alibaba 配置中心地址-->
<alibaba.config.server-addr>192.168.101.10:8848</alibaba.config.server-addr>
<!--Spring Cloud Alibaba 服务发现地址-->
<alibaba.discovery.server-addr>192.168.101.10:8848</alibaba.discovery.server-addr>
<alibaba.sentinel.server-addr>192.168.101.10:8858</alibaba.sentinel.server-addr>
<tencent.polaris.namespace>herodotus-reactive</tencent.polaris.namespace>
<!--Spring Cloud Tencent 配置 【(8091)grpc/tcp,默认注册中心端口;(8090)http/tcp,默认注册中心端口】-->
<tencent.polaris.server-addr>192.168.101.10:8091</tencent.polaris.server-addr>
<!--Spring Cloud Tencent Config 配置 【(8093)grpc/tcp,默认配置中心端口】-->
<tencent.polaris.config-addr>192.168.101.10:8093</tencent.polaris.config-addr>
<!--Spring Cloud Tencent 本地缓存目录-->
<tencent.polaris.local.dir>./configurations/backup/cache</tencent.polaris.local.dir>
<!--Spring Cloud Tencent 动态配置数据源类型 polaris: 从北极星服务端获取配置文件 local: 从本地磁盘读取配置文件-->
<tencent.polaris.data.source>polaris</tencent.polaris.data.source>
</properties>
</profile>
注意
上面的参数,结合实际修改即可。需要注意的是 <facility>
参数。
<facility>
参数,有三个值,不要写错:
alibaba
: 对应 Spring Cloud Alibaba 生态tencent
: 对应 Spring Cloud Tencent 生态original
: 对应 Spring Cloud 原生生态
[4]重新编译代码
因更换了基础依赖之后,工程代码中的依赖以及静态的配置都出现了变化。所以,在运行之前,需要重新编译工程代码。
注
如果您本地开发使用的 IDEA,那么在编译代码之前,记得手动在 Maven 面板中刷新几次,让修改后的依赖生效。