HSF迁移Spring Cloud方案分析和最佳实践

举报
liubao68 发表于 2021/09/02 20:45:04 2021/09/02
【摘要】 HSF提供的主要功能是RPC框架,以及在RPC框架之上,提供相关的服务治理能力,包括注册发现、动态配置和限流熔断等。Spring Cloud提供REST框架,并在REST框架基础之上提供服务治理能力。本文描述将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风格(包括RestTemplateFeign等)。服务端的接口定义相对比较集中,客户端的使用则比较难于排查。为了尽可能减少客户端代码的排查和修改,采用Feign来实现客户端代码的替换。总体工作量和接口数量成正比。


详细改造方案

在下面的描述中,以

https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/microservice-doc-demo/hsf-pandora-boot

为原始输入。这是一个HSF的微服务例子,我们将其整改为Spring Cloud

修改完成后的 Spring Cloud 项目参考:

https://github.com/huaweicloud/spring-cloud-huawei-samples/tree/master/migrate/hsf/hsf-pandora-boot-springcloud

修改过程详细记录参考,在阅读下面的改造步骤的过程中,建议打开下面的链接,查看详细的修改情况:

https://github.com/huaweicloud/spring-cloud-huawei-samples/commit/36b3b218c2f3127c0e168b1e9ec08ea2e7e08f17#diff-280ef770bdb2e578d698e03d5f34033983b3d2b8db9a3e17daabdcfabaacbf24

 

修改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的注解

重点是启用DiscoveryClientFeignClient

@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

其他可能问题

实际项目中,可能还会存在其他问题,比如使用了HSFAPI需要替换、三方软件升级导致版本不兼容。一些问题需要具体分析,三方件兼容性和依赖关系管理,可以参考“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 HuaweiSpring Cloud版本配套关系: https://github.com/huaweicloud/spring-cloud-huawei

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。