Feign详解

一. Feign概述

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

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

 二. 入门案例

2.1 创建服务提供者

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_parent</artifactId><groupId>com.bjpowernode</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feign_provider</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.bjpowernode</groupId><artifactId>springcloud_common</artifactId><version>1.0-SNAPSHOT</version></dependency><!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
</project>
  •  配置文件:application.yml
server:port: 9090
spring:cloud:nacos:discovery:server-addr: 192.168.128.132:8848 #nacos服务的地址application:name: feign-provider #向注册中心注册的名字
  • controller

package com.bjpowernode.controller;import com.bjpowernode.pojo.User;
import com.bjpowernode.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/provider")
public class ProviderController {@Autowiredprivate UserService userService;@RequestMapping("/getUserById/{id}")public User getUserById(@PathVariable Integer id){return userService.getUserById(id);}@RequestMapping("/deleteUserById")public User deleteUserById( Integer id){return userService.deleteUserById(id);}@RequestMapping("/addUser")public User addUser(@RequestBody User user){return userService.addUser(user);}
}

  •  service(接口我在这里就不放上去了,自己写的时候别忘了),启动类自行写入
package com.bjpowernode.service.impl;import com.bjpowernode.pojo.User;
import com.bjpowernode.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Overridepublic User getUserById(Integer id) {return new User(id,"王粪堆-1",18);}@Overridepublic User deleteUserById(Integer id) {return new User(id,"已删除王粪堆用户",18);}@Overridepublic User addUser(User user) {return new User(user.getId(),"已添加"+user.getName(),user.getAge());}
}

2.2 创建服务消费者

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_parent</artifactId><groupId>com.bjpowernode</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feign_consumer</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--feign接口--><dependency><groupId>com.bjpowernode</groupId><artifactId>feign_interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>
  •  配置文件:application.yml
server:port: 81compression:enabled: true #开启gzip压缩 提高宽带利用率和加速数据的传输速度
spring:cloud:nacos:discovery:server-addr: 192.168.128.132:8848 #nacos服务的地址application:name: feign-consumer #向注册中心注册的名字#超时优化有两种方式(默认超时时间为1000毫秒,时间太短)
#1.通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
#2.直接修改 OpenFeign 的超时时间(推荐使用)
#ribbon:
#  ConnectTimeout: 5000 #请求连接的超时时间
#  ReadTimeout: 5000 #请求处理的超时时间
#开启feign日志--前提feign包下的logger日志为:debug模式
feign:client:config:default:loggerLevel: fullConnectTimeout: 5000 #请求连接的超时时间ReadTimeout: 5000 #请求处理的超时时间httpclient:enabled: true  #开启httpclient 默认开启
#扫描feign包下的使用debug日志输出
logging:level:com.bjpowernode.feign: debug
  • controller
package com.bjpowernode.controller;import com.bjpowernode.feign.UserFeign;
import com.bjpowernode.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {@Autowiredprivate UserFeign userFeign;@RequestMapping(value = "/getUserById/{id}")public User getUserById(@PathVariable Integer id) {return userFeign.getUserById(id);}@RequestMapping(value = "/deleteUserById")public User deleteUserById(Integer id) {return userFeign.deleteUserById(id);}@RequestMapping(value = "/addUser")public User addUser( User user) {return userFeign.addUser(user);}
}
  • 启动类App(注意:在启动类上开启feign接口扫描
package com.bjpowernode;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableDiscoveryClient //向注册中心注册该服务,并可以获取其他服务的调用地址
@EnableFeignClients //开启feign接口扫描
public class FeignConsumerApp {public static void main(String[] args) {SpringApplication.run(FeignConsumerApp.class,args);}
}

2.3 创建服务提供者

  • pom.xml 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_parent</artifactId><groupId>com.bjpowernode</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feign_interface</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><!--Spring Cloud OpenFeign Starter --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.bjpowernode</groupId><artifactId>springcloud_common</artifactId><version>1.0-SNAPSHOT</version></dependency><!--http连接池--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency></dependencies>
</project>
  • feign(只做演示,我这里用feign表示接口包名)
package com.bjpowernode.feign;import com.bjpowernode.fallback.UserFeignFallback;
import com.bjpowernode.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "feign-provider")
@RequestMapping("/provider")
public interface UserFeign {@RequestMapping("/getUserById/{id}") //拼接url,restful风格形式拼接传参User getUserById(@PathVariable("id") Integer id);@RequestMapping("/deleteUserById") //拼接url, ?形式传参User deleteUserById(@PathVariable("id") Integer id);@RequestMapping("/addUser") //将user对象以json字符串的形式传参User addUser(@RequestBody User user);
}

