千家信息网

SpringCloud升级2020.0.x版中OpenFeign简介与使用实现思路是怎样的

发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,本篇文章给大家分享的是有关SpringCloud升级2020.0.x版中OpenFeign简介与使用实现思路是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多
千家信息网最后更新 2024年11月15日SpringCloud升级2020.0.x版中OpenFeign简介与使用实现思路是怎样的

本篇文章给大家分享的是有关SpringCloud升级2020.0.x版中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 分以下几步:

  1. 定义远程 HTTP 调用 API 接口

  2. 创建 Feign 代理的 HTTP 调用接口实现

  3. 使用代理类进行调用

具体例子是:

interface GitHub {    /**     * 定义get方法,包括路径参数,响应返回序列化类     * @param owner     * @param repository     * @return     */    @RequestLine("GET /repos/{owner}/{repo}/contributors")    List 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 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 重构是胶水项目需要关心的事情。

以上就是SpringCloud升级2020.0.x版中OpenFeign简介与使用实现思路是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0