【深入浅出SpringCloud】I'm Feign
【微服务>>>远程请求】
一、简介
Feign是一种声明式、模板化的HTTP客户端,可以做到使用HTTP请求远程服务,就像调用本地方法一样,但是本质上还是远程服务(从分布式事务角度看)。
二、Feign的特性
1 可插拔的注解支持,包括Feign注解和JAX-RS注解;
2 支持可插拔的HTTP编码器和解码器;
3 支持Hystrix和它的Fallback;
4 支持Ribbon的负载均衡;
5 支持HTTP请求和响应的压缩。
三、工作原理
1 在应用程序开发阶段,我们在启动类上添加 @EnableFeignClients 注解来开启对Feign Client的扫描和加载,然后根据Feign Client的开发规范,定义Feign接口,并在接口上添加 @FeignClients 注解;
2 当程序启动时,会根据配置进行包扫描,扫描所有 @FeignClients 的接口类,然后将扫描到的类信息注入Spring IOC 容器中。当Feign接口中的方法被调用时,通过JDK的代理的方式,来生成具体的RequestTemplate。当生成代理时,Feign会为每个接口方法创建一个RestTemplate对象,该对象封装了HTTP请求需要的全部信息,如请求参数名、请求方法等信息都是在这个过程中确定的;
3 然后由RequestTemplate生成Request对象,然后把Request教给Client处理,这里的Client可以使JDK原生的URLConnection(默认的HttpClient)、Apache的Http Client或者Okhttp,最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡进行服务请求。
四、基础功能
Feign注解的常用属性如下:
1 name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现;
2 url:一般用于调试,可以手动指定 @FeignClient 的调用地址;
3 decode404:发生404错误,如果该属性为true,则调用decode进行解码,否则抛出FeignException;
4 configuration:Feign的配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract;
5 fallback:定义容错的处理类,当调用远程接口出现失败或超时的情况,会调用对应接口的容错逻辑,fallback指定的类必须实现 @FeignClient 标记的接口;
6 fallbackFactory:工厂类,用于生成fallback类示例,实现每个接口通用的容错逻辑;
7 path:定义当前FeignClient的统一前缀。
五、特别注意
Feign的调用分两层,即Ribbon的调用和Hystrix的调用,高版本的Hystrix默认是关闭的。
注意Ribbon超时 和 Hystrix超时,每种超时都有相关配置来解决。
当Feign和Ribbon整合了Hystrix之后,可能会出现首次请求失败的情况,造成这种情况的原因是Hystrix默认的超时时间是1秒,Feign首次请求会比较慢,所以容易出现这个问题。解决该问题的方法有三种:
1 将Hystrix的超时时间延长至5秒;
2 禁用Hystrix的超时时间;
3 关闭Hystrix(路子太野,不建议使用)。
六、简单总结
Feign就是Spring Cloud体系中用来处理远程服务请求的组件,并且整合了负载均衡,让请求更简单。