HSF迁移Spring Cloud方案分析和最佳实践
HSF常见云原生架构
HSF是私有RPC协议,并且不开源,一般被用来开发后端服务。将HSF技术栈迁移到Spring Cloud技术栈的主要任务,就是将后端HSF服务改造为Spring Cloud服务。
为了让迁移后的Spring Cloud能够使用CSE功能,后面描述的方案使用了Spring Cloud Huawei,并且使用Spring Cloud 2020.0.x版本。
工作量评估
HSF提供的主要功能是RPC框架,以及在RPC框架之上,提供相关的服务治理能力,包括注册发现、动态配置和限流熔断等。Spring Cloud提供REST框架,并在REST框架基础之上提供服务治理能力。因此主要改造的工作量是将RPC框架修改为REST框架,包含两部分:(1)将服务端的接口定义由RPC修改为REST;(2)将客户端的调用方式由RPC修改为REST风格(包括RestTemplate,Feign等)。服务端的接口定义相对比较集中,客户端的使用则比较难于排查。为了尽可能减少客户端代码的排查和修改,采用Feign来实现客户端代码的替换。总体工作量和接口数量成正比。
详细改造方案
在下面的描述中,以
为原始输入。这是一个HSF的微服务例子,我们将其整改为Spring Cloud。
修改完成后的 Spring Cloud 项目参考:
修改过程详细记录参考,在阅读下面的改造步骤的过程中,建议打开下面的链接,查看详细的修改情况:
修改POM和项目结构
- 删除 HSF 相关的依赖,并引入 Spring Cloud Huawei 相关依赖。
详细可以参考修改过程详细记录。下面列出几个关键点:
删除的依赖主要包括:
<artifactId>taobao-hsf.sar</artifactId>
<artifactId>pandora-hsf-spring-boot-starter</artifactId>
<artifactId>pandora-boot-test</artifactId>
删除的dependency management主要包括:
<artifactId>pandora-boot-starter-bom</artifactId>
增加的依赖主要包括:
<artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
增加的dependency management主要包括:
<artifactId>spring-cloud-dependencies</artifactId>
<artifactId>spring-cloud-huawei-bom</artifactId>
- 为了减少客户端重复代码,抽取出一个 api 项目,将 REST 接口定义放到一个公共项目。
为了达到这个目的,新建一个父目录,将 hsf-pandora-boot-provider 和 hsf-pandora-boot-consumer 放到子目录,并新建一个 hsf-pandora-boot-api 目录。并将公共接口 HelloService移动到 hsf-pandora-boot-api 目录。hsf-pandora-boot-provider 和 hsf-pandora-boot-consumer都依赖 hsf-pandora-boot-api。
服务端RPC接口修改为REST接口
- 将 api打上REST标签
新版本Spring Boot支持将REST标签定义在接口上。这样有个好处,就是客户端Feign和服务端RestController都可以复用这些打好REST标签的接口,不用重复定义。注意接口不能够使用@RequestMapping声明。
public interface HelloService { @PostMapping(value = "/echo") @ResponseBody String echo(@RequestParam("name") String string); } |
- 将实现使用@RestController发布为接口
需要打上@RestController标签和@RequestMapping标签。
@RestController @RequestMapping("/hello") public class HelloServiceImpl implements HelloService { @Override public String echo(String string) { return string; } } |
客户端定义Feign引用
- 删除HSF的引用定义
@Configuration public class HsfConfig { @HSFConsumer(clientTimeout = 3000, serviceVersion = "1.0.0") private HelloService helloService; } |
- 增加Feign的定义
Feign的定义需要增加服务名、根路径等信息。根路径和服务端的@RequestMapping定义一致。
@FeignClient(name = "hsf-pandora-boot-provider", contextId = "helloServiceFeignClient", path = "/hello") public interface HelloServiceFeignClient extends HelloService { } |
- 客户端调用的地方和HSF保持一致。
通过步骤1和步骤2的处理,可以保持客户端调用的地方和HSF一致。从而不用排查业务代码使用的地方,降低客户端代码修改的风险。
@Autowired private HelloService helloService;
@RequestMapping(value = "/hsf-echo/{str}", method = RequestMethod.GET) public String echo(@PathVariable String str) { return helloService.echo(str); } |
删除HSF配置并增加Spring Cloud配置
- 删除HSF相关配置
主要的配置包括application.properties
spring.hsf.version=1.0.0 spring.hsf.timeout=1000 |
- 增加Spring Cloud配置
Spring Cloud需要在bootstrap.yml中配置注册中心、配置中心等信息。为了方便和避免重复,将spring.application.name配置项也放到bootstrap.yml里面。
spring: application: name: hsf-pandora-boot-consumer cloud: servicecomb: discovery: enabled: true # address: https://cse.cn-south-1.myhuaweicloud.com address: http://127.0.0.1:30100 appName: hsf-application serviceName: ${spring.application.name} version: 0.0.1 healthCheckInterval: 30 config: # serverAddr: https://cse.cn-south-1.myhuaweicloud.com serverAddr: http://127.0.0.1:30113 |
修改启动类
- 删除pandora相关代码
// 启动 Pandora Boot 用于加载 Pandora 容器 PandoraBootstrap.run(args); -- 删除 SpringApplication.run(HSFProviderApplication.class, args); // 标记服务启动完成,并设置线程 wait。防止用户业务代码运行完毕退出后,导致容器退出。 PandoraBootstrap.markStartupAndWait(); --删除 |
- 增加Spring Cloud的注解
重点是启用DiscoveryClient和FeignClient。
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class HSFConsumerApplication { public static void main(String[] args) { SpringApplication.run(HSFConsumerApplication.class, args); } } |
运行改造完成后的Spring Cloud应用
通过链接下载: https://support.huaweicloud.com/devg-servicestage/ss-devg-0034.html
Local-CSE-1.0.3版本,并本地启动。然后启动 HSFProviderApplication 和 HSFConsumerApplication。 通过浏览器访问:http://localhost:8086/hsf-echo/hello , 可以得到结果 hello 。
其他可能问题
实际项目中,可能还会存在其他问题,比如使用了HSF的API需要替换、三方软件升级导致版本不兼容。一些问题需要具体分析,三方件兼容性和依赖关系管理,可以参考“Spring Cloud应用使用CSE最近实践”。
参考材料
CSE开发简介: https://support.huaweicloud.com/devg-servicestage/ss-devg-0002.html
Spring Cloud应用使用CSE最近实践:https://support.huaweicloud.com/bestpractice-servicestage/servicestage_bestpractice_0125.html
Spring Cloud Huawei和Spring Cloud版本配套关系: https://github.com/huaweicloud/spring-cloud-huawei
- 点赞
- 收藏
- 关注作者
评论(0)