原生OpenFeign相较于传统HTTP工具的优化和原理

这篇具有很好参考价值的文章主要介绍了原生OpenFeign相较于传统HTTP工具的优化和原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本篇介绍的是springcloud-openfeign的底层框架io.github.openfeign,重点不是框架如何使用,而是介绍Feign如何基于传统HTTP工具使用方式进行抽象改进,提升其灵活性,并简单介绍一下其抽象组件及主要组件的使用时机

1.HTTP工具使用流程及问题

1.1 使用OkHttp3流程示例

以常用的OkHttp3工具框架为例,其一个大致的流程如下:

io.github.openfeign,Java第三方集成框架,# Feign相关,http,java,openfeign

其流程从下面的Java调用代码示例也可以看出来:

public static String doHttpPostReturnAsString(String url, String paramJson, int timeout, 
                        List<Interceptor> interceptors) {
    // 1.初始化客户端
    // 2.设置超时时间
    OkHttpClient client = CLIENT.newBuilder()
            .connectTimeout(timeout, TimeUnit.MILLISECONDS)
            .readTimeout(timeout, TimeUnit.MILLISECONDS)
            .writeTimeout(timeout, TimeUnit.MILLISECONDS)
            .build();
    // 3.设置拦截器
    if (!CollectionUtils.isEmpty(interceptors)) {
        for (Interceptor interceptor : interceptors) {
            client = client.newBuilder().addInterceptor(interceptor).build();
        }
    }
    // 4.根据url构建Request对象
    RequestBody body = RequestBody.create(JSON, paramJson);
    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();
    // 5.调用并获取Response,提取信息后完成调用
    try (Response response = client.newCall(request).execute()) {
        if (response.isSuccessful()) {
            String string = response.body().string();
            return string;
        } else {
            LOGGER.error("doHttpGet error:{}", response.code());
        }
    } catch (Exception e) {
        LOGGER.error("doHttpGet error:", e);
    }
    return null;
}

1.2 存在的两大问题

这只是一个非常简单的实例,把调用方法写成工具类中的静态方法,就形成了一个可复用的静态工具类。其优点就是快速且较为简单维护,但最大缺点有二:

  1. 硬编码实现:如果要支持动态参数就会导致入参臃肿,不便于扩展;
  2. 现在的项目大部分都是用Spring管理对象的,静态工具类的方式也不便于将其纳入到Spring中进行管理,和Spring中大部分的框架没办法优雅的集成。

2.OpenFeign的优化

针对上面说的第一个硬编码实现问题,解决它就需要让每个功能模块分工明确,可替换性强,这样才可以做到不同场景使用不同组件实现以不同功能,避免硬编码问题。而Feign的做法便是使用了这种思路,针对HTTP工具的不同流程,抽象出了对应的组件,每个组件提供默认的实现,如果要针对某一流程实现特殊的逻辑,则替换对应的实现组件。

先看个使用Feign的简单示例:

public interface TestFeign {
    /**
     * 测试方法
     */
    @RequestLine("GET /test.json")
    String test();
}

public void test() {
    TestFeign testFeign = Feign.builder()
            // .contract(new XXXContract()) 可替换
            // .encoder(new XXXEncoder()) 可替换
            // .decoder(new XXXDecoder()) 可替换
            .client(new OkHttpClient())
            .requestInterceptors(new ArrayList<>())
            .target(TestFeign.class, "localhost:8080");
    // 调用HTTP API像调用方法一样,调用路径为:GET localhost:8080/test.json
    System.out.println(testFeign.test());
}

OpenFeign的调用流程相较于静态工具类变成了两步:

  1. 先使用Feign构造实例化一个接口代理对象;
  2. 调用接口对象的对应方法完成HTTP API的调用。

OpenFeign使用了大量组件来避免硬编码问题,向开发者屏蔽了操作HTTP工具的API操作。在传统的HTTP调用流程中Openfeign引入了如下变化:

