Feign使用继承特性,可以减少编码量,也保证了路径映射和参数的一致性。但是会导致服务提供者和服务消费者的耦合度太高,如果服务提供者修改了一个接口的定义,服务消费者也需要相应的修改,进而带来很多未知的工作量,所以要慎重考虑。
Fegin
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。大家只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。
Feign原理
Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求。通过Feign以及JAVA的动态代理机制,使得Java 开发人员,可以不用通过HTTP框架去封装HTTP请求报文的方式,完成远程服务的HTTP调用。
微服务启动启动时,Feign会进行包扫描,扫描所有包下@FeignClient注解的接口,按照注解的规则,创建远程接口的本地JDK Proxy代理实例。然后,将这些本地Proxy代理实例,注入到Spring IOC容器中。当定义的Feign中的接口被调用时,通过Java的动态代理来生成RequestTemplate。RequestTemplate中包含请求的所有信息,如请求参数,请求URL等。RequestTemplate生成Request,然后将Request交给client处理,这个client默认是Java的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。最后Client封装成LoadBaLanceClient,结合ribbon负载均衡地发起调用。
如果解决了你的疑惑,请点点关注,谢谢支持。