目录
1、什么是OpenFegin
OpenFeign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。OpenFeign是在Netflix Feign的基础上发展起来的,它整合了Spring Cloud体系,提供了一些额外的功能和改进
2、OpenFegin原理
- 动态代理:OpenFeign使用Java的动态代理机制为定义的接口生成代理对象。当调用接口方法时,实际上是调用了代理对象的方法
- 请求映射:OpenFeign根据定义的注解(如
@FeignClient
、@RequestMapping
等)映射HTTP请求 - 服务发现:OpenFeign从服务发现组件获取目标服务的实例信息,并根据配置的负载均衡策略选择一个实例进行调用
- 编码器和解码器:OpenFeign整合了编码器和解码器来序列化请求体和反序列化响应体
3、常见的声明式客户端有哪些
- RestTemplate:RestTemplate 是Spring提供的一个同步的HTTP客户端工具类
- HttpClient:HttpClient 是Apache Jakarta Commons下的子项目,是一个灵活的HTTP客户端库
- OkHttp:OkHttp 是一个开源的HTTP客户端库,OkHttp 以简洁的API、高效的性能而著称,并支持多种协议
之所以选择使用OpenFegin是在上一章我们使用RestTemplate模拟了前端环境来发送Http请求,模块间的访问也是可以实现的,但是基于这种方式,代码比较繁琐,耦合度较高,一个大的需求可能需要好几个数据库的信息,难道要写好几遍这种繁琐的代码吗?
而且这种调用方式,与原本的本地方法调用差异太大,编程时的体验也不统一,一会儿远程调用,一会儿本地调用因此,我们必须想办法改变远程调用的开发模式,让远程调用像本地方法调用一样简单。而这就要用到OpenFeign组件了
4、为什么要引入OpenFegin
- 简化HTTP客户端编写:OpenFeign允许开发者通过声明式注解来定义HTTP请求,而不需要编写繁琐的HTTP客户端代码
- 整合Spring Cloud:作为Spring Cloud体系的一部分,OpenFeign可以无缝地与其他Spring Cloud组件(如Nacos、Hystrix、Zuul等)集成
- 支持多种HTTP客户端:OpenFeign支持多种HTTP客户端库(如Apache HttpClient、OkHttp等),提供灵活性
- 支持日志记录:OpenFeign提供了日志记录功能,有助于监控和调试服务调用
总结:使用OpenFeign可以大大简化微服务之间的通信,提高开发效率,同时保持代码的整洁 和可维护性。它适用于构建大规模、分布式的微服务系统
5、OpenFegin的使用
5.1、引入依赖
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
5.2、启用OpenFeign
在模块启动类上加上@EnableFeginClients注解,开启功能
5.3、编写OpenFeign客户端
定义一个新的接口,这个接口是把之前要调用的接口暴露出来,供其他服务调用
package com.hmall.cart.client;
import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient("item-service")
public interface ItemClient {
@GetMapping("/items")
List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
这里只需要声明接口,无需实现方法。接口中的几个关键信息:
@FeignClient("item-service")
:声明服务名称@GetMapping
:声明请求方式@GetMapping("/items")
:声明请求路径@RequestParam("ids") Collection<Long> ids
:声明请求参数List<ItemDTO>
:返回值类型
5.4、在业务中来使用OpenFegin来访问该接口
feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作,不在使用RestTemplate
5.5、连接池
OpenFegin使用的http客户端是HttpURLConnection,不支持连接池
所以我们换成支持连接池的OkHttp
5.5.1、连接池有什么好处
连接池的使用减少连接建立时间:创建一个新的网络连接或数据库连接通常需要时间,使用连接池可以复用已有的连接,避免了每次请求都重新建立连接的开销
资源优化:连接池可以限制最大连接数,从而避免过多的连接占用过多的系统资源,如内存和文件描述符
负载均衡:在连接池中,请求可以均匀地分配到所有可用的连接上,实现负载均衡
总而言之,连接池可以达到连接的复用,减少了创建连接的消耗,
5.5.2、引入依赖
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
5.5.3、开启连接池
在cart-service
的application.yml
配置文件中开启Feign的连接池功能:
开启服务后,会更改默认的Http客户端
feign:
okhttp:
enabled: true # 开启OKHttp功能
配置好后重启服务
在微服务项目中,每个模块技术服务提供者也是服务调用者,所以每个模块都有需要暴露的接口
这样我们不好管理,那我们不如新建一个模块将所有要暴露的接口统一放在这一个模块中,进行统一管理,在其他模块中去引入该模块,达到可以访问接口的目的。