分布式架构

【深入浅出SpringCloud】I'm Feign

2019-05-11  本文已影响0人  夏天的风风风

        【微服务>>>远程请求】

        一、简介

        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体系中用来处理远程服务请求的组件,并且整合了负载均衡,让请求更简单。

上一篇下一篇

猜你喜欢

热点阅读