服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?

微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?

2023-12-28 15:22HELLO程序员 Java教程

随着微服务架构的普及,服务间的通信和调用成为了关键问题。在SpringCloudAlibaba框架下,Feign和Dubbo是两种常用的服务调用组件。本文将对两者进行性能对比及区别分析。

概述

随着微服务架构的普及,服务间的通信和调用成为了关键问题。在SpringCloudAlibaba框架下,Feign和Dubbo是两种常用的服务调用组件。本文将对两者进行性能对比及区别分析。

一、Feign与Dubbo概述

Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过简单的注解,Feign将自动生成HTTP请求,使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架,提供了丰富的服务治理功能。

二、性能对比

  1. 调用性能:在单次调用方面,Feign的性能表现略逊于Dubbo。由于Feign的自动生成HTTP请求机制,其性能相较于Dubbo的直接RPC调用会有一定的损失。然而,对于大多数应用而言,这种性能差异并不明显。
  2. 负载均衡:Feign和Dubbo都提供了负载均衡功能。Feign使用Ribbon作为其负载均衡组件,而Dubbo则内置了负载均衡机制。在负载均衡方面,Dubbo提供了更多的配置选项和策略,具有更强的灵活性。
  3. 服务发现:Feign依赖于Eureka、Consul、Nacos等注册中心实现服务发现,而Dubbo则提供了内置的服务发现机制。在服务发现的性能和稳定性方面,Dubbo具有一定的优势。

三、区别分析

  1. 架构差异:Feign基于SpringCloud体系,更适用于微服务架构。而Dubbo则独立于任何框架,具有更强的通用性。
  2. 适用场景:对于简单的服务调用场景,Feign更加简洁易用。而当需要复杂的服务治理功能时,Dubbo则更具优势。
  3. 扩展性:Feign提供了丰富的注解和配置选项,可以轻松地与SpringCloud的其他组件集成。而Dubbo则提供了丰富的SPI机制,使得扩展更加灵活。
  4. 社区活跃度:Feign的社区相对活跃,随着SpringCloud的发展,Feign也在不断迭代和完善。Dubbo的社区虽然活跃度不如Feign,但凭借其多年的积累和沉淀,依然拥有大量的用户和稳定的支持者。

四、实战性能对比

引入SpringCloud的pom集成dubbo

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.7</version>
    <relativePath/> 
</parent>
<properties>
        <spring.boot.version>2.7.7</spring.boot.version>
        <alibaba.cloud.version>2021.0.4.0</alibaba.cloud.version>
        <spring.cloud.version>2021.0.5</spring.cloud.version>
</properties>
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${alibaba.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
</dependencyManagement>

创建公共API模块

public interface HelloService {
    void sayHello(Long timme);
}

创建服务生产者

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.2.7</version>
        </dependency>
        <dependency>
            <groupId>com.tiger</groupId>
            <artifactId>tiger-example-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

配置application.yml

### 服务端口号
server:
  port: 9800
#### nacos 注册中心地址
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  
  #### 服务名
  application:
    name: tiger-producer  
dubbo:
  application:
    # 关闭qos端口避免单机多生产者端口冲突 如需使用自行开启
    qos-enable: false
  registry:
    address: nacos://127.0.0.1:8848?username=nacos&password=nacos
    group: DEFAULT_GROUP
  protocol:
    # 如需使用 Triple 3.0 新协议 可查看官方文档
    # 使用 dubbo 协议通信
    name: dubbo
    # dubbo 协议端口(-1表示自增端口,从20880开始)
    port: -1


  # 消费者相关配置
  consumer:
    # 超时时间
    timeout: 3000
  scan:
    # 接口实现类扫描
    base-packages: com.tiger.**.dubbo

业务代码

@Service
@Slf4j
@DubboService
public class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello(Long time) {
        long startTime = System.currentTimeMillis();
        long elapsed = time - startTime;
        log.info("dubbo rpc 调用耗时 {}",elapsed);
    }
}

创建Application启动器

@EnableDubbo
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class);
    }
}

创建服务消费者

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.2.7</version>
        </dependency>
        <dependency>
            <groupId>com.tiger</groupId>
            <artifactId>tiger-example-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

配置application.yml

### 服务端口号
server:
  port: 9400
#### nacos 注册中心地址
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  
  #### 服务名
  application:
    name: tiger-consumer  
