spring feign
spring feign
三丰 soft张三丰
什么是feign
Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
Feign解决了什么问题?
封装了Http调用流程,更适合面向接口化的编程习惯
在服务调用的场景中,我们经常调用基于Http协议的服务,而我们经常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty等等,这些框架在基于自身的专注点提供了自身特性。而从角色划分上来看,他们的职能是一致的提供Http调用服务。具体流程如下:
Feign架构
常用参数设置
feign.hystrix.enabled=false feign的调用过程中是否启用hystrix,默认false feign.httpclient.enabled=ture 是否使用httpclient来调用接口,默认true;要使用httpclient还需要引入feign-httpclient依赖 feign.okhttp.enabled=false 是否使用okhttp来调用接口,默认false;要使用okhttp需把改属性设为true,还需要引入feign-httpclient依赖
Feign和Ribbon的使用区别
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
1.启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2.服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
3.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。
Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
Feign整合了Ribbon和Hystrix
1.Feign调用其他微服务API时可以使用统一的HTTPZ请求模板,包含请求参数,URL等信息,便于管理维护。Ribbon的请求通过RestTemplate调用其他微服务API,参数通过字符串拼接在URL后面,不方便写也不利于管理。
2.Spring Cloud为Feign提供了支持Spring MVC的注解,可以通过注解方便使用。
3.可插拔的注解支持,包括Feign注解和JAX-RS注解。
4.支持可插拔的HTTP编码器和解码器。
5.支持HTTP请求和响应的压缩处理。
6.Feign支持Hystrix和他的回退功能
7.Feign支持Ribbon的负载均衡功能
- Java支付全家桶:企业级各类支付手段一站式解决方案
- 深入理解Java里的各种锁(上)
- 深入理解Java里的各种锁(下)
- 阿里《Java开发手册》中的 1 个bug!
- 阿里《Java开发手册》中的 1 个bug!
- 驳《阿里「Java开发手册」中的1个bug》?
- 漫画:Java如何实现热更新?
- 记录一次错误 Your project setup is incompatible with our requirements due to following reasons: Change Spring Boot version to one of the following versions [2.3.x, 2.4.x] .
- Java后端面试题大汇总,冲刺金三银四
- 【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
- Java final 类和方法(学习 Java 编程语言 041)
- 编程福利领取:Java知识体系详细总结(2021版)
- Java 8中字符串拼接新姿势:StringJoiner
- Java中的深浅拷贝问题,你清楚吗?
- 二. SpringCloud基本Rest微服务工程搭建
- Spring cloud Alibaba超详细学习笔记--深入底层剖析Nacos Config
- Java 类的设计技巧(学习 Java 编程语言 039)
- Java中,那些关于String和字符串常量池你不得不知道的东西
- Java8中使用lambda不为null时才过滤值
- Java8中使用lambda不为null时才过滤值