使用Spring Cloud Huawei接入CSE主要步骤可以归纳为如下两个步骤:
1. 增加/修改组件依赖。
2. 在配置文件“boostrap.yaml”中增加CSE配置信息。
具体操作,请参考Spring Cloud接入CSE。本章节补充在实际改造过程中需要注意的 一些事项,特别是组件依赖有关的注意事项。
假设原来的业务系统都是基于Maven的项目。
第一步:熟悉原业务系统 pom 结构
Spring Cloud应用系统的pom结构一般分三种:
● 第一种使用Spring Boot或者Spring Cloud提供的公共pom作为parent,例如:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
或者:
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-build</artifactId>
<version>2.2.3.RELEASE</version>
</parent>
● 第二种使用项目本身的parent,不使用Spring Boot或者Spring Cloud提供的公共 pom作为parent。但是在项目中,通过dependency management引入了依赖管 理,例如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
● 还有些应用系统会混合使用第一种和第二种,既使用了Spring Boot或者Spring Cloud提供的公共pom作为parent,又通过dependency management引入了依赖 管理。
第二步:修改 parent 和 dependency management 避免三方软件冲突
parent和dependency management的修改是避免三方软件冲突的关键步骤。
1. 首先确定选用的Spring Cloud Huawei的版本,然后查询Spring Cloud Huawei版 本对应的Spring Boot版本和Spring Cloud版本。Spring Cloud Huawei一般建议使 用当前最新版本,配套的Spring Boot版本和Spring Cloud版本可以在Spring Cloud Huawei官网查询。
2. 比对当前项目parent的版本与Spring Cloud Huawei配套的Spring Boot版本和 Spring Cloud版本,如果当前项目的parent版本比较低,修改为Spring Cloud Huawei的版本;如果当前版本的parent版本比较高,则无需修改。
3. 在当前项目的dependency management中独立引入Spring Boot、Spring Cloud、Spring Cloud Huawei的依赖管理。如果原来项目的Spring Boot或者 Spring Cloud版本比较高,使用原来项目的版本;如果原来项目的版本比较低,
则使用Spring Cloud Huawei的版本。需要注意依赖管理的顺序,排在前面的依赖 管理会优先使用。Spring Boot、Spring Cloud的版本是基础,被这两个依赖关系 管理的软件,建议都不提供额外的依赖管理,跟随社区的版本,可以有效减少冲 突。这里之所以把3个依赖关系独立出来引入,是为了给以后独立升级其中一个组 件提供便利。
<dependencyManagement>
<dependencies>
<!-- configure user spring cloud / spring boot versions -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- configure spring cloud huawei version -->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-huawei-bom</artifactId>
<version>${spring-cloud-huawei.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果业务系统集成了Spring Cloud Alibaba等依赖关系,在dependency management删除;一些已经被Spring Boot、Spring Cloud管理的不必要的依 赖,也建议删除。常见的需要删除的依赖管理有:
<dependencyManagement>
<dependencies>
<!-- 第三方扩展的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 已经被Spring Cloud管理的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
第三步:添加/删除依赖
添加的是服务注册发现、集中配置管理、服务治理相关的组件,删除的也是这些组件 的第三方实现。这些功能以外的其他组件不需要变化,但需要关注Spring Boot、
Spring Cloud版本升级后,这些软件可能需要配套升级。兼容性的问题通常会在编译 阶段或者服务启动阶段发现。
添加依赖一般不指定版本号,把版本号交给parent和dependency management管理。
在微服务应用中引入:
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
</dependency>
在 Spring Cloud Gateway应用中引入:
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-service-engine-gateway</artifactId>
</dependency>
如果存在下面这些依赖,需要删除:
<!-- nacos场景 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>spring-cloud-gateway-starter-ahas-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>spring-boot-starter-ahas-sentinel-client</artifactId>
</dependency>
<!-- eureka场景 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
通常下面的一些依赖,不需要删除:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.28</version>
</dependency>
主要的开源社区,例如Spring Boot、Spring Cloud等都会维护多个版本分支。以 Spring Cloud为例,存在Hoxton、Greenwich、2020.0.x等分支,其中大部分分支都已 经停止维护。开源软件多数维护的分支存在两个:一个为最新版本的开发分支;一个