
# Spring Cloud接入CSE
本章节介绍Spring Cloud如何接入CSE，使得Spring Cloud能够对接CSE，并且方便地使用CSE提供的最常用的功能。在[使用微服务引擎功能](https://support.huaweicloud.com/devg-servicestage/cse_04_0012.html)章节，会给出具体的开发指导。
本章节介绍的开发方法，可以在[Spring Cloud Huawei Samples](https://github.com/huaweicloud/spring-cloud-huawei-samples/tree/master/basic)项目中找到对应的代码，供您在开发过程中参考。
![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
Spring Cloud接入CSE需要使用Spring Cloud Huawei，本文主要描述如何在Spring Cloud中集成和使用Spring Cloud Huawei。
#### 前提条件
- 已基于Spring Cloud开发好了微服务应用。 Spring Cloud微服务框架下的微服务应用开发，请参考<https://spring.io/projects/spring-cloud>。
  
 
- 版本要求：版本要求请参见[微服务开发框架版本要求](https://support.huaweicloud.com/devg-servicestage/cse_04_0005.html#cse_04_0005__section56161456192411)。
- 本文假设您的项目使用了maven管理打包，您熟悉maven的依赖管理机制，能够正确地修改pom.xml文件中的dependency management和dependency。
#### 操作步骤
1. 在项目的"pom.xml"文件中引入依赖。 
   - 如果使用Spring Cloud开发微服务，引入：
     ```
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
     </dependency>
     ```
     ![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
     上述spring-cloud-starter-huawei-service-engine模块包含以下依赖模块：
     ```
     <!--  注册发现模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-discovery</artifactId>
     </dependency>
     <!--  配置中心模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-config</artifactId>
     </dependency>
     <!--  服务治理模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-governance</artifactId>
     </dependency>
     <!--  灰度发布模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-router</artifactId>
     </dependency>
     ```
     
   
   - 如果使用Spring Cloud Gateway开发网关，引入：
     ```
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-service-engine-gateway</artifactId>
     </dependency>
     ```
     ![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
     上述spring-cloud-starter-huawei-service-engine-gateway模块包含以下依赖模块：
     ```
     <!--  注册发现模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-discovery</artifactId>
     </dependency>
     <!--  配置中心模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-config</artifactId>
     </dependency>
     <!--  服务治理模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-governance</artifactId>
     </dependency>
     <!--  灰度发布模块  -->
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-router</artifactId>
     </dependency>
     <!--  网关模块  -->
     <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-gateway</artifactId>
     </dependency>
     ```
     推荐使用Maven Dependency Management管理项目依赖的三方软件，在项目中引入：
     ```
     <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-boot.version、spring-cloud.version、spring-cloud-huawei.version的版本取值要求，请参考[微服务开发框架版本要求](https://support.huaweicloud.com/devg-servicestage/cse_04_0005.html#cse_04_0005__section56161456192411)。如果您的项目中，已经包含了上述依赖，则不需要做任何处理。
   如果您的项目中使用了其他注册发现库，比如eureka，需要对项目进行适当调整，包括：
   - 删除项目中eureka相关依赖，比如：
     ```
     <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
     </dependency>
     ```
     
   
   
   
   - 如果代码中使用了@EnableEurekaServer， 需要删除并替换为@EnableDiscoveryClient。
     ![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
     组件spring-cloud-starter-huawei-service-engine包含了服务注册、配置中心、服务治理、灰度发布、契约管理等功能。其中契约管理对于Spring Cloud微服务应用的运行不是必须的。微服务引擎对契约个数存在数量限制，当微服务应用契约个数超过限制，会注册失败。如果遗留系统无法进行合理的拆分减少契约个数，可以排除依赖，不使用契约管理功能。
     ```
     <dependency>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
       <exclusions>
     <exclusion>
       <groupId>com.huaweicloud</groupId>
       <artifactId>spring-cloud-starter-huawei-swagger</artifactId>
     </exclusion>
       </exclusions>
     </dependency>
     ```
     
   
   
   
   
2. 配置微服务信息。 
   在"bootstrap.yml"增加微服务描述信息。如果项目中没有"bootstrap.yml"，则创建一个新的文件。
   ```
   spring:
     application:
       name: basic-provider
     cloud:
       servicecomb:
         service:
           name: ${spring.application.name}
           application: basic-application
           environment: production
         discovery:
           enabled: true
           healthCheckInterval: 15
           pollInterval: 15000
           waitTimeForShutDownInMillis: 15000
           address: http://127.0.0.1:30100
           appName: basic-application  
           version: 0.0.1
         config:
           enabled: true
           kie:
             customLabel: default
             customLabelValue: default
           serverAddr: http://127.0.0.1:{port}
           serverType: {servertype}
           fileSource: governance.yaml
         dashboard:
           enabled: false
           address: http://127.0.0.1:30109
   ```
   其中，各个配置项说明见[表1]。
    表1Spring Cloud配置项 
   | 配置项                                                            | 含义                                                                  | 缺省值           | 是否必须配置 | 备注                                                                                                                                                                                                                                      |
   |:---|:---|:---|:---|:---|
   | spring.application.name                                        | 应用名称。                                                               | -             | 是      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.service.name                          | 微服务名称。                                                              | -             | 否      | 不填则为配置的spring.application.name值，Spring Cloud Huawei框架版本1.10.2-2021.0.x及之前是通过spring.cloud.servicecomb.discovery.serviceName配置。                                                                                                           |
   | spring.cloud.servicecomb.service.application                   | 为当前微服务所属应用名称。                                                       | default       | 否      | 应用名称相同的微服务之间才可以相互发现，建议每个业务定义一个名称，这样可以做到服务发现隔离，Spring Cloud Huawei框架版本1.10.2-2021.0.x及之前通过spring.cloud.servicecomb.discovery.appName配置。                                                                                                  |
   | spring.cloud.servicecomb.service.environment                   | 微服务注册环境。                                                            | \<空\>         | 否      | 环境名称相同的微服务之间才可以相互发现，Spring Cloud Huawei框架版本1.10.2-2021.0.x及之前通过server.env配置。 取值为环境ID。支持取值为development、testing、acceptance、production。                                                                       |
   | spring.cloud.servicecomb.discovery.enabled                     | 是否开启服务发现能力。                                                         | true          | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.healthCheckInterval         | 心跳检测时间，单位为秒。                                                        | 15            | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.pollInterval                | 拉取实例的轮询时间，单位为毫秒。                                                    | 15000         | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.waitTimeForShutDownInMillis | 无损下线等待时长，服务停止时先从注册中心注销自己，等waitTimeForShutDownInMillis时间后容器退出，单位为毫秒。 | 15000         | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.address                     | 注册发现地址。                                                             | -             | 是      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.appName                     | 服务名称。                                                               | -             | 是      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.discovery.version                     | 服务版本号。                                                              | 1.0.0.0       | 是      | 服务升级时需要，防止契约注册失败。                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.config.enabled                        | 是否启用动态配置。                                                           | true          | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.config.kie.customLabel                | 自定义配置标签键值。                                                          | -             | 否      | 当配置中心类型为kie时，如果使用自定义标签方式下发配置，需要配置customLabel、customLabelValue，微服务名、环境名、应用名标签仅支持单独适配。                                                                                                                                                    |
   | spring.cloud.servicecomb.config.kie.customLabelValue           | 为自定义配置标签值。                                                          | -             | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.config.serverAddr                     | 配置中心地址。                                                             | -             | 是      | - 当微服务引擎版本为1.x时，{*port*}取值为30103。  - 当微服务引擎版本为2.x时，{*port*}取值为30110。                  |
   | spring.cloud.servicecomb.config.serverType                     | 配置中心类型。                                                             | config-center | 是      | - 当微服务引擎版本为1.x时，取值为config-center。  - 当微服务引擎版本为2.x时，取值为kie或config-center，推荐使用kie作为配置中心。   |
   | spring.cloud.servicecomb.config.fileSource                     | 内容为yaml的配置项列表，使用","分隔。                                              | -             | 否      | 当配置中心类型为config-center时，如果配置中心以配置文件形式下发配置，必须填写fileSource值予以解析配置，否则无法获取正确的配置内容。                                                                                                                                                           |
   | spring.cloud.servicecomb.dashboard.enabled                     | 是否开启仪表盘功能。                                                          | false         | 否      | -                                                                                                                                                                                                                                       |
   | spring.cloud.servicecomb.dashboard.address                     | 仪表盘服务端地址，端口为30109。                                                  | -             | 否      | -                                                                                                                                                                                                                                       |
      
   ![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
   bootstrap.yml在应用程序的引导阶段先于application.yml被加载，在启动应用时所必须的基本的配置中心地址和认证信息等建议配置在bootstrap.yml，配置在application.yml中可能导致应用启动失败。
   
   
3. （可选）配置AK/SK。 
   如果使用微服务引擎专业版，需要配置AK/SK，请参考[为接入专业版微服务引擎的Spring Cloud微服务应用配置AK/SK](https://support.huaweicloud.com/devg-servicestage/cse_04_0043.html)。
   如果使用微服务引擎专享版，不需要配置AK/SK，可以跳过这个步骤。
   
   
4. （可选）配置安全认证参数。 
   使用微服务引擎专享版，并且启用了安全认证，需要配置，其他场景可以跳过这个步骤。
   微服务引擎开启了安全认证之后，所有调用的API都需要先获取token才能调用，认证流程请参考[服务中心RBAC说明](https://service-center.readthedocs.io/en/latest/user-guides/rbac.html)。
   使用安全认证首先需要从微服务引擎获取用户名和密码，然后在配置文件中增加如下配置。和配置AK/SK一样，password默认明文存储，开发者可以自定义password的加密存储算法。
   - 明文方法
     ```
     spring:
       cloud:
         servicecomb:
           credentials:
             account:
               name:用户名
               password:密码
               cipher: default
     ```
     
   
   - 自定义实现加密存储算法
     首先实现接口com.huaweicloud.common.util.Cipher，里面有两个方法：
     String name()，这个是spring.cloud.servicecomb.credentials.cipher的名称定义，需要配置在配置文件中。
     char\[\] decode(char\[\] encrypted)，解密接口，对secretKey进行解密后使用。
     public class CustomCipher implements Cipher
     加密解密的实现需要作为BootstrapConfiguration，首先声明：
     ```
     @Configuration
     public class MyCipherConfiguration {
     @Bean
     public Cipher customCipher() {
     return new CustomCipher();
     }
     }
     ```
     然后增加文件 META-INF/spring.factories定义配置：
     ```
     org.springframework.cloud.bootstrap.BootstrapConfiguration=\
     com.huaweicloud.common.transport.MyCipherConfiguration
     ```
     自定义完成，即可在bootstrap.yaml文件中使用新增加的解密算法：
     ```
     spring:
       cloud:
         servicecomb:
           credentials:
             account:
               name:用户名
               password:密码
               cipher: 自定义算法名称
     ```
     
   
   
   ![](https://support.huaweicloud.com/devg-servicestage/public_sys-resources/note_3.0-zh-cn.png)
   使用RBAC功能，需要1.6.0-Hoxton及以上版本。
   使用微服务引擎专业版，不能使用watch功能，需要在配置文件里面关闭，否则会周期性打印错误日志。服务中心设置watch=false。1.6.0-Hoxton及以上版本默认没有开启watch功能，不需要设置。
   ```
   spring:
     cloud:
       servicecomb:
         discovery:
           watch: false
   ```
   
   
 
