Spring Cloud Alibaba 微服务框架 OpenFeign:声明式服务调用
2022-05-21 12:09:49 1 举报
AI智能生成
Spring Cloud Alibaba 微服务框架 OpenFeign 声明式服务调用
作者其他创作
大纲/内容
概述
Feign是一种声明式、模板化的HTTP客户端
在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
特性
可插拔的注解支持,包括Feign注解和JAX-RS注解。
支持可插拔的HTTP编码器和解码器。
支持Hystrix和它的Fallback。
支持Ribbon的负载均衡。
支持HTTP请求和响应的压缩。
使用示例
工作原理
在主程序入口添加@EnableFeignClients(扫描所在包和子包)注解开启对Feign Client扫描加载处理。
当程序启动时,会进行包扫描,扫描所有@FeignClient的注解的类,并将这些信息注入Spring IOC容器中。
当定义的Feign接口中的方法被调用时,通过JDK的代理的方式,来生成具体的RequestTemplate。
当生成代理时,Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息, 如请求参数名、请求方法等信息都是在这个过程中确定的。
然后由RequestTemplate生成Request,把Request交给Client去处理(这里指的Client可以是JDK原生的URLConnection(默认)、Apache的Http Client,也可以是Okhttp。)
最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。
hystrix对feign进行保护的原理:hystrix将feign的请求包装成HystrixCommand类(动态代理),这样当请求出现问题后就可以使用hystrix的熔断降级处理)
HystrixCommand类包装了用于执行远程调用的方法并且带有容错,统计和断路等功能通常为阻塞方法
feign.hystrix.HystrixFeign
图片
设计架构图
图片
图片
基础功能
@FeignClient注解
FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上
FeignClient注解的常用属性
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。
url:url一般用于调试,可以手动指定@FeignClient调用的地址。
decode404:当发生404错误时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException。
configuration:Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract。
fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口。
fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
path:定义当前FeignClient的统一前缀。
Feign开启GZIP压缩
配置示例
注意点:开启GZIP压缩之后,Feign之间的调用通过二进制协议进行传输,返回值需要修改为ResponseEntity<byte[]>才可以正常显示, 否则会导致服务之间的调用结果乱码。
Feign支持属性文件配置
对单个指定特定名称的Feign进行配置
作用于所有Feign的配置方式
Feign Client开启日志
Feign为每一个FeignClient都提供了一个feign.Logger实例,可以在配置中开启日志
开启方法
第一步: 在application.yml或者application.properties中配置日志输出
第二步: 全局范围,通过Java代码的方式在主程序入口类中配置日志Bean
第三步:服务范围,通过在@FeignClient注解上指定日志配置类
Logger.Level类型
NONE:不记录任何信息
BASIC:仅记录请求方法、URL以及响应状态码和执行时间
HEADERS:除了记录BASIC级别的信息外,还会记录请求和响应的头信息
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据
Feign的超时设置
Feign的调用分两层,即Ribbon的调用和Hystrix的调用,Hystrix默认是关闭的。
Ribbon超时
异常信息
超时配置
Hystrix超时
异常信息
超时配置
实战运用
Feign默认Client的替换
使用HttpClient替换Feign默认Client
图片
图片
使用OkHttp替换Feign默认的Client
OkHttp的特性
支持SPDY,可以合并多个到同一个主机的请求。
使用连接池技术减少请求的延迟(如果SPDY是可用的话)。
使用GZIP压缩减少传输的数据量。
缓存响应避免重复的网络请求。
图片
图片
Feign的Post和Get的多参数传递
POST请求:@RequestBody注解对象参数
GET请求:@SpringQueryMap注解对象参数
Feign的文件上传
依赖 feign-form 包
在文件上传接口参数上加上@RequestPart注解
1.produces、consumes必填。
2.注意区分@RequestPart和RequestParam,不要将@RequestPart(value="file")写成@RequestParam(value="file")。
解决Feign首次请求失败问题
当Feign和Ribbon整合了Hystrix之后,可能会出现首次调用失败的问题
原因分析
Hystrix默认的超时时间是1秒,如果超过这个时间尚未做出响应,将会进入fallback代码。
由于Bean的装配以及懒加载机制等,Feign首次请求都会比较慢。如果这个响应时间大于1秒,就会出现请求失败的问题。
解决方案
将Hystrix的超时时间改为5秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
禁用Hystrix的超时时间
hystrix.command.default.execution.timeout.enabled: false
使用Feign的时候直接关闭Hystrix(不推荐使用)
feign.hystrix.enabled: false
Feign返回图片流处理方式
在fegin接口层返回字节数组
在Controller层返回response或直接输出
Feign调用传递Token
原理:通过实现Fegin的RequestInterceptor请求拦截器接口,在实现类里拦截请求并在请求头上添加token
示例
存在的问题
问题:此方式只能用在hystrix的线程模式为信号量的情况,如果是线程池模式则不行
解决方法:通过修改hystrix的并发策略来实现(参考有道云记录的文章)
参考资料
https://www.cnblogs.com/jing99/p/11625306.html
https://blog.csdn.net/woshiyizhiyu0/article/details/106967857
如果导图对您有用,请在右上角给点个赞吧
0 条评论
下一页
为你推荐
查看更多