SpringCloud升级之路2020.0.x版-25.OpenFeign简介与使用

OpenFeign 的由来和实现思路
在微服务系统中,我们经常会进行 RPC 调用。在 Spring Cloud 体系中,RPC 调用一般就是 HTTP 协议的调用。对于每次调用,基本都要经过如下步骤:
- 找到微服务实例列表并选择一个实例
- 调用参数序列化
- 使用 Http 客户端将请求发送出去
- 响应处理,反序列化等等
除了这些公共逻辑,业务上只需要定义参数,HTTP 方法,HTTP URI,响应就可以,也就是使用接口就能定义:
interface HttpBin {
@Get(uri = "/get")
String get(@Param("param") String param);
}
例如上面这个接口,就定义了一个 HTTP 请求,HTTP 方法为 GET,路径是 /get,参数是 param,响应为 String 类型。之后只要定义好公共逻辑,就能使用这个接口进行调用了。
对于这些公共逻辑的实现设计,我们很自然的就能想到切面与动态代理。之前的章节,我们提到过 JDK 中有针对接口的动态代理,其实就是实现 java.lang.reflect.InvocationHandler 然后针对这个接口实现代理类。之后使用这个代理类进行调用即可走入 InvocationHandler 中定义的逻辑。
以上,就是 OpenFeign 的设计实现思路与用途。
OpenFeign 简介
OpenFeign 是一个基于声明式(通过类元数据定义,例如注解等)定义的 HTTP 请求客户端。这个库可以让你通过注解来自动生成调用对应 HTTP 服务的客户端,从代码上看调用这个远程服务和调用本地服务方法一样。OpenFeign 支持多种 HTTP 注解,包括 Feign 注解和 JAX-RS 注解,并且可以通过配置类似于插件的形式支持不同种类的注解。同时,还可以配置编码器,解码器,来编码请求并解码响应。底层的 HTTP Client 也是可以配置的,你可以使用 Java 原生的 Http 链接,也可以使用 Apache HttpClient 还有 OkHttpClient 等等。
目前 OpenFeign 还在不断迭代更新中,可以通过这个链接查看当前的 RoadMap。当前我们使用的是 OpenFeign 11,当前实现中或者计划中的特性包括:
- 响应缓存,支持进程内或者跨进程响应缓存(实现中)
- 实现更完善的 URI 模板支持(实现中)
- 重构 Logger 日志 API(实现中)
- 重构 Retry 重试 API(实现中)
- 采集指标相关 API(下一步要实现)
- 通过
CompletableFuture作为基础类,实现异步 API(当前已经有基本实现,下一步完整实现) - 响应式 API (下一步要实现)
- 断路器相关支持(计划中)
OpenFeign 基本使用
我们先来看 OpenFeign 的使用,先不关心 Spring Cloud 环境下如何使用,这样更能理解其底层原理。单独使用 OpenFeign 分以下几步:
- 定义远程 HTTP 调用 API 接口
- 创建 Feign 代理的 HTTP 调用接口实现
- 使用代理类进行调用
具体例子是:
interface GitHub {
/**
* 定义get方法,包括路径参数,响应返回序列化类
* @param owner
* @param repository
* @return
*/
@RequestLine("GET /repos/{owner}/{repo}/contributors")
List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repository);
/**
* 响应体结构类
*/
class Contributor {
String login;
int contributions;
public Contributor() {
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public int getContributions() {
return contributions;
}
public void setContributions(int contributions) {
this.contributions = contributions;
}
}
}
public static void main(String[] args) {
//创建 Feign 代理的 HTTP 调用接口实现
GitHub github = Feign.builder()
//指定解码器为 FastJsonDecoder
.decoder(new FastJsonDecoder())
//指定代理类为 GitHub,基址为 https://api.github.com
.target(GitHub.class, "https://api.github.com");
List<GitHub.Contributor> contributors = github.contributors("OpenFeign", "feign");
}
/**
* 基于 FastJson 的反序列化解码器
*/
static class FastJsonDecoder implements Decoder {
@Override
public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
//读取 body
byte[] body = response.body().asInputStream().readAllBytes();
return JSON.parseObject(body, type);
}
}
在上面这个例子中,我们定义了访问 GET https://api.github.com/repos/{owner}/{repo}/contributors 这个接口的 OpenFeign 客户端,并自定义了响应解码器,反序列化了响应体。这就是 OpenFeign 的基本使用。

我们这一节详细介绍了 OpenFeign 的设计思路以及 RoadMap,了解这些之后,我们再来详细分析 Openfeign,就能理解其中的一些设计以及使用思路了。并且某些重构中的特性,我们在使用中需要格外注意,不过也不必担心,因为在 Spring Cloud 中使用 OpenFeign 的特性都是通过加入胶水项目依赖实现的,底层 API 重构是胶水项目需要关心的事情。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:

SpringCloud升级之路2020.0.x版-25.OpenFeign简介与使用的更多相关文章
- SpringCloud升级之路2020.0.x版-12.UnderTow 简介与内部原理
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 在我们的项目中,我 ...
- SpringCloud升级之路2020.0.x版-26.OpenFeign的组件
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 首先,我们给出官方文档中的组件结构图: 官方文档中的组件,是以实现功能为维度的,我们这里是 ...
- SpringCloud升级之路2020.0.x版-27.OpenFeign的生命周期-创建代理
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 的生命周期,结合 OpenFeign 本身的源代 ...
- SpringCloud升级之路2020.0.x版-28.OpenFeign的生命周期-进行调用
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 同步环境下的生命周期的第二部分,使用 Synch ...
- SpringCloud升级之路2020.0.x版-1.背景
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring ...
- SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(1)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,将进入我们升级之路的又一大模块,即网关模块.网关模块我们废弃了已经进入维护状态的 ...
- SpringCloud升级之路2020.0.x版-6.微服务特性相关的依赖说明
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford spring-cl ...
- SpringCloud升级之路2020.0.x版-10.使用Log4j2以及一些核心配置
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Log4 ...
- SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...
随机推荐
- C#设计模式---迭代器模式(Iterator Pattern)
一.目的 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节. 二.定义 迭代器模式提供了一种方法访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可 ...
- 理解java调试的工作目录 working directory
原文链接使用idea或者eclipse进行调试的时候会有Working directory配置: 我们创建工程,IDE会自动创建一个工程目录,假设工程名称为:TestProject,那么在会创建一个目 ...
- Dijkstra链路状态选路算法
- java 接口代理
接口 public interface Cc { void say(); } 实现类: public class C implements Cc{ @Override public void say( ...
- shiro登录源码
//1.获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManage ...
- 修改Windows7系统默认软件安装目录
Windows7系统默认软件安装目录都在C盘Program Files文件夹有时候我们需要把软件安装到其他地方,如果每次安装的时候都要重新选择一次十分麻烦,下面Windows7之家教你修改软件默认安装 ...
- 学习 Webpack5 之路(优化篇)
一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...
- zabbix 历史数据处理
问题描述 zabbix server 平稳运行有一段时间了,但是最近问题却来了,今天早上收到zabbixserver磁盘空间不足的告警.通过查看之后发现是大部分数据是zabbix 库的的数据 在进一步 ...
- DLL延时加载技术与资源释放
DLL延时加载技术与资源释放 0x00 前言 诸如调用非Windows的第三方库,我们或许会使用到dll文件,而这个时候原本程序运行需要相应的dll文件才能加载启动.通过DLL延时加载技术,使用延时加 ...
- python关键字--yield
彻底理解Python中的yield