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

2023年 12月 27日 91.4k 0

概述

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

一、Feign与Dubbo概述

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

二、性能对比

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

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

    引入SpringCloud的pom集成dubbo

    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.7
         
    
    
            2.7.7
            2021.0.4.0
            2021.0.5
    
    
            
                
                    org.springframework.cloud
                    spring-cloud-dependencies
                    ${spring.cloud.version}
                    pom
                    import
                
                
                    com.alibaba.cloud
                    spring-cloud-alibaba-dependencies
                    ${alibaba.cloud.version}
                    pom
                    import
                
    

    创建公共API模块

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

    创建服务生产者

    
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
            
                org.apache.dubbo
                dubbo-spring-boot-starter
                3.2.7
            
            
                com.tiger
                tiger-example-api
                1.0-SNAPSHOT
            
        

    配置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);
        }
    }

    创建服务消费者

    
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
            
                org.apache.dubbo
                dubbo-spring-boot-starter
                3.2.7
            
            
                com.tiger
                tiger-example-api
                1.0-SNAPSHOT
            
        

    配置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

    图片图片

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

    总结

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论