io.github.openfeign,Java第三方集成框架,# Feign相关,http,java,openfeign

从图中可以看到引入的组件非常多,针对HTTP工具执行一系列操作时引入了相应的组件,但关键核心的组件一共就5个:

  1. Contract(协议):表示Feign支持的协议,一般而言指的是注解,通过替换不同的Contract以支持解析不同的注解。如果需要支持Spring的MVC注解,则需要替换该组件;
  2. Client(客户端):Feign是简化HTTP调用的框架,本身不提供调用HTTP功能,依赖于客户端的具体实现类。如果要使用不同的HTTP工具,替换Client即可;
  3. RequestTemplate(请求模板):接口方法在编写后,其参数注解等信息基本不会再改动,而请求模板保存的就是实例化时解析注解的信息。如请求头信息、参数对应填充位置等,保证后续填充数据时可直接获取对应位置的对象数据;
  4. Encoder(编码器):将传入的参数进行编码获得body、headers或文件流,负责把方法传入的对象转成对应的编码形式。最常见的是把@ReqeustBody转成json串放到body中;
  5. Decoder(解码器):在获得响应的内容后,需要用解码器把响应内容转成接口方法返回类型的对象。如把常用的json返回串转成对应字段对象。

理解了Feign抽象出这些组件的初衷,就可以很容易理解Feign各个组件的作用了。

3.OpenFeign实现原理

由上节可知,OpenFeign的实现原理分为了两个大的步骤:

  1. 使用Feign构造获得JDK动态代理对象;
  2. 调用动态代理对象的方法执行代理逻辑,并填入请求参数及解析响应数据。

接下来以这两个步骤分别分析一下OpenFeign的实现原理。

3.1 使用Feign构造动态代理对象

相较于原来的静态工具类,这个步骤是多出来的,Feign这样的做法是为了让相同的调用场景下构造出来的对象可以重复使用,提升使用效率。

io.github.openfeign,Java第三方集成框架,# Feign相关,http,java,openfeign

根据上面的流程构造出来的代理对象可以反复使用,一次构造解析,终身使用。因此在使用Spring等容器框架时,通常会把构造出来的代理对象以单例形式放入到容器中,以便使用时直接获取。如下代码:

@Configuration
public class FeignConfiguration {
    @Bean
    public TestFeign testFeign() {
        return Feign.builder()
            // .contract(new XXXContract()) 可替换
            // .encoder(new XXXEncoder()) 可替换
            // .decoder(new XXXDecoder()) 可替换
            .client(new OkHttpClient())
            .requestInterceptors(new ArrayList<>())
            .target(TestFeign.class, "localhost:8080");
    }
}

// 使用时
@Autowired
private TestFeign testFeign;

3.2 Feign动态代理的实现原理

获得构造出来的JDK动态代理对象后,调用接口方法将会触发Feign的动态代理逻辑,帮我们完成HTTP API的调用。

io.github.openfeign,Java第三方集成框架,# Feign相关,http,java,openfeign

图中只写了主流程中比较重要的部分组件及组件在流程中的执行时间,只要知道了不同的组件在Feign工作流程中的生效时机,就可以自定义实现组件替换默认的组件,实现功能的扩展。

Feign解决与容器框架的集成问题便是基于上面两点实现的,把HTTP API写到一个个的接口中,使用JDK动态代理对接口方法完成代理,这样便可以把接口交给容器框架管理,需要使用时把代理对象取出来调用对应的方法即可。

如果框架便于集成,且扩展性很强,那么使用场景便可以得到扩充,如Springcloud便将Feign的组件进行替换,实现了Springcloud-openfeign框架,这也是Feign关键功能抽象组件带来的好处。文章来源地址https://www.toymoban.com/news/detail-733901.html

