SpringCloud Alibaba 微服务实战二十二 - 整合 Dubbo

本贴最后更新于 1442 天前,其中的信息可能已经事过景迁

概述

在 Spring Cloud 构建的微服务系统中,大多数的开发者使用都是官方提供的 Feign 组件来进行内部服务通信,这种声明式的 HTTP 客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用 Feign 消费服务的时候,相比较 Dubbo 这种 RPC 框架而言,性能较差。

虽说在微服务架构中,会讲按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用 HTTP 这种简答的通信机制,大多数情况都会使用 REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP 并不会开启 KeepAlive 功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立 TCP 连接,这使得其效率变的相当低下。

对外部提供 REST API 服务是一件非常好的事情,但是如果内部调用也是使用 HTTP 调用方式,就会显得显得性能低下,Spring Cloud 默认使用的 Feign 组件进行内部服务调用就是使用的 HTTP 协议进行调用,这时,我们如果内部服务使用 RPC 调用,对外使用 REST API,将会是一个非常不错的选择,恰巧,Dubbo Spring Cloud 给了我们这种选择的实现方式。

以上内容摘自官网。

这里我觉得还有另外一个点也是需要大家考虑的,很多公司在早期已经基于 dubbo 构建了很多底层微服务,如果全部使用 cloud 架构进行迁移相对比较麻烦,如果在 cloud 中能直接集成 dubbo 就简单多了。

之前的文章我们已经实现了从 Order-service 使用 feign 调用 Account-Serviice,本章内容我们来实现使用 dubbo 调用 Account-Dubbo,最后通过 Jmeter 对接口进行性能测试看看两者之间的性能差距。

image.png

实现 Dubbo 生产者

  • 在项目中建立服务模块 account-dubbo,在 account-dubbo 中再建立两个模块 dubbo-apidubbo-provider 模块。

    image.png

  • dubbo-provider 的 pom 文件中添加 Dubbo Spring Cloud 的关键依赖。

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:这里不能直接使用 dubbo 的原生 jar,并且需要引入 nacos 注册中心,需要将 dubbo 注册到 springcloud 的注册中心上

  • 修改 dubbo-provider 项目的配置文件 application.properties
spring.cloud.nacos.discovery.server-addr = 10.0.23.48:8848
dubbo.application.id = account-dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20881
dubbo.scan.base-packages = com.javadaily.dubbo.service
dubbo.registry.address = spring-cloud://localhost
spring.application.name = account-dubbo
dubbo.registry.check = false
dubbo.consumer.check = false
dubbo.cloud.subscribed-services = order-service

这里使用 dubbo.registry.address 将 dubbo 注册到了 springcloud 的注册中心上。

  • dubbo-api 中添加服务接口,为了后面的性能测试我们这里使用 Account-Service 一样的接口。
public interface AccountService {
    AccountDTO getByCode(String accountCode);
}
  • dubbo-provider 中实现该接口(mybatis 的相关配置略...)
@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountMapper accountMapper;

    @Override
    public AccountDTO getByCode(String accountCode) {
        AccountDTO accountDTO = new AccountDTO();
        Account account = accountMapper.selectByCode(accountCode);
        BeanUtils.copyProperties(account,accountDTO);
        return accountDTO;
    }
}

注意这里的 @Service 注解使用的是 org.apache.dubbo.config.annotation.Service,不是 Spring 原生的 Service 注解。

  • dubbo-provider 中添加主启动类,并添加 EnableDubbo 注解
@SpringBootApplication
@EnableDubbo
public class AccountDubboApplication {
    public static void main(String[] args) {
        SpringApplication.run(AccountDubboApplication.class, args);
    }
}
  • 启动 dubbo 服务,查看注册中心中是否正常注册。

image.png

Order-Service 消费方修改

  • 引入 dubbo 相关依赖
<!--dubbo-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>


<dependency>
	<groupId>com.jianzh5.cloud</groupId>
	<artifactId>dubbo-api</artifactId>
	<version>1.0.0</version>
</dependency>
  • 修改消费方配置文件,增加 dubbo 的配置参数
dubbo:
  registry:
    address: spring-cloud://localhost
  cloud:
    subscribed-services: account-dubbo
  consumer:
    check: false

由于 Order-Service 不需要对外提供 RPC 服务所以这里只需要配置 dubbo 的注册中心即可。

通过 dubbo.cloud.subscribed-services 配置生成者的服务 id,默认是 * 即注册所有,此选项建议配置。

  • 修改消费逻辑,使用 dubbo 调用。
@Slf4j
@RestController
public class FeignController {
   
    @Reference
    private AccountService accountService;

    @GetMapping("/order/getAccount/{accountCode}")
    public ResultData<AccountDTO> getAccount(@PathVariable String accountCode){

        AccountDTO accountDTO = accountService.getByCode(accountCode);

        return ResultData.success(accountDTO);
    }

}

通过 org.apache.dubbo.config.annotation.Reference 引入 dubbo 服务即可。

通过以上几步我们完成了 SpringCloud 与 Dubbo 的整合,大家自行测试即可。接下来我们看看两者之间的性能差异。

性能测试

测试效果是在楼主笔记本上测试的,在高配置上效果差异会更明显。

配置:Intel Core i5-7200U CPU @ 2.50GHz 2.70GHz 6 核 16G 内存

测试工具: JMeter5.1

线程数:1000

Ramp-Up : 10

image.png

dubbo 调用效果

image.png

平均响应时间 吞吐量 最小响应时间 最大响应时间
488ms 95.8/sec 16ms 2970ms

feign 调用效果

image.png

平均响应时间 吞吐量 最小响应时间 最大响应时间
3213ms 75.1/sec 108ms 6097ms

通过上面的测试结果可以看出两者的性能差距,feign 的性能明显落后 dubbo 很多,对于追求性能的应用来说还是建议使用 dubbo 进行 RPC 调用。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
2 操作
jianzh5 在 2020-12-10 10:35:59 更新了该帖
jianzh5 在 2020-12-08 14:39:58 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...