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来实现客户端代码的替换。总体工作量和接口数量成正比。

详细改造方案

在下面的描述中,以

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

重点是启用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最近实践”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盈梓的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值