2.4 测试

三. Feign原理

3.1 将Feign接口注入到Spring容器中

@EnableFeignClients注解开启Feign扫描,先调用FeignClientsRegistrar.registerFeignClients()方法扫描@FeignClient注解的接口,再将这些接口注入到Spring IOC容器中,方便后续被调用。

 

 

 

 3.2 为接口的方法创建RequestTemplate

当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数)

3.3 发出请求

代理类会通过RequestTemplate创建Request,然后client(URLConnetct、HttpClient、OkHttp)使用Request发送请求

四. Feign参数传递的三种方式

  •  restful传参 @PathVariable() 将参数id以restful风格拼接到路径中
@RequestMapping("/getUserById/{id}") //拼接url,restful风格形式拼接传参
User getUserById(@PathVariable("id") Integer id);  
  • ?传参  @RequestParam【拼接?形式的url】

@RequestMapping("/deleteUserById") //拼接url, ?形式传参
User deleteUserById(@RequestParam("id") Integer id);

  • pojo参数传参  @RequestBody 将user对象以json字符串的形式传参

@RequestMapping("/addUser") //将user对象以json字符串的形式传参
User addUser(@RequestBody User user);

五. Feign优化小技巧

5.1 开启feign日志

OpenFeign 提供了日志增强功能,它的日志级别有以下几个:

  •  NONE: 默认的,不显示任何日志。
  •  BASIC: 仅记录请求方法、URL、响应状态码及执行时间。
  • HEADERS: 除了 BASIC 中定义的信息之外,还有请求和响应的头信息
  •  FULL: 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

通过配置文件来设置日志级别,配置信息如下:

feign:client:config:default:loggerLevel: full
logging:level:com.bjpowernode.feign: debug其中 com.bjpowernode.feign 为 OpenFeign 接口所在的包名。
虽然 OpenFeign 默认是不输出任何日志,但在开发阶段可能会被修改,因此在生产环境中,
我们应仔细检查并设置合理的日志级别,以提高 OpenFeign 的运行效率。

5.2 feign超时

OpenFeign 底层内置了 Ribbon 框架,并且使用了 Ribbon 的请求连接超时时间和请求处理超时时间作为其超时时间,而 Ribbon 默认的请求连接超时时间和请求处理超时时间都是 1s

 由于1秒时间太短,我们需要手动设置超时时间,OpenFeign 的超时时间有以下两种更改方法:

  1. 通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
  2. 直接修改 OpenFeign 的超时时间(推荐使用)。

在项目配置文件 application.yml 中添加以下配置:


#超时优化有两种方式(默认超时时间为1000毫秒,时间太短)
#1.通过修改 Ribbon 的超时时间,被动的修改 OpenFeign 的超时时间。
ribbon:ConnectTimeout: 5000 #请求连接的超时时间ReadTimeout: 5000 #请求处理的超时时间#开启feign日志--前提feign包下的logger日志为:debug模式
#2.直接修改 OpenFeign 的超时时间(推荐使用)
feign:client:config:default:ConnectTimeout: 5000 #请求连接的超时时间ReadTimeout: 5000 #请求处理的超时时间

5.3 http连接池

专用通信组件自带连接池可以更好地对 HTTP 连接对象进行重用与管理,同时也能大大的提升 HTTP 请求的效率 

  • 引入Apache HttpClient依赖
        <!--Spring Cloud OpenFeign Starter --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--http连接池--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
  • 开启Apache HttpClient使用(只要引入依赖即可,程序默认开启)

feign:httpclient:enabled: true #开启httpclient 默认开启

5.4 gzip压缩

为了提高宽带利用率和加速数据的传输速度

  • 在项目配置文件 application.yml 中添加以下配置:
server:compression:enabled: true #开启gzip压缩 提高宽带利用率和加速数据的传输速度
  • 注意事项

如果服务消费端的 CPU 资源比较紧张的话,建议不要开启数据的压缩功能,因为数据压缩和解压都需要消耗 CPU 的资源,这样反而会给 CPU 增加了额外的负担,也会导致系统性能降低。

5.5 优化总结

OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件,在生产环境中我们可以通过以下配置来优化 OpenFeign 的运行:

  1. 修改 OpenFeign 的超时时间,让 OpenFeign 能够正确的处理业务。
  2. 通过配置专用的通信组件 Apache HttpClient 或 OKHttp,让 OpenFeign 可以更好地对 HTTP 连接对象进行重用和管理,以提高其性能。
  3. 开启数据压缩功能,可以提高宽带利用率和加速数据传输速度。
  4. 检查生成环境中 OpenFeign 的日志级别,选择合适的日志输出级别,防止无效的日志输出。

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

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

相关文章

Feign(简介和使用)

1. Feign介绍 通过RestTemplate调用其它服务的API时&#xff0c;所需要的参数须在请求的URL中进行拼接&#xff0c;如果参数少的话或许我们还可以忍受&#xff0c;一旦有多个参数的话&#xff0c;这时拼接请求字符串就会效率低下 Feign是一个声明式的Web Service客户端&#…

什么是Feign?

服务间调用介绍 现有的服务调用方式 利用拼接的方式。 虽然上面有的用不错就很好了 Feign解决了什么问题 Feign的调用方式 Feign体系架构解析-武装到牙齿 上一节我们了解了feign的主要功能&#xff0c;它就像一个自拍杆一样&#xff0c;方便了Eureka的远程调用。可是怎么看…

简单理解Feign的原理与使用

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

Feign基本使用(超详细)

目录 一、Feign概述 二、Feign入门 1.创建服务提供者(provider) 2.创建feign接口 3、创建服务消费者(consumer) 三、Feign 原理 四、Feign优化 1、开启feign日志 2、feign超时问题 3、http连接池 4、gzip压缩 前言 当我们通过RestTemplate调用其它服务的API时&#xff0c;所…

中外黑客两则

外国一则&#xff1a;丹尼斯麦卡利斯泰尔里奇。挑选他的原因&#xff1a;帅。 &#xff08;英语&#xff1a;Dennis MacAlistair Ritchie&#xff1b;1941年9月9日&#xff0d;2011年10月12日[3][4]&#xff09;&#xff0c;著名的美国计算机科学家&#xff0c;对C语言和其他编…

git使用X篇_2_Git全套教程IDEA版(git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容)

本文是根据以下视频及网上总结进行更新后的介绍git使用的博文。包含了git、GitHub、Gitee码云、搭建公司内部GitLab、与IDEA集成等内容。 笔记来源&#xff1a;【尚硅谷】5h打通Git全套教程IDEA版&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 文章目录 初识 Git0、内容…

Axure原型模板、元件库、组件库

在产品设计中&#xff0c;随时会使用到相似场景&#xff0c;每次都反复绘制耗时耗力。 若使用通用模板即可快速提高设计效率。 下面给大家提供一个登录多种验证系统框架模板&#xff0c;可快速修改使用。 预览链接&#xff1a; Axure高保真原型设计、Axure元件库、产品交互…

AXURE9最全的WEB设计元件库(分享版).rplib

Axure9常用到的WEB设计元件库&#xff0c;在Axure点击号即可导入元件库使用&#xff0c;或者打开Axure R9安装目录&#xff0c;进入DefaultSettings\Libraries&#xff0c;复制资源到此目录并重启Axure软件即可看到。 文件&#xff1a;590m.com/f/25127180-481124286-469239 &…

Axure移动端通用元件库rplib格式包含安卓、苹果各种主流手机、平板线框图元件库、IOS系统图标、人物图标、导航和分页、表格元素、各种小图标、移动元件库、axure元件库、axure原型

Axure移动端通用元件库rplib格式包含安卓、苹果各种主流手机、平板线框图元件库、IOS系统图标、人物图标、导航和分页、表格元素、各种小图标等 移动端通用元件库、app通用元件库、数据展示、操作反馈、通用模板、数据录入、列表页、表单页、详情页、通用版布局、移动端手机模…

Axure导入元件库和使用

下载元件库 vant 元件库下载: Vant - Mobile UI Components built on Vue element UI 元件库下载:https://element.eleme.cn/#/zh-CN/resource 以vant示例&#xff0c;下载完成后解压 我们看到有.rp和.rplib格式的文件 rp文件可以理解为一个别人设计好的原型作品。 rplib是原…

