[SpringCloud][13]OpenFeign快速上手

文章目录

  • [RestTemplate 存在问题](#RestTemplate 存在问题)
  • [OpenFeign 介绍](#OpenFeign 介绍)
      • [OpenFeign 前身](#OpenFeign 前身)
      • [Spring Cloud Feign](#Spring Cloud Feign)
  • 快速上手

RestTemplate 存在问题

观察我们远程调用的代码

java 复制代码
public OrderInfo selectOrderById(Integer orderId) {  
    OrderInfo orderInfo = orderMapper.selectOrderById(orderId);  
    String url = "http://product-service/product/" + orderInfo.getProductId();  
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);  
    orderInfo.setProductInfo(productInfo);  
    return orderInfo;  
}

虽说 RestTemplateHTTP 封装之后,已经比直接使用 HTTPClient 要简单方便很多,但是还是存在一些问题

  1. 需要拼接 URL,灵活性高,但是封装臃肿,URL 复杂时,容易出错
  2. 代码可读性差,风格不统一

微服务之间的通信方式,通常有两种:RPCHTTP

Spring Cloud 中,默认是使用 HTTP 来进行微服务的通信,最常用的实现形式有两种:

  • RestTemplate
  • OpenFeign

RPCRemote Procedure Call)远程过程调用

  • 是一种通过网络从远程计算机上请求服务,而不需要了解底层网络通信机制
  • RPC 可以使用多种网络协议进行通信,如 HTTPTCPUDP 等,并且在 TCP/IP 网络四层模型中跨越了传输层和应用层
  • 简而言之 RPC 就是像调用本地方法一样调用远程方法
  • 常见的 RPC 框架有:
    • Dubbo
    • Thrift
    • gRPC

OpenFeign 介绍

OpenFeign 是一个声明式的 Web Service 客户端。它让微服务之间的调用变得更简单,类似 controller 调用 service,只需要创建一个接口,然后添加注解即可使用 OpenFeign

OpenFeign 前身

FeignNetFlix 公司开源的一个组件

可以简单理解为 NetFlix FeignOpenFeign 的祖先,或者说 OpenFeignNetFlix Feign 的升级版,是一个更强大更灵活的实现

现在网络上看到的文章,或者公司用的 Feign,大多都是 OpenFeign,我们后面讲说的 Feign,指的是 OpenFeign

Spring Cloud Feign

Spring Cloud FeignSpringFeign 的封装,将 Feign 项目继承到 Spring Cloud 生态系统中。

Feign 更名影响,Spring Cloud Feign 也有两个 starter

  • spring-cloud-starter-feign
  • spring-cloud-starter-openfeign

由于 Feign 的停更维护,对应的,我们使用的依赖是 `spring-cloud-starter-openfeign```

快速上手

引入依赖

xml 复制代码
<dependency> 
	<groupId>org.springframework.cloud</groupId> 
	<artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

添加注解

order-service 的启动类添加注解 @EnableFeignClients

java 复制代码
@EnableFeignClients  
@SpringBootApplication  
public class OrderServiceApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(OrderServiceApplication.class, args);  
    }  
}

编写 OpenFeign 的客户端

基于 SpringMVC 的注解来声明远程调用的信息

java 复制代码
import org.springframework.cloud.openfeign.FeignClient;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
  
@FeignClient(value = "product-service", path = "/product")  
public interface ProductApi {  
    @RequestMapping("/{productId}")  
    ProductInfo getProductById(@PathVariable("productId") Integer productId);  
}
  • @FeignClient 注解作用在接口上,参数说明
    • name/value:指定 FeignClient 的名称,也就是微服务的名称,用于服务发现,Feign 底层会使用 Spring Cloud LoadBalance 进行负载均衡。也可以使用 url 属性指定一个具体的 url
    • path:定义当前 FeignClient 的统一前缀

远程调用

修改远程调用的方法

java 复制代码
public class OrderService {
	//...
	@Autowired
	private ProductApi productApi;
	//...

	// Feign 实现远程调用
	public OrderInfo selectOrderById(Integer orderId) {  
    OrderInfo orderInfo = orderMapper.selectOrderById(orderId);  
    ProductInfo productInfo = productApi.getProductById(orderInfo.getProductId());  
    orderInfo.setProductInfo(productInfo);  
    return orderInfo;  
}
}
  • 代码对比:

测试

启动服务,访问接口,测试远程调用:

Feign 简化了与 HTTP 服务交互的过程,把 REST 客户端的定义转换为 Java 接口,并通过注解的方式来声明请求参数,请求方式等信息,使远程调用更加方便和间接

相关推荐
雪宫街道1 小时前
SpringBoot 静态资源映射规则与定制
java·spring boot·后端·spring
西凉的悲伤1 小时前
Spring Boot 与 Maven 依赖管理详解
spring boot·后端·maven·依赖管理
宸津-代码粉碎机1 小时前
Spring AI企业级实战|智能记忆摘要+自动遗忘机制落地,彻底解决上下文爆炸与Token冗余
java·大数据·人工智能·后端·python·spring
南极企鹅1 小时前
springboot项目不退出的原因
java·spring boot·后端
仍然.2 小时前
SpringBoot快速上手
java·spring boot·后端
浮尘笔记2 小时前
Go实现大文件异步流式采集引擎
开发语言·后端·golang
霸道流氓气质2 小时前
Spring Boot 大数据量 Excel 导入导出功能实现指南
spring boot·后端·excel
仍然.2 小时前
Spring MVC(1)---介绍Spring MVC 和 请求数据
java·spring·mvc
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【74】Agentic RAG 与混合 RAG
java·人工智能·spring