1、什么是Feign
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。
使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。
具体作用体现在
Feign 采用的是基于接口的注解
Feign 整合了ribbon,具有负载均衡的能力
整合了Hystrix,具有熔断的能力
2、Feign远程调用的基本流程
程序启动时,会进行包扫描,扫描所有包下所有@FeignClient注解的类,按照注解的规则,创建远程接口的本地JDK Proxy代理实例。然后,将这些本地Proxy代理实例,注入到Spring IOC容器中。
当远程接口的方法被调用,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求。由Proxy代理实例去完成真正的远程访问,并且返回结果。
可以不通过HTTP框架请求,完成远程服务的http调用。
3、Feign工作原理
PS:(图片来源网上素材)
1、基于面向接口的动态代理方式生成实现类
使用feign ,需要定义接口,接口上需要使用到Http相关的注解,标识HTTP请求参数信息。
Feign通过基于面向接口的动态代理方式生成实现类,将请求调用
委托到动态代理实现类上
@FeignClient(value = "service-client",fallback = HelloWorldServiceImpl.class)
public interface HelloWorldService {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String helloWorld(@RequestParam(value = "name") String name);
}
2、根据Contract协议规则,解析接口类的注解信息,解析成内部表现
3、基于 RequestBean,动态生成Request
根据传入的Bean对象和注解信息,从中提取出相应的值,来构造Http Request 对象
4、使用Encoder 将Bean转换成 Http报文正文(消息解析和转码逻辑)
5、拦截器负责对请求和返回进行装饰处理
在请求转换的过程中,Feign 抽象出来了拦截器接口,用于用户自定义对请求的操作,比如,如果希望Http消息传递过程中被压缩,可以定义一个请求拦截器。