Feign基本使用(超详细)

article/2025/9/2 13:34:12

目录

一、Feign概述

二、Feign入门

        1.创建服务提供者(provider)

        2.创建feign接口    

        3、创建服务消费者(consumer)

 三、Feign 原理

 四、Feign优化

         1、开启feign日志

         2、feign超时问题

         3、http连接池

         4、gzip压缩



前言

        当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Feign概述

        Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

        Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。

二、Feign入门

        注意:以下所有步骤实现的前提是需要在启动类上加入注解 @EnableFeignClients 主要是为开启feign接口扫描

        1.创建服务提供者(provider)

导入依赖:

<!--Spring Cloud OpenFeign Starter -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

代码如下(示例):

        在服务提供者中调用servic层获取数据

//创建服务提供者
@RestController
@RequestMapping("/provider")
public class ProviderController {@Autowiredprivate UserService userService;@RequestMapping("/getUserById/{id}")public User getUserById(@PathVariable Integer id){return userService.getUserById(id);}
}

        2.创建feign接口    

代码如下(示例):

        解释都放在了代码中,可以直接复制粘贴

/*** @FeignClient 一般采用服务名进行命名* name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现* url: url一般用于调试,可以手动指定@FeignClient调用的地址** @RequestMapping 主要用于feign框架拼接传递url,弥补了Ribbon的url需要手动拼接的缺陷* @PathVariable("id") 当路径为restful风格时路径传参方式* @RequestParam("id") 当路径为?id=250 时传参方式* @RequestBody User user 当路径为对象时采用的传参方式,(集合、数组等都属于对象)*/
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {@RequestMapping("/getUserById/{id}")User getUserById(@PathVariable("id") Integer id);@RequestMapping("/deleteUserById")User deleteUserById(@RequestParam("id") Integer id);//?形式拼接参数,?id=250@RequestMapping("/addUser")User addUser(@RequestBody User user);//pojo--->json
}

        3、创建服务消费者(consumer)

//服务消费者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate UserFeign userFeign;@RequestMapping("/getUserById/{id}")public User getUserById(@PathVariable Integer id){return userFeign.getUserById(id);}
}

        application.yml文件

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.209.129:8848
  application:
    name: feign-consumer

 三、Feign 原理

1、将feign接口的代理类扫描到Spring容器中:
        @EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描被 @FeignClient标识的接口生成代理类,并把接口和代理类交给Spring的容器管理。
    2、为接口的方法创建RequestTemplate
        当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)
    3、发出请求
        代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求

四、Feign优化

        1、开启feign日志

                feign日志级别

         在consumer的yml文件中加入以下代码


feign:client:config:feign-provider: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger#在application.yml中使用 logging.level.<Feign客户端对应的接口的全限定名> 的参数配置格式来开启指定客户端日志
logging:level:com.bjpowernode.feign: debug

随后启动测试:

        出现以下结果表示日志输出成功 

        2、feign超时问题

        首先、Feign的负载均衡底层用的就是Ribbon,所以这里的请求超时配置其实就是配置Ribbon,当出现请求超时会出现以下报错。

注意 :当开启日志配置之后,feign超时问题不会出现报错情况。

        针对超时问题我们需要在之前的日志配置中加入以下内容

ConnectTimeout: 5000 #请求连接的超时时间

ReadTimeout: 5000 #请求处理的超时时间

         3、http连接池

          1、连接池介绍

        首先,我们知道HTTP连接需要经过三次握手,四次挥手的过程,这是很耗费性能的;所以HTTP连接池帮助我们节省了这一步。

        同时Feign的HTTP客户端支持三种框架:

        HttpURLConnection、HttpClient、OkHttp;默认是HttpURLConnection

         2、连接池使用

         先引入依赖到公共接口工厂interfac,如果没有做公共接口就放入consumer

<dependency>

<groupId>io.github.openfeign</groupId>

<artifactId>feign-httpclient</artifactId>

</dependency>

讲真的,其实这已经完成了,但是,我们还是要知道一下它的原理,否则显得太片面了

在配置文件中我们看到,连接池引入之后默认是开启的,所以我们就不用再写了

         4、gzip压缩

压缩能力

        当 Gzip 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少 70%以上的文件大小。·

这个开启也是比较简单,只需要在consumer中yml文件中写入以下代码即可

此时在浏览器中就可以看到我们提供的压缩方式,和浏览器支持的压缩方式 


http://chatgpt.dhexx.cn/article/mJPrtjoK.shtml

相关文章

简单理解Feign的原理与使用

文章目录 SpringCloud 总架构图一、简介1.1、负载均衡的概念2.2、Feign概念 二、入门案例2.1、导入依赖2.2、Feign的客户端2.3、调用Feign2.4、开启Feign功能2.5、启动测试2.6、Feign实现原理简单分析 三、负载均衡(Ribbon)四、熔断器支持五、请求压缩和响应压缩六、配置日志级…

【第四章】详解Feign的实现原理

1.1 Feign概述 这篇文章主要讲述如何通过Feign去消费服务&#xff0c;以及Feign的实现原理的解析。 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c;Feign可以帮助我们更快捷、优雅地调用HTTP API。 Feign是⼀个HTTP请求的轻量级客户端框架。通过 接口 注解的…

Feign底层原理分析-自动装载动态代理

本篇文章仅介绍Feign的核心机制&#xff0c;包括如何交由Spring容器托管、动态代理机制等内容&#xff0c;不会过分深入细节。 1、什么是Feign&#xff1f; 这里套用Feign官方Github上的介绍&#xff1a;“Feign是一个灵感来自于Retrofit、JAXRS-2.0、WebSocket的Java Http客户…

Feign原理 (图解)

1.1 简介&#xff1a;Feign远程调用的 Feign远程调用&#xff0c;核心就是通过一系列的封装和处理&#xff0c;将以JAVA注解的方式定义的远程调用API接口&#xff0c;最终转换成HTTP的请求形式&#xff0c;然后将HTTP的请求的响应结果&#xff0c;解码成JAVA Bean&#xff0c;放…

Feign的工作原理

Feign的工作原理 Feign是一个伪Java Http 客户端&#xff0c;Feign 不做任何的请求处理。Feign 通过处理注解生成Request模板&#xff0c;从而简化了Http API 的开发。开发人员可以使用注解的方式定制Request API模板。 在发送Http Request请求之前&#xff0c;Feign通过处理…

Linux命令——tar与gzip详解:文件的打包压缩与解压缩解打包

Linux系统中&#xff0c;最常用的打包命令就是tar了&#xff0c;不仅如此&#xff0c;tar命令还可以解打包解压缩&#xff0c;十分方便。如果单纯想压缩文件&#xff0c;就需要我们的gzip命令了。 使用tar打包归档的包叫做tar包&#xff0c;以.tar结尾 使用gzip压缩的文件&…

Linux 下使用 tar 命令打包指定目录下的所有文件,不包括目录

一&#xff0c;问题描述 无论是 Linux 系统&#xff0c;还是 macOS 系统&#xff0c;我们都可以使用 tar 命令进行文件的压缩打包。命令格式如下&#xff1a; # tar cvf xxxx.tar 要压缩的文件或目录名称但如果要压缩的目录层级比较多时&#xff0c;比如&#xff1a; # tar cvf…

linux tar (打包、压缩、解压)命令

打包程序&#xff1a;tar c: 创建文档t&#xff1a; 列出存档内容x&#xff1a;提取存档f&#xff1a; filename 要操作的文档名v&#xff1a;详细信息 一&#xff1a;打包 打包&#xff1a;是指把文件整合在一起&#xff0c;不压缩 1.将文件打包&#xff1a;tar cf a.ta…

(21)tar打包命令详解

Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个单独的磁盘中进行归档。不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包。1.tar命令做打包操作  当 tar 命令用于打包操作时,该命令的基本格式为: …