到了这里,关于原生OpenFeign相较于传统HTTP工具的优化和原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生微服务 第六章 Spring Cloud中使用OpenFeign

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件。我们可

    2024年02月08日
    浏览(35)
  • 关于openfeign的http和rpc

    在这里再次重申一遍什么叫http什么叫rpc HTTP是基于tcp/ip的通信方式 Socket也是基于tcp/ip的通信方式 RPC也是基于tcp/ip的通信方式 openfeign所谓的rpc调用,只不是过一种设计思想,他并没有实现rpc调用,所以他还是http调用。 当说某个技术类似于RPC调用时,通常意思是该技术在使用

    2024年02月07日
    浏览(41)
  • 手写Openfeign实现原理——极简版

    最近开发cloud项目,里面涉及到服务间调用,最后使用的openfeign解决的,于是对于openfeign的底层原理有些兴趣了,提前透露一下底层无非就是使用一些http调用的工具帮助我们实现了请求调用 首先创建一个springboot项目 有一个发送请求的工具这里使用的ribbon 创建两个自定义注解

    2024年02月10日
    浏览(43)
  • OpenFeign 基本介绍和原理了解

    OpenFeign 组件的前身是 Netflix Feign 项目。后来 Feign 项目被贡献给了开源组织,才有了今天使用的 Spring Cloud OpenFeign 组件。 OpenFeign 提供了一种 声明式的远程调用接口 ,它可以大幅简化远程调用的编程体验。用一个代码片段看一下,由 OpenFeign 发起的远程服务调用的代码风格是

    2023年04月22日
    浏览(40)
  • Web压测工具http_load原理分析

    01、前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ 这个软件一直在保持着更新(不像webbench,已经是十年的老古董了。 webbench的源码分析请参考:http://www.cnblogs.com/xuning/p/3888699.html ),并且更新频

    2024年02月10日
    浏览(38)
  • 聊聊传统监控与云原生监控的区别

    传统监控的本质就是收集、分析和使用信息来观察一段时间内监控对象的运行进度,并且进行相应的决策管理的过程,监控侧重于观察 特定 指标。 但是随着云原生时代的到来,我们对监控提出了更多的要求: 通过监控了解数据趋势,知道系统在未来的某个时刻可能出问题,

    2024年02月16日
    浏览(46)
  • 辅助性能优化——长安链性能分析工具原理及用法

    如何提升区块链系统性能是很多开发者都会关注的事,但是有些对区块链并非十分熟悉的开发者可能会感到没有头绪。长安链提供了性能分析工具帮助开发者梳理系统耗时,优化系统性能。下面对长安链性能分析工具原理及使用进行介绍。 time_counter.sh是长安链性能分析工具,

    2024年02月13日
    浏览(57)
  • OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息

    记录 :391 场景 :基于Spring Cloud OpenFeign调用微服务Restful接口时,请求头从A服务传递到B服务,可以使用RequestInterceptor接口或者@RequestHeader注解传递请求头信息。 版本 :JDK 1.8,SpringBoot 2.6.3,springCloud 2021.0.1 1.使用RequestInterceptor传递请求头信息 1.1关于RequestInterceptor RequestIntercepto

    2024年02月14日
    浏览(41)
  • 从传统云架构到云原生生态体系架构的演进

    随着科技的不断发展,云计算领域也经历了巨大的变革。这一演进的核心焦点是从传统云架构过渡到云原生生态体系架构,这个过程在过去的几年里已经发生了显著变化。本文将深入探讨这一演进过程,以及它对企业和技术生态系统的影响。 在云计算兴起之初,虚拟化技术是

    2024年02月08日
    浏览(40)
  • 与世界分享我刚编的mysql http隧道工具-hersql原理与使用

    原文地址:https://blog.fanscore.cn/a/53/ 本文是与世界分享我刚编的转发ntunnel_mysql.php的工具的后续,之前的实现有些拉胯,这次重构了下。需求背景是为了在本地macbook上通过开源的mysql可视化客户端(dbeaver、Sequel Ace等)访问我司测试环境的mysql,整个测试环境的如图所示: 那么就有以

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包