本系列代码地址:https://github.com/JoJoTec/sp...
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: