前言
内容分为openFeign大致的使用和源码的个人解读,里面参考了不少其他优秀博客作者的内容,很多地方基本算是拾人牙慧了,不过还是顺着源码读了一遍加深理解。
openFeign 是什么?
Feign是一个声明性web服务客户端。它使编写web服务客户机更加容易,要使用Feign,需要创建一个接口并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。
Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注解的支持,并支持使用Spring Web中默认使用的相同HttpMessageConverters。
Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker和Spring Cloud LoadBalancer,在使用Feign时提供一个负载均衡的http客户端。
如何学习?
框架最大的意义在于使用,其实最好的教程就是边做边参考官方的文档学习。
应用场景?
可以看到openFeign作为服务的调用中转,负责服务之间的连接和请求转发的操作。OpenFeign作为编写服务调用支持组件在spring cloud中占有极为重要的位置。
和RPC的通信框架不同,openFeign使用了传统的http作为传输结构。
在以往使用Ribbon的时候,服务调用通常使用的是手动调用,这需要花费大量的人工协调时间。现在通过openFeign把服务调用“本地化”。调用其他的服务的接口API像调用本地方法一样。这样既不需要频繁的改动接口,又可以控制服务的调用,而不会导致服务提供方的变动而“失效”。
Ribbon、Feign和OpenFeign的区别
Ribbon
Ribbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件
Ribbon 可以用来做客户端负载均衡,调用注册中心的服务
Ribbon的使用需要代码里手动调用目标服务,请参考官方示例:官方示例
Feign
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端。
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。
Feign支持的注解和用法请参考官方文档:官方文档。
Feign本身不支持Spring MVC的注解,它有一套自己的注解。
OpenFeign
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的 @RequestMapping注解下的接口,并通过动态代{过}{滤}理的方式产生实现类,实现类中做负载均衡并调用其他服务。
根据上面的描述,绘制如下的表格内容:
| - | Ribbon | Feign | OpenFeign |
|---|---|---|---|
| 使用方式 | 手动调用目标服务 | Feign的注解定义接口,调用接口就可以调用注册中心服务 | 可以直接使用服务调用的方式调用对应的服务 |
| 作用 | 客户端负载均衡,服务注册中心的服务调用 | 客户端负载均衡,服务注册中心的服务调用 | 动态代{过}{滤}理的方式产生实现类,实现类中做负载均衡并调用其他服务 |
| 开发商 | Netfix | Spring Cloud | Spring Cloud |
| 特点 | 基于HTTP和TCP等协议负载均衡组件 | 轻量级RESTful的HTTP服务客户端。依靠自我实现的注解进行请求处理 | 支持了Spring MVC的注解的轻量级RESTful的HTTP服务客户端 |
| 目前情况 | 维护中 | 停止维护 | 维护中 |
openFeign增加了那些功能:
- 可插拔的注解支持,包括Feign注解和JSX-RS注解。
- 支持可插拔的HTTP编码器和解码器。
- 支持Hystrix和它的Fallback。
- 支持Ribbon的负载均衡。
- 支持HTTP请求和响应的压缩。
openFeign的client实现方替换:
- 可以使用http client 替换,并且openFeign 提供了良好的配置,可以支持httpclient的细节化配置。
- 使用okHttpClient, 可以实现 okhttpClient 实现自定义的httpclient注入模式,但是会出现一定的问题。