
# 快速接入ServiceComb引擎
使用Spring Cloud Huawei接入ServiceComb引擎主要步骤可以归纳为如下两个步骤：
1. 增加/修改组件依赖。
2. 在配置文件"boostrap.yaml"中增加ServiceComb引擎配置信息。
具体操作，请参考[Spring Cloud接入ServiceComb引擎](https://support.huaweicloud.com/devg-cse/cse_04_0009.html)。本章节补充在实际改造过程中需要注意的一些事项，特别是组件依赖有关的注意事项。
假设原来的业务系统都是基于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官网](https://github.com/huaweicloud/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>
```