【Axure9.0原型实战(一)】Axure9.0的元件库的使用、导入、制作、路径等操作方法与技巧(附Axure元件库大全)

Axure9.0的元件库 文章目录 Axure9.0的元件库Axure9.0的元件库大全1.windows系统加载元件库2.MAC系统加载元件库3.新加入一些元件库4.自己建立元件库 Axure9.0的元件库大全 链接&#xff1a;https://pan.baidu.com/s/18VWM9R1qgFAXXz8Xooq4-A 提取码&#xff1a;u2gx 1.windo…

Axure RP9 的元件库

Axure的元件库 1.加载元件库 可以通过导入一些现有的元件库&#xff0c;来提高绘制的效率及美观性。 &#xff08;1&#xff09;windows系统&#xff1a; 将准备好的元件库复制到Axure 根目录下-【DefaultSettings】-【Libraries】中&#xff1b;移动成功后&#xff0c;重启…

嵌入式linux音乐电子相册制作软件,ApowerShow – 超级轻便的在线照片音乐视频制作软件...

有没有什么好用的照片视频制作软件呢&#xff1f;我大概对比了一下国内的其他软件&#xff0c;发现转场效果很多&#xff0c;但是需要自己去添加。它们的界面感觉有点繁琐&#xff0c;不是那么简洁。 其实除了使用国内的照片视频制作软件&#xff0c;你还可以使用ApowerShow。它…

html立体音乐相册源码,印记工坊立体音乐相册 v 1.8 官方版|印记工坊立体音乐相册官方版|印记工坊立体音乐相册电脑版_最火软件站...

印记工坊立体音乐相册包含多种多样的模板可以供用户使用&#xff0c;制作多种样式的电子相册,是一款傻瓜式视频音乐相册制作工具&#xff0c;及时是毫无制作经验的用户也能创作出精美的相册。最火软件站提供下载。 软件特色 故事视频制作 MV展示视频相册 时间轴视频制作 时光轴…

html动感音乐相册,动感音乐相册

动感音乐相册app是一款超级好用的音乐相册软件&#xff0c;这款软件上的功能丰富&#xff0c;能够帮助用户进行照片编辑&#xff0c;制作幻灯片等等&#xff0c;还能在线选择背景音乐进行添加&#xff0c;让相册每次打开都有不一样的感觉&#xff0c;喜欢的朋友快来下载吧。 动…

视频删了怎么恢复

视频无处不在&#xff0c;记录着各种有意义的画面&#xff0c;那么一旦重要的视频文件删除了该怎么恢复呢?甲驭科技数据恢复小编教您如何操作恢复。 目前视频的录制主要是各种相机摄像机录制或者手机录制的&#xff0c;这里以相机摄像机录制视频恢复为例&#xff0c;讲述如何快…

大疆无人机视频恢复成功

随着大疆的用户越来越多&#xff0c;大疆在拍摄过程中也使用的越来越多&#xff0c;经常会有客户格式化或许其他误操作导致拍摄的数据丢失情况。希贝软件目前提供全系列大疆恢复方案&#xff0c;因为大疆无人机的碎片多样化&#xff0c;导致目前没有软件能够支持所有型号大疆录…

手机删除的视频怎么恢复?即刻扫描,快速恢复

手机里的照片跟视频一样&#xff0c;都存在于相册中&#xff0c;所以恢复的方法也异曲同工&#xff0c;不过视频所占用的内存比照片大很多&#xff0c;所以很多时候&#xff0c;拍的视频发送出去之后就会删掉&#xff0c;那么手机删除的视频怎么恢复&#xff1f;小编给大家推荐…

win10电脑不小心卸载的软件怎么恢复

win10电脑不小心卸载的软件怎么恢复?很多win10系统用户经常会卸载掉自己电脑中不常用的软件&#xff0c;来减少磁盘空间的占用率。最近就有一位win10用户向小编反映自己在删除软件的时候不小心把需要的软件卸载了该怎么恢复?针对这个问题&#xff0c;下面小编就为大家带来详细…

怎样恢复内存卡的视频文件?(图文操作解析)

我们的日常生活中&#xff0c;内存卡的使用率特别高&#xff0c;比如说相机、手机等电子设备都会使用内存卡。大量数据和文件都存储在内存卡中&#xff0c;如果内存卡发生了意外状况&#xff0c;丢失了重要数据&#xff0c;比如说视频文件时怎么办呢&#xff1f;怎样恢复内存卡…