更新时间:2024-10-23 GMT+08:00

Spring Cloud接入CSE

本章节介绍Spring Cloud如何接入CSE,使得Spring Cloud能够对接CSE,并且方便地使用CSE提供的最常用的功能。在使用微服务引擎功能章节,会给出具体的开发指导。

本章节介绍的开发方法,可以在Spring Cloud Huawei Samples项目中找到对应的代码,供您在开发过程中参考。

Spring Cloud接入CSE需要使用Spring Cloud Huawei,本文主要描述如何在Spring Cloud中集成和使用Spring Cloud Huawei。

前提条件

  • 版本要求:版本要求请参见微服务开发框架版本要求
  • 本文假设您的项目使用了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>
      

      上述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>

      上述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>

    如果您的项目中,已经包含了上述依赖,则不需要做任何处理。

    如果您的项目中使用了其他注册发现库,比如eureka,需要对项目进行适当调整,包括:

    • 删除项目中eureka相关依赖,比如:
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
    • 如果代码中使用了@EnableEurekaServer, 需要删除并替换为@EnableDiscoveryClient。

      组件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

    表1 Spring 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.config.dashboard.enabled

    是否开启仪表盘功能。

    false

    -

    spring.cloud.servicecomb.config.dashboard.address

    仪表盘服务端地址,端口为30109。

    -

    -

    bootstrap.yml在应用程序的引导阶段先于application.yml被加载,在启动应用时所必须的基本的配置中心地址和认证信息等建议配置在bootstrap.yml,配置在application.yml中可能导致应用启动失败。

  3. (可选)配置AK/SK。

    如果使用微服务引擎专业版,需要配置AK/SK;如果使用微服务引擎专享版,不需要配置AK/SK,可以跳过这个步骤。

    AK/SK在“bootstrap.yml”中配置,默认提供明文配置,也支持用户自定义加密存储。AK/SK与项目名称获取方法,请参考获取AK/SK与项目名称

    • 明文方法,在“bootstrap.yml”文件中增加配置。
      spring: 
        cloud: 
          servicecomb: 
            credentials:
              enabled: true
              accessKey: AK #请输入已获取的AK值
              secretKey: SK #请输入已获取的SK值
              akskCustomCipher: default
              project: 项目名称 #请输入已获取的项目名称
    • 自定义实现
      1. 首先实现接口“com.huaweicloud.common.util.Cipher”,里面有两个方法:
        • String name(),这个是spring.cloud.servicecomb.credentials.akskCustomCipher的名称定义,需要配置在配置文件中。
        • char[] decode(char[] encrypted),解密接口,对secretKey进行解密后使用。
        public class CustomCipher implements Cipher

        加密解密的实现需要作为BootstrapConfiguration,首先声明:

        @Configuration
        public class MyAkSKCipherConfiguration {
          @Bean
          public Cipher customCipher() {
            return new CustomCipher();
          }
        }

        然后增加文件 “META-INF/spring.factories”定义配置:

        org.springframework.cloud.bootstrap.BootstrapConfiguration=\
        com.huaweicloud.common.transport.MyAkSKCipherConfiguration
      2. 自定义完成,即可在“bootstrap.yaml”文件中使用新增加的解密算法:
        spring:
          cloud:
            servicecomb:
              credentials:
                enabled: true
                accessKey: AK #请输入已获取的AK值
                secretKey: SK #请输入对应的已加密后的SK
                akskCustomCipher: youciphername  #请输入实现类里面的name()方法返回的名称
                project: 项目名称 #请输入已获取的项目名称

        如果不想将AK/SK写入配置文件,也可以使用为微服务添加环境变量的方法来配置AK/SK,具体操作请参考方法二

  4. (可选)配置安全认证参数。

    使用微服务引擎专享版,并且启用了安全认证,需要配置,其他场景可以跳过这个步骤。

    微服务引擎开启了安全认证之后,所有调用的API都需要先获取token才能调用,认证流程请参考服务中心RBAC说明

    使用安全认证首先需要从微服务引擎获取用户名和密码,然后在配置文件中增加如下配置。和配置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: 自定义算法名称

    使用RBAC功能,需要1.6.0-Hoxton及以上版本。

    使用微服务引擎专业版,不能使用watch功能,需要在配置文件里面关闭,否则会周期性打印错误日志。服务中心设置watch=false。1.6.0-Hoxton及以上版本默认没有开启watch功能,不需要设置。

    spring:
      cloud:
        servicecomb:
          discovery:
            watch: false