springcloud学习之Open Feign (声明式的伪RPC远程调用)

本文介绍了OpenFeign的基本概念及如何使用它实现服务间的远程调用。通过一个简单的示例,展示了OpenFeign结合Ribbon进行负载均衡的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Open Feign 是什么?

Feign,假装、伪装。OpenFeign可以使消费者将提供者提供的服务名伪装为接口进行消费,消费者只需使用“Service接口 + 注解”的方式即可直接调用Service接口方法,而无需再使用RestTemplate了

2. Ribbon与OpenFeign

Ribbon是Netflix公司的一个开源的负载均衡项目,是一个客户端负载均衡器,运行在消费者端。
OpenFeign也是运行在消费者端的,使用Ribbon进行负载均衡,所以OpenFeign直接内置了Ribbon。即在导入OpenFeign依赖后,无需再专门导入Ribbon依赖了

3.Open Feign 的简单使用

引入jar包,这里需要注意的一点是:OpenFeign内置了Ribbon,所以不需要引入Ribbon的jar包
pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.3.RELEASE</version>
</dependency>

新建一个接口类

package com.xhc.example.userservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author xuehuichen
 * @version V1.0
 * @Package com.xhc.example.userservice
 * @date 2021/3/20 下午5:24
 */
@FeignClient("order-service")
public interface OrderServiceFeignClient {

	// 这里声明的是服务提供方的接口,类似于dubbo一样的使用方法
    @GetMapping("/orders")
    public String getAllOrder();

}

PS:其实正常情况下都是把这个接口统一的定义为一个单独的模块

在主方法中添加开启OpenFeign的注解

@EnableFeignClients
@SpringBootApplication
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }

}

新建一个Controller

@RestController
public class OpenFeignController {
    @Autowired
    OrderServiceFeignClient orderServiceFeignClient;

    @GetMapping("/test")
    public String test(){
        return orderServiceFeignClient.getAllOrder();
    }
}

服务消费者的代码完毕,接下来是服务提供者代码(另外新建一个微服务项目)

@RestController
public class OrderService {

    @Value("${server.port}")
    private int port;

    @GetMapping("/orders")
    public String getAllOrder(){
        System.out.println("port"+port);
        return "Return all order";
    }
}

application.properties

# 应用名称
spring.application.name=order-service
# 应用服务 WEB 访问端口
server.port=8080

至此,一个使用Open Feign的简单例子就已经写完!这个简单的例子已经实现了Feign远程调用和Ribbon客户端负载均衡,是不是很简单?

4. Open Feign 的原理

4.1 思考Feign要做的事情

  • 参数的解析和装载
  • 针对指定的feignClient,生成动态代理
  • 针对FeignClient中的方法描述进行解析
  • 组装出一个Request对象,发起请求

5. Dubbo 和 OpenFeign 的区别

