SpringCloud升级2020.0.x版之OpenFeign简介与使用实现思路
作者:干货满满张哈希 发布时间:2021-10-02 08:30:56
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent
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 重构是胶水项目需要关心的事情。
来源:https://www.cnblogs.com/zhxdick/p/15364968.html
猜你喜欢
- 引言在高并发的场景下,异步是一个极其重要的优化方向。前段时间,生产环境发生一次事故,笔者认为事故的场景非常具备典型性 。写这篇文章,笔者想和
- 一、Socket是什么Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。Socket 就像一个电话插
- 1、将 Jmeter 下 extras 目录中 ant-jmeter-1.1.1.jar 包拷贝至 ant 安装目录下的lib目录中,否则会
- 官网文档背景项目A中需要多数据源的实现,比如UserDao.getAllUserList() 需要从readonly库中读取,但是UserD
- 本文实例为大家分享了java + dom4j.jar提取xml文档内容的具体代码,供大家参考,具体内容如下资源下载页:点击下载本例程主要借助
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e
- 在【解决方案资源管理器】中找到Form1.cs,单击,快捷键F2重命名为“Login.cs”(命名很
- 本文实例讲述了Spring实战之属性覆盖占位符配置器用法。分享给大家供大家参考,具体如下:一 配置文件<?xml version=&q
- 一.理论准备KMP算法为什么比传统的字符串匹配算法快?KMP算法是通过分析模式串,预先计算每个位置发生不匹配的时候,可以省去重新匹配的的字符
- 本文实例为大家分享了java实现斗地主发牌的具体代码,供大家参考,具体内容如下参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,
- yield()介绍yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;
- 第一次是接触Lambda表达式是在TypeScript中(JavaScript的超集中),当时是为了让TypeScript的this方法外而
- 在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Compa
- <html> <head> &nb
- 一、延迟加载resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),associati
- 一、带时区的时间1.获取当前时间对象(带时区)import java.time.ZonedDateTime;public class dem
- 本文实例为大家分享了JDBC实现学生管理系统的具体代码,供大家参考,具体内容如下1、学生类package manage;import jav
- 出处:https://www.cnblogs.com/SunSpring作为初学者配置maven一般网上搜索。然后你就看到各种配置文件片段,
- 本文实例讲述了Java对XML文件增删改查操作。分享给大家供大家参考,具体如下:xml文件:<?xml version="1
- 近日,Eclipse经常挂掉,都是由于JVM崩溃的原因。每次都有以下错误日志:## A fatal error has been detec