浅谈Spring Cloud:OpenFeign

RestTemplate 方式调用存在的问题:

java 复制代码
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

这是通过URL地址来访问的。但是:

  1. 代码可读性差,编程体验不统一
  2. 参数复杂的URL很难维护

Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送。

目录

定义和使用Feign客户端

Feign性能优化

Feigh最佳实践


定义和使用Feign客户端

引入依赖

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

在order-service的启动类添加注解开启Feign功能

接下来,我们新建一个接口,用这些参数来替代掉之前RestTemplate的参数。

可以看到,用Feign调用非常简单,Feign客户端是通过注解的方式来完成的,所以不管多复杂的URL都可以完成操作。

自定义Feign的配置

方式一:配置文件

这样日志级别就设置成了FULL。

方式二:Java代码方式,需要先声明一个Bean:

如果是全局配置,则把它放到 @EnableFeignClients 这个注解中:

java 复制代码
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

如果是局部配置,则把它放到 @FeignClient 这个注解中:

java 复制代码
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)

在一般情况下,一般用BASIC或者NONE,在找bug或者调试的时候才会用FULL。

Feign性能优化

Feign底层的客户端实现:

  • URLConnection: 默认实现,不支持连接池
  • Apache HttpClient: 支持连接池
  • OKHttp: 支持连接池

因此优化Feign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 志级别,最好用 basic 或 none

连接池配置:

引入依赖:

配置连接池:

总结一下Feign的优化:

日志尽量使用basic,并且使用HttpClient 或 OKHttp代替URLConnection。

Feigh最佳实践

方式一:继承。给消费者的FeignClient和提供者的Controller定义统一的父接口作为标准。

这种做法不推荐。两种服务会变成高度耦合,已经调用了同一个API接口,到时候接口需要改变,这两个服务都需要改。

方式二:抽取。将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用。

封装的时候,把所有的接口都封装进来了,可能会导致没有必要的资源浪费。

相关推荐
txxzjmzlh9 分钟前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5202 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
IT_陈寒3 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
系统集成-鹰翔3 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端
用户8356290780513 小时前
使用 Python 在 Excel 中添加和自定义迷你图
后端·python
码事漫谈3 小时前
给AI看一颗❤️,它就开始写递归了
后端
用户8356290780513 小时前
使用 Python 在 Excel 图表中添加趋势线与回归方程
后端·python
你三大爷3 小时前
Netty / Kafka / Redis 保序问题的源码对比与 NIO 框架主流解法
后端·架构
SL_staff3 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A3 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python