dubbo:
  application:
    # 关闭qos端口避免单机多生产者端口冲突 如需使用自行开启
    qos-enable: false
  registry:
    address: nacos://127.0.0.1:8848?username=nacos&password=nacos
    group: DEFAULT_GROUP
  protocol:
    # 如需使用 Triple 3.0 新协议 可查看官方文档
    # 使用 dubbo 协议通信
    name: dubbo
    # dubbo 协议端口(-1表示自增端口,从20880开始)
    port: -1
  # 消费者相关配置
  consumer:
    # 超时时间
    timeout: 3000
  scan:
    # 接口实现类扫描
    base-packages: com.tiger.**.dubbo

创建消费者调用代码

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/consumer/remoteTest")
public class RemoteController {


    @DubboReference
    private final HelloService helloService;


    private final ProducerFeign producerFeign;




    @GetMapping("dubboTest")
    public ResponseResult<?> dubboTest(){
        helloService.sayHello(System.currentTimeMillis());
        return ResponseResult.success();
    }


    @GetMapping("feignTest")
    public ResponseResult<?> feignTest(){
        producerFeign.sayHello(System.currentTimeMillis());
        return ResponseResult.success();
    }




}

创建Feign调用用于对比性能测试

@FeignClient("tiger-producer")
public interface ProducerFeign {


    @GetMapping("/producer/remoteTest/testFeign")
    void sayHello(@RequestParam Long time);


}

创建应用启动类

@EnableDubbo
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }


}

进行测试

http://localhost:9400/consumer/remoteTest/dubboTest
http://localhost:9400/consumer/remoteTest/feignTest

微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?图片

从调用时间上可见 Dubbo的性能确实比Feign的性能好上不少

总结

总的来说,基于SpringCloudAlibaba框架下,Feign和Dubbo各有千秋。选择使用哪一个组件取决于具体的项目需求和团队技术栈。对于需要快速构建微服务架构的项目,Feign是一个不错的选择;而对于需要更多自定义和服务治理功能的项目,Dubbo可能更适合。在实际应用中,也可以根据具体场景将两者结合使用,以达到更好的效果。

原文地址:https://mp.weixin.qq.com/s/0EdUE89XFMjykL34LYRLeA

延伸 · 阅读

精彩推荐
  • Java教程SpringBoot整合websocket实现即时通信聊天

    SpringBoot整合websocket实现即时通信聊天

    这篇文章主要介绍了SpringBoot整合websocket实现即时通信聊天,实时通信是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视...

    BreezAm4862022-12-08
  • Java教程浅谈java如何生成分享海报工具类

    浅谈java如何生成分享海报工具类

    这篇文章主要介绍了浅谈java如何生成分享海报工具类,想了解分享海报知识的同学不要错过哦...

    田三水5572021-09-02
  • Java教程在AOP中Spring生成代理类的两种方式

    在AOP中Spring生成代理类的两种方式

    今天小编就为大家分享一篇关于在AOP中Spring生成代理类的两种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    李灿辉9402021-06-30
  • Java教程ThreadLocal使用与原理

    ThreadLocal使用与原理

    今天,我们来介绍ThreadLocal,ThreadLocal在Java的多线程开发中有着十分重要的作用。我们还介绍ThreadLocal的基本使用和实现原理,尤其重点介绍了基于当前实现...

    三太子敖丙10252021-05-07
  • Java教程非常全面的IReport的使用教程

    非常全面的IReport的使用教程

    iReport 是为JasperReports Library和JasperReports Server设计的报表可视化设计器。本教程给大家详细介绍IReport的使用解析,感兴趣的朋友一起看看吧...

    此成非彼诚4812022-03-01
  • Java教程Java中list.foreach不能使用字符串拼接的问题

    Java中list.foreach不能使用字符串拼接的问题

    这篇文章主要介绍了Java中list.foreach不能使用字符串拼接的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    hashdog3932022-01-19
  • Java教程Linux系统Java环境配置教程

    Linux系统Java环境配置教程

    这篇文章给大家介绍的Linux 系统Java环境配置教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧...

    缘故为何4602021-04-26
  • Java教程详解Spring Boot Junit单元测试

    详解Spring Boot Junit单元测试

    本篇文章主要介绍了详解Spring Boot Junit单元测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    catoop2272020-12-02