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。
前提条件
- 已基于Spring Cloud开发好了微服务应用。
Spring Cloud微服务框架下的微服务应用开发,请参考https://spring.io/projects/spring-cloud。
- 版本要求:版本要求请参见微服务开发框架版本要求。
- 本文假设您的项目使用了maven管理打包,您熟悉maven的依赖管理机制,能够正确的修改pom.xml文件中的dependency management和dependency。
操作步骤
- 在项目的“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>
- 如果使用Spring Cloud开发微服务,引入:
- 配置微服务信息。
在“bootstrap.yml”增加微服务描述信息。如果项目中没有“bootstrap.yml”,则创建一个新的文件。
spring: application: name: basic-provider cloud: servicecomb: discovery: enabled: true address: http://127.0.0.1:30100 appName: basic-application serviceName: ${spring.application.name} version: 0.0.1 healthCheckInterval: 15 config: serverAddr: http://127.0.0.1:{port} serverType: {servertype}
- healthCheckInterval参数配置值的单位为秒。
- 当微服务引擎版本为1.x时,{port}取值为30103,{servertype}取值为config-center。
- 当微服务引擎版本为2.x时,{port}取值为30110,{servertype}取值为kie或config-center,推荐使用kie作为配置中心。
- (可选)配置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: 项目名称 #请输入已获取的项目名称
- 自定义实现
- 首先实现接口“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
- 自定义完成,即可在“bootstrap.yaml”文件中使用新增加的解密算法:
spring: cloud: servicecomb: credentials: enabled: true accessKey: AK #请输入已获取的AK值 secretKey: SK #请输入对应的已加密后的SK akskCustomCipher: youciphername #请输入实现类里面的name()方法返回的名称 project: 项目名称 #请输入已获取的项目名称
如果不想将AK/SK写入配置文件,也可以使用为微服务添加环境变量的方法来配置AK/SK,具体操作请参考方法二。
- 首先实现接口“com.huaweicloud.common.util.Cipher”,里面有两个方法:
- 明文方法,在“bootstrap.yml”文件中增加配置。
- (可选)配置安全认证参数。
使用微服务引擎专享版,并且启用了安全认证,需要配置,其他场景可以跳过这个步骤。
微服务引擎开启了安全认证之后,所有调用的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
- 明文方法