

概述
随着微服务架构的普及,服务间的通信和调用成为了关键问题。在SpringCloudAlibaba框架下,Feign和Dubbo是两种常用的服务调用组件。本文将对两者进行性能对比及区别分析。
一、Feign与Dubbo概述
Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过简单的注解,Feign将自动生成HTTP请求,使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架,提供了丰富的服务治理功能。
二、性能对比
三、区别分析
四、实战性能对比
引入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
从调用时间上可见 Dubbo的性能确实比Feign的性能好上不少
总结
总的来说,基于SpringCloudAlibaba框架下,Feign和Dubbo各有千秋。选择使用哪一个组件取决于具体的项目需求和团队技术栈。对于需要快速构建微服务架构的项目,Feign是一个不错的选择;而对于需要更多自定义和服务治理功能的项目,Dubbo可能更适合。在实际应用中,也可以根据具体场景将两者结合使用,以达到更好的效果。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。