Dubbo 和 OpenFeign 都是分布式系统中常用的远程过程调用(RPC)框架,但它们有不同的设计理念、使用场景和功能特性。以下是它们的主要区别:

  1. 设计理念和目标
    Dubbo:Dubbo 是一个高性能的 RPC 框架,最初由阿里巴巴开发,专注于构建大规模、分布式服务,支持多协议、负载均衡、容错和服务治理等功能。它适合用于需要高度定制和高性能的分布式系统,尤其是微服务架构中的服务间调用。
    OpenFeign:OpenFeign 是一个声明式的 HTTP 客户端,基于 Spring Cloud 开发,用于简化 RESTful API 的调用。它采用接口和注解的方式,通过动态代理生成 HTTP 客户端代码。OpenFeign 主要用于基于 HTTP 的微服务间调用,适用于与其他系统通过 REST API 进行通信的场景。
  2. 协议支持
    Dubbo:支持多种协议(如 Dubbo、HTTP、REST、WebService 等),并且默认使用自定义的高效二进制协议(Dubbo 协议)来进行服务调用。Dubbo 更适合在内部微服务通信中使用,尤其是在大规模、高并发的场景下。
    OpenFeign:基于 HTTP 协议(通常是 RESTful API),通过 Spring MVC 注解来定义接口,主要用于通过 HTTP 进行微服务调用。它通常适合与外部系统或其他微服务之间的通信,特别是基于 RESTful 服务的场景。
  3. 服务治理
    Dubbo:具有完善的服务治理能力,包括服务注册与发现、负载均衡、容错、动态配置、监控等。Dubbo 通过注册中心(如 Zookeeper 或 Nacos)管理服务提供者和消费者,能够实现分布式环境下的自动服务发现和动态路由。
    OpenFeign:没有内置的服务治理功能,通常依赖于 Spring Cloud 提供的其他组件(如 Eureka、Consul、Nacos)来进行服务发现与注册。它本身并不提供负载均衡或容错机制,但可以结合 Ribbon(用于负载均衡)和 Hystrix(用于容错)来使用。
  4. 性能
    Dubbo:Dubbo 在性能上非常优越,尤其是在高并发、高吞吐量的场景下,由于使用了自定义的高效二进制协议(Dubbo 协议),可以减少网络传输的开销,并支持多种负载均衡和容错策略,能够提供更高的性能。
    OpenFeign:由于是基于 HTTP 协议,性能上不如 Dubbo 高效,尤其是在需要高频调用时,HTTP 的开销和传输效率会成为瓶颈。OpenFeign 更侧重于简化开发而非优化性能。
  5. 开发体验
    Dubbo:Dubbo 提供了灵活的 API 和多种配置方式,适合需要定制化、复杂需求的系统。它也支持注解式配置和 XML 配置,但相较于 OpenFeign,开发体验可能更复杂一些,尤其是在配置和调试时。
    OpenFeign:OpenFeign 的开发体验非常简单和易于使用,开发者只需定义一个接口并使用注解(如 @FeignClient)来声明服务调用,Feign 会自动生成 HTTP 请求代码,极大简化了开发过程。它更适合快速开发和轻量级微服务架构。
  6. 生态系统
    Dubbo:Dubbo 是一个功能丰富的 RPC 框架,提供了服务治理、负载均衡、容错、动态配置等多个方面的支持。它有完善的生态系统,能够支持复杂的企业级应用,适合大规模分布式系统。
    OpenFeign:OpenFeign 是一个轻量级的 HTTP 客户端框架,主要与 Spring Cloud 生态系统紧密集成,能够与 Eureka、Ribbon、Hystrix 等其他 Spring Cloud 组件协同工作,适合轻量级和基于 HTTP 的微服务架构。
  7. 使用场景
    Dubbo:
    内部服务间的远程调用,尤其适用于高性能、高吞吐量的场景。
    分布式系统中,需要支持多协议和复杂服务治理的环境。
    微服务架构中的 RPC 通信。
    OpenFeign:
    服务间通过 RESTful API 通信,通常用于外部 API 或微服务间的 HTTP 调用。
    Spring Cloud 环境下,用于简化 REST 服务调用的场景。
    快速开发和轻量级微服务架构。
    总结表格:
特性DubboOpenFeign
协议支持多种协议(如 Dubbo、HTTP)基于 HTTP 协议(RESTful)
性能高性能,适合高并发场景性能相对较低,适合轻量级应用
服务治理内置完善的服务治理功能(注册、发现、负载均衡等)需要结合 Spring Cloud 的其他组件
容错机制内置容错机制(重试、熔断等)依赖于其他库(如 Hystrix)
开发体验配置较复杂,支持灵活定制简单、声明式接口,易于使用
生态系统独立生态,适合大规模分布式应用Spring Cloud 生态中使用,适合轻量级微服务
使用场景高性能的微服务架构,内部 RPC 通信微服务间基于 HTTP 的通信,快速开发

总结:
Dubbo 更适合于大规模、高性能的内部微服务通信,提供了丰富的服务治理功能,适合复杂的分布式系统。
OpenFeign 更适合基于 HTTP 协议的服务间通信,特别是在 Spring Cloud 生态下,能够通过声明式接口快速简化 REST API 的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值