[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 接口,并通过注解的方式来声明请求参数,请求方式等信息,使远程调用更加方便和间接

相关推荐
源代码•宸5 分钟前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
我的div丢了肿么办5 分钟前
go语言中的map,map定义不同的数据类型,循环map,map的无序性
后端·go
oliver_sys_log1 小时前
RocketMQ 4.5.1 延迟消息"发送成功但消费不到"排查分析报告
后端·rocketmq
码上观网1 小时前
VXLAN 中的 ARP 代答:从原理到 SONiC 代码实现
后端
计算机毕设定制辅导-无忧学长1 小时前
《基于SpringBoot的马术俱乐部管理系统》
java·spring boot·后端
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
学长毕业设计2 小时前
基于SpringBoot的民间艺术传承管理系统(源码+文档+讲解视频)
java·spring boot·后端
小蒜学长2 小时前
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
墨着染霜华2 小时前
SpringCloud Gateway线上Nginx代理后自定义下划线请求头丢失(app_name/app_version获取不到)完美解决
nginx·spring cloud·gateway
cfm_29142 小时前
Spring事务
数据库·spring·oracle