vector中删除某个指定元素

class Solution { public:int removeElement(vector<int>& v, int val) {for (auto it v.begin(); it ! v.end(); it) {if (*it val) { // 条件语句v.erase(it); // 移除他it--; // 让该迭代器指向前一个}}return v.size();} };

vector删除指定元素

C vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。 C 中std::remove()并不删除元素&#xff0c;因为容器的size()没有变化&#xff0c;只是元素的替换。 1.std::vector::erase() 函数原型&#xff1a;iterator erase (iterator position);  //删除指定…

C++中vector中删除/添加指定位置处的元素

1、函数介绍 C中vector容器可以删除/添加制定位置处的元素&#xff0c;分别使用erase()与insert()函数。其中函数内需要两个参数&#xff0c;第一个为指定删除/添加的位置&#xff0c;第二个元素为删除/添加的元素值。 iterator insert(const_iterator _Where, _Ty&&…

C/C++ vector 删除指定元素

C vector 删除符合条件的元素C vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法。C 中std::remove()并不删除元素&#xff0c;因为容器的size()没有变化&#xff0c;只是元素的替换。1.std::vector::erase()  函数原型&#xff1a;iterator erase (iterat…

【c++】vector中删除元素

目录 1.删除指定范围的元素2.删除指定大小的元素3.C20 std::erase, std::erase_if (std::vector)注意点 1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以删除由一个iterator指…

光纤光学原理相关基础知识点

记&#xff1a;研究生导师的方向是光纤光学和机器学习交叉的&#xff0c;导师给推荐了本书&#xff0c;书里面的理论和推导公式作为小白的我真的是不太行&#xff0c;后来在中国大学mooc上找了视频课跟着学习&#xff0c;顺便做下笔记&#xff0c;为日后使用&#xff0c;因此会…

机器人学重点知识点总结

机器人学重点知识点总结 坐标转换与机械臂运动学雅克比矩阵机械臂逆向动力学&#xff08;牛顿欧拉递推&#xff09;机械臂正向动力学运动轨迹生成动力学轨迹跟踪控制 这篇博客主要用来记录一下现代机器人学里面比较基础也比较重要的一些知识点&#xff0c;所有内容均仅仅记录是…

大学物理(下)知识点总结

大学物理&#xff08;下&#xff09;知识点总结&#xff08;持续更新&#xff09; 文章目录 大学物理&#xff08;下&#xff09;知识点总结&#xff08;持续更新&#xff09;静电场知识点总结习题精选 磁场知识点总结习题精选 期中复习总结电磁场知识点总结习题精选 狭义相对论…

Lumerical官方案例、FDTD时域有限差分法仿真学习(二)——宽带光栅耦合器(Broadband grating coupler (2D))

这个 2D FDTD 示例展示了如何获得光栅耦合器的宽带特性&#xff0c;并将结果与实验数据进行比较。 此外&#xff0c;该应用示例演示了多频波束计算的正确使用和优势&#xff0c;并将结果与标准单频波束计算进行了比较。 要更好地了解单频和多频波束计算之间的差异&#xff0c;请…

三维计算机视觉(四)--关键点

关键点又称为感兴趣的点&#xff0c;是低层次视觉通往高层次视觉的捷径&#xff0c;抑或是高层次感知对低层次处理手段的妥协。 RangeImage 1.关键点&#xff0c;线&#xff0c;面 关键点特征点&#xff1b; 关键线边缘&#xff1b; 关键面foreground&#xff1b; 上述三个概…

信号完整性基础04:串扰(1)

说在开头&#xff1a;关于x射线&#xff08;2&#xff09; 1895年11月8日&#xff0c;德国维尔茨堡大学的一间实验室里&#xff0c;校长伦琴正在做克鲁克斯管实验&#xff0c;当时房间没开灯&#xff0c;屋子里一片漆黑&#xff0c;放电管用黑纸包得很严实&#xff0c;他突然发…