1、简介
Feign的本意是伪装的意思,这也对应了它的功能,原有微服务架构中,HTTP调用使用的是restTemplate,仍然需要大量的与业务不相关的编码,Feign通过对restTemplate 的封装,达到了伪装原有template 的目的,简化代码,为微服务架构带来了极大的优化和提升。
Feign是Spring Cloud Netflix组件中的一个轻量级RESTFul的HTTP服务客户端,实现了负载均衡和REST调用的开源框架,封装了Ribbon和RESTemplate 实现了WebService的面向接口编程,进一步降低了项目的耦合度,提高开发效率。
Feign内置了Ribbon用来做客户端负载均衡调用服务注册中心的服务。
Feign本身并不支持Spring MVC的注解,他有一套自己的注解,为了方便使用,Spring Cloud 便推出了Open Feign。
Feign是一种声明式、模板化的HTTP客户端。
Feign的使用方式是:使用Feign注解定义接口,调用这个接口,就可以调用服务注册中心的服务,不再需要使用REST template调用。但背后还是一样的,这也再次验证Feign的本意为伪装粉饰。
2、解决了什么问题
Feign旨在使编写Java http客户端变得更加简单,Feign简化了RestTemplate的代码,使用Ribbon负载均衡,是的代码更加优雅和简简洁。
Feign使用声明式服务调用组件,其核心目的是:像调用本地方法一样调用远程方法,无感知的HTTP请求。
它像Dubbo一样,Consumer直接调用Provider 的接口方法,而不是通过常规的HTTP Client构造请求再解析返回数据。
3、OpenFeign 和Feign 的区别
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequestMapping、@Pathvariable等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类做负载均衡和服务调用。
4、使用步骤
Feign使用的主要步骤:
1、服务消费者添加Feign依赖
2、创建业务层接口,添加@FeignClient("调用服务名称")注解并声明需要调用的服务
3、业务层抽象方法使用Spring MVC注解配置地址及参数,比如@RequestMapping(/list/order)
4、启动类添加@EnableFeignClients注解启动Feign组件
5、Feign实现负载均衡
Feign封装了Ribbon自然也就继承了负载均衡功能,默认采用轮询策略。
1、全局
在启动类或者配置类中注入负载均衡策略对象,所有服务就会是使用该策略。
@Bean
public RandomRule randomRule() {
return new RandomRule();
}
2、局部
在配置文件中声明随即策略,参考Ribbon
6、原理解析
1、SpringBoot 应用启动时, 由针对@EnableFeignClient这一注解的处理逻辑触发程序扫描 classPath中所有被@FeignClient注解的类, 这里以DemoService为例, 将这些类解析为 BeanDefinition 注册到 Spring 容器中
2、Sping 容器在为某些用的 Feign 接口的 Bean 注入DemoService时, Spring 会尝试从容器中查找 DemoService 的实现类
3、由于我们从来没有编写过DemoService的实现类, 上面步骤获取到的 DemoService 的实现类必然是 feign 框架通过扩展 spring 的 Bean 处理逻辑, 为DemoService创建一个动态接口代理对象, 这里我们将其称为DemoServiceProxy注册到spring 容器中。
4、Spring 最终在使用到DemoService的 Bean 中注入了DemoServiceProxy这一实例。
5、当业务请求真实发生时, 对于DemoService的调用被统一转发到了由 Feign 框架实现的InvocationHandler中,InvocationHandler负责将接口中的入参转换为 HTTP 的形式, 发到服务端, 最后再解析 HTTP 响应, 将结果转换为 Java 对象, 予以返回。
Feign 内部如何整合HTTPtempalte 的工作原理参考:Spring Cloud-Feign设计原理_我的程序人生(亦山札记)-CSDN博客