Feign基本使用(超详细)
目录
一、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文件中写入以下代码即可
此时在浏览器中就可以看到我们提供的压缩方式,和浏览器支持的压缩方式
Feign基本使用(超详细)相关推荐
- SpringCloud从入门到精通(超详细文档二)
上一篇文档(SpringCloud从入门到精通之超详细文档一)已经对Springboot/SpringCloud做了简单的介绍以及应用讲解,下面将继续为大家介绍SpringCloud后续应用. 第12 ...
- k8s核心组件详细介绍教程(配超详细实例演示)
本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...
- 手把手从零开始搭建k8s集群超详细教程
本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...
- 归并排序(代码注释超详细)
归并排序: (复制粘贴百度百科没什么意思),简单来说,就是对数组进行分组,然后分组进行排序,排序完最后再整合起来排序! 我看了很多博客,都是写的8个数据呀什么的(2^4,分组方便),我就想着,要是10 ...
- 超详细的Java面试题总结(四 )之JavaWeb基础知识总结
系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...
- 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划
作者 | 无名之辈FTER 责编 | 夕颜 出品 | 程序人生(ID:coder_life) 本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展, ...
- 一份超详细的数据科学路线图!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:魔王.陈萍,来源:机器之心 从头开始学习数据科学的免费资源. 如何 ...
- OSSIM系统的安装教程(超详细)
OSSIM系统的安装教程(超详细) 一.创建虚拟机 二.安装ossim系统 三.web登录 一.创建虚拟机 首先在网上下载OSSIM系统的镜像,记住自己保存的位置. 打开vm,新建虚拟机. 选择自定义 ...
- 超详细的 Redis Cluster 官方集群搭建指南,适用于 redis 5.x, 6.x
今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细. 旧版本使用 redis-trib.rb ruby 脚本安装集群,5.0版本redis-cli 已经自带 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
最新文章
- 如何快速设计元器件原理图库和PCB封装库?
- 在线作图|2分钟绘制一张豆荚图
- MYSQL多表查询与事务
- 使用 C++的第三方库 jsoncpp的步骤以及出现的问题
- C语言 __FUNCTION__ - C语言零基础入门教程
- (十)java版b2b2c社交电商spring cloud分布式微服务- SSO单点登录之OAuth2.0登录认证(1)...
- .Net 下信号量(Semaphore)的一种实现
- Prometheus 轻松实现集群监控
- base64编码_动画演示 Base 64 编码
- 手机怎么用外嵌字幕_影视剪辑10大添加字幕软件,一键“复制粘贴”,网友:太简单了...
- modelica语言学习记录V1.0
- 基于php+MYSQL的旅游景点攻略的设计与实现 毕业设计源码301216
- Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】
- 【目标检测】YOLOv3:An Incremental Improvement
- topo排序判环实操
- 《元宇宙十大技术》感谢乔卫兵等6位为出版做出巨大贡献
- 禾匠二开系列之兑换码禁用以后启用功能
- 如何安装imgaug
- Android7.08.0 电池图标分析
- [Codeforces 115B] Lawnmower