2023年主流的选择仍是Feign, http客户端Feign还能再战

news2025/9/13 8:20:25

👳我亲爱的各位大佬们好😘😘😘
♨️本篇文章记录的为 微服务组件之http客户端Feign 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。
♨️如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛
👨‍🔧 个人主页 : 阿千弟
🔥 上期内容👉👉👉 : 魔法反射–java反射初入门(基础篇)

近期,Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interfac,这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。看起来很像使用 Feign 来完成远程服务调用,这可能是 Spring “抛弃” feign 等 http 调用的一种趋势😕😕😕

2023年了, 总有一些人会说什么Feign已经过时了, 但是话说回来 Spring6只支持jdk17+的版本, 以国内的大多数互联网公司发展来讲, 目前已有的技术既然可以稳定使用, 为什么要费尽心思的迭代升级呢, 这个成本也是相当高的, 愿意为这项技术升级应该不少目前国内的主流趋势, 所以呢, 还是综合各种因素来讲, Feign可能在很长的一段时间内都不会过时, 还是老老实实的使用我们的Feign吧.😃😃😃

请添加图片描述

文章目录

    • 下面再来介绍一下Feign的概念
    • Feign的老前辈RestTemplate
      • RestTemplate的使用步骤
        • 1. 创建RestTemplate对象
        • 2. 发送HTTP请求
        • 3. 处理响应
    • Feign : 没错正是在下
      • Feign的优点
      • 快速使用
      • 关于解决url路径复杂问题
      • 自定义Feign的配置
    • 一般需要配置的就是日志级别。
      • yaml配置feign的日志级别
      • Java代码方式配置feign的日志级别
      • 配置Feign客户端

下面再来介绍一下Feign的概念

Feign并没有过时。Feign是一个基于HTTP的客户端,它可以帮助开发人员轻松地编写RESTful API客户端。它提供了一种简单的方式来定义和使用RESTful服务,而不需要手动编写HTTP请求和解析响应。Feign还提供了负载均衡和服务发现的支持,使得它在微服务架构中非常有用。虽然现在有一些新的HTTP客户端库出现,但Feign仍然是一个非常流行和可靠的选择👍👍👍。

为什么要说它可以帮助开发人员轻松地编写RESTful API客户端?

在此之前, 我们通常使用的是Spring框架提供的一个用于访问RESTful服务的客户端工具类RestTemplate。它封装了HTTP请求的细节,使得我们可以通过简单的API调用来发送HTTP请求并处理响应。

Feign的老前辈RestTemplate

RestTemplate的使用步骤

使用RestTemplate发送HTTP请求的步骤如下:

1. 创建RestTemplate对象

可以通过new关键字创建RestTemplate对象,也可以通过Spring容器注入RestTemplate对象。

2. 发送HTTP请求

RestTemplate提供了多个方法用于发送HTTP请求,例如getForObject、postForObject、exchange等。这些方法的参数包括请求URL、请求方法、请求头、请求体等。

3. 处理响应

RestTemplate的HTTP请求方法返回的是响应体的数据,可以将响应体的数据转换为Java对象,也可以直接获取响应体的字符串。

以下是一个使用RestTemplate发送GET请求的示例代码:

RestTemplate restTemplate = new RestTemplate();
String url = "http://example.com/api/users/{id}";
User user = restTemplate.getForObject(url, User.class, 1);

在这个示例中,我们创建了一个RestTemplate对象,然后使用getForObject方法发送了一个GET请求,请求的URL是http://example.com/api/users/1,返回的响应体数据将被转换为User对象。

用起来看着很简单对不对

但是呢, 如果我们的请求路径的url比如长下面这个样子

https://www.baidu.com/link?url=Lx79smwh7or_e9MRQwSO37XaXIz3TkOT13bFjoyJraYTrxjrp-RAfXcncQ3rlsoSIXZieeFe_X4abq7QNw8gxlMaqjSLge9iVUSgB9yxK&wd=&eqid=bb5fafd50014d82d00000002644628ee

我们也都看到了, 这玩意写起来挺折磨人的
RestTemplate缺点:

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

所以呢, 我们必须找一个更好的东西来代替

请添加图片描述

Feign : 没错正是在下

Feign的优点

  1. 代码简洁:Feign的接口定义非常简单,只需要定义一个接口,就可以轻松地调用远程服务。

  2. 自动化:Feign自动处理负载均衡和服务发现,可以轻松地将请求分发到不同的服务实例。

  3. 易于扩展:Feign可以轻松地扩展,可以添加拦截器和解码器,以满足不同的需求。

  4. 支持多种协议:Feign支持多种协议,包括HTTP、HTTPS、TCP和UDP等。

快速使用

Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。

举个例子, 如果我们要在一个微服务中调用另一个微服务, 比如我们现在想通过订单微服务去查询用户的信息, 显然正常情况下, 我们通常会将订单和用户拆分成两个不同的模块, 查询信息的思路无非是用订单微服务的controller调用用户微服务的controller, 思路其实很简单

以下是使用Feign的一些步骤:

  1. 添加Feign依赖

在Maven项目中,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 创建Feign客户端接口

创建一个接口,用于定义要调用的Web服务的方法。例如:
OrderService中创建client.UserClient接口

在这里插入图片描述

UserClient 内容如下

@FeignClient(value = "userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

在上面的代码中,@FeignClient注解指定了要调用的服务的名称。接口中的方法定义了要调用的Web服务的HTTP方法和路径。

这里注意:
UserClientfindById方法的请求路径必须和user-service微服务模块中的UsersControllerqueryById方法的请求路径保持一致, @PathVariable不能省去

@Slf4j
@RestController
@RequestMapping("/user")
// @RefreshScope
public class UserController {
	@Resource
    private UserService userService;
    /**
     * 路径: /user/101
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,
                          @RequestHeader(value = "Truth", required = false) String truth) {
        System.out.println("truth: " + truth);
        return userService.queryById(id);
    }
}
  1. 注入Feign客户端

在需要调用Web服务的类中,注入Feign客户端接口。例如:

@Service
public class OrderService {

    @Resource
    private OrderMapper orderMapper;

    @Resource
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

在上面的代码中,OrderService 类注入了UserClient 接口,并使用它来调用Web服务。

在这里插入图片描述
我们对结果对结果进行测试, 发现已成功响应

在这里插入图片描述

在这里插入图片描述

这里我起了两个user-service微服务, 经过以上的多次请求order-service微服务发现两个user-service微服务均有结果响应, 说明它不仅解决了远程调用问题, 还解决了服务调用间的负载均衡问题.

关于解决url路径复杂问题

是否记得我们上面接受请求参数使用的是@PathVariable注解, feign客户端是基于注解的形式来写参数的 , 那这就好办了, 不管url路径中的参数多么复杂, 我们一个@PathVariable给路径中的参数接过来就可以了

自定义Feign的配置

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。

请添加图片描述

一般需要配置的就是日志级别。

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

yaml配置feign的日志级别

基于配置文件修改feign的日志级别可以针对单个服务:

feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

Java代码方式配置feign的日志级别

也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration  {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; // 日志级别为BASIC
    }
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

配置Feign客户端

Feign底层的客户端实现:

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

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

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

可以通过配置文件来配置Feign客户端的一些属性,例如连接超时时间、重试次数等。

例如:
Feign添加HttpClient的支持:
引入依赖:

<!--httpClient的依赖 -->
<dependency>    
	<groupId>io.github.openfeign</groupId>   
	 <artifactId>feign-httpclient</artifactId>
</dependency>

httpclient配置

example-service:
  ribbon:
    ReadTimeout: 5000
    ConnectTimeout: 5000
  feign:
    client:
      config:
        default:
          loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息 
          retryer: com.netflix.client.retry.DefaultLoadBalancerRetryer
          readTimeout: 5000
          connectTimeout: 5000
  httpclient:
   enabled: true # 开启feign对HttpClient的支持  
   max-connections: 200 # 最大的连接数    
   max-connections-per-route: 50 # 每个路径的最大连接数

在上面的代码中,配置了连接超时时间和重试次数。

以上就是使用Feign的基本步骤。

请添加图片描述

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对Java后端或者对spring感兴趣的朋友,请多多关注💖💖💖
👨‍🔧 个人主页 : 阿千弟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4 架构初识(三)

UE4仿真引擎学习 一、架构基础 1. PlayerController PlayerController&#xff08;玩家控制器&#xff09; 是Pawn和控制它的人类玩家间的接口。PlayerController本质上代表了人类玩家的意愿。当设置PlayerController时&#xff0c;您需要考虑的一个事情就是您想在PlayerCont…

太阳辐射预报模式WRF-SOLAR在农业生态领域中的实践技术应用

太阳能是一种清洁能源&#xff0c;合理有效开发太阳能资源对减少污染、保护环境以及应对气候变化和能源安全具有非常重要的实际意义&#xff0c;为了实现能源和环境的可持续发展&#xff0c;近年来世界各国都高度重视太阳能资源的开发利用&#xff1b;另外太阳辐射的光谱成分、…

Navicat15数据库导表及乱码问题解决

本地环境 Win10 PHPstudy_Pro(小皮) PHP5.6 MySQL5.7 连接MySQL数据库 1.启动Navicat15 2.点击连接按钮,并选择MySQL子项 3.连接对话框 连接名:自己分的清的名字即可 主机:数据的地址 若连接非本地mysql只需将主机localhost换成需要连接数据的ip地址即可&#xff0c;输入数…

Linux下一切皆文件与指令的本质(可执行程序),which指令等

Linux下一切皆文件 在Linux下的话&#xff0c;一切皆文件。主要是看待诸如软硬件设备与磁盘文件的看法&#xff1a;一切皆文件&#xff0c;比如说显示器它也是文件&#xff0c;键盘也是文件&#xff0c;普通文件肯定是文件。首先就是显示器这个东西&#xff0c;它其实就是可以打…

Rancher 部署 Elasticsearch 8.5.1 版本服务

前言 从 es7 升级到 es8 之后&#xff0c;启动容器默认启用了 ssl 安全传输配置&#xff0c;但是在 Rancher 中部署的话&#xff0c;需要挂载 pvc 实现 data、logs 等目录持久化&#xff0c;启用 ssl 需要对证书等进行操作&#xff0c;非常麻烦&#xff0c;非常坑。 本文以启…

深度解析LED显示屏SMD封装

LED器件占LED显示屏成本约40%&#xff5e;70%&#xff0c;LED显示屏成本的大幅下降得益于LED器件的成本降低。5分钟带你了解SMD LED。LED封装质量的好坏对LED显示屏的质量影响较大。封装可靠性的关键包括芯片材料的选择、封装材料的选择及工艺管控。另外&#xff0c;严格的可靠…

SpringBoot - 事件机制使用详解(ApplicationEvent、ApplicationListener)

Spring 事件机制使用观察者模式来传递事件和消息。我们可以使用 ApplicationEvent 类来发布事件&#xff0c;然后使用 ApplicationListener 接口来监听事件。当事件发生时&#xff0c;所有注册的 ApplicationListener 都会得到通知。事件用于在松散耦合的组件之间交换信息。由于…

移动端网页特效

文章目录 一、触屏事件&#xff08;一&#xff09;触屏事件概述&#xff08;二&#xff09; 触摸事件对象&#xff08;TouchEvent&#xff09;&#xff08;三&#xff09; 移动端拖动元素 二、移动端常见特效&#xff08;一&#xff09;案例&#xff1a;移动端轮播图&#xff0…

Windows安装Docker

目录 一.启用Hyper-V和容器特性 1.右键Windows点击应用和功能 2.点击程序和功能​编辑 3.启用或关闭Windows功能​编辑 4.开启 Hyper-V 和容器特性 二.下载安装Docker 1.下载Docker &#xff08;Download Docker Desktop | Docker&#xff09; 2.点击安装 3.把第一个选…

《商用密码应用与安全性评估》第三章商用密码标准与产品应用3.3商用密码产品检测

商用密码产品检测框架 GM/T 0028-2014《密码模块安全技术要求》将密码模块安全分为从一级到四级安全性逐次增强的4个等级GM/T 0008-2012《安全芯片密码检测准则》将安全芯片安全分为从一级到三级安全性逐次增强的3个等级。 对于不同安全等级密码产品的选用&#xff0c;应考虑以…

Docker --- 简介、安装

一、什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署&#xff0c;环境不一定一致&#xff0c;会…

【故障定位】基于粒子群优化算法的故障定位及故障区段研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

VS2017配置Ipopt-基于Windows环境

文章目录 1、 背景2、 配置流程3、测试THE END 1、 背景 \qquad 本科研狗最近手头有个非线性规划模型需要求解&#xff0c;因为Ipopt是一款开源的NLP求解器&#xff0c;所以想要使用一下下。于是直接搜Ipopt官网&#xff0c;果然令人惊喜地列出了安装教程&#xff0c;但对于Win…

2023年五月份图形化一级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

混合办公现在还“吃香”吗?未来发展趋势如何?

在疫情期间&#xff0c;时不时就听到的“居家办公”新闻也在疫情放开后鲜少看到了。在疫情期间&#xff0c;呼声极高的混合办公、远程办公似乎也随着疫情的放开而“销声匿迹”了。 难道是&#xff0c;因疫情而生的混合办公&#xff0c;也最终因疫情放开而“死”了&#xff1f;在…

力扣刷题——搜索插入位置

目录 1、题目描述 2、题目分析 3、答案解析 1、题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1:…

webAPI学习笔记2(DOM事件高级)

1. 注册事件&#xff08;绑定事件&#xff09; 1.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或者绑定事件。 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 利用 on 开头的事件 onclick <button οnclick“alert(hi~)”><…

【文献篇】国家法律法规数据库提供免费的文献下载功能

【文献篇】国家法律法规数据库提供免费的文献下载功能 不用登录、不用注册、点击即可免费下载word、PDF等版本&#xff01;&#xff01;&#xff01; 比网上随便找、复制粘贴、还需要格式更改、担心完整性、准确性等问题省心N倍&#xff01;&#xff01;&#xff01;—【蘇小…

中国国际金融展开幕 蚂蚁集团数字化三件套产品升级更易用

4月25日&#xff0c;2023中国国际金融展(以下简称“金融展”)在北京开幕。本次展会以“荟萃金融科技成果&#xff0c;展现数字金融力量”为主题&#xff0c;突出科技创新为金融带来变革。上百家参展商展示了行业最新科技成果。 记者看到&#xff0c;在蚂蚁集团展区就展示了十几…

QT Graphics View 绘图架构之场景、视图与图形项简介

1、场景、视图与图形项 采用QPainter 绘图时需要在绘图设备的 paintEvent()事件里编写绘图的程序&#xff0c;实现整个绘图过程。这种方法如同使用 Windows 的画图软件在绘图&#xff0c;绘制的图形是位图&#xff0c;这种方法适合于绘制复杂性不高的固定图形&#xff0c;不能…