本系列代码地址: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: