广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Feign实现异步调用
  • 776
分享到

基于Feign实现异步调用

2024-04-02 19:04:59 776人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景二、使用feign理由三、解决方案四、demo代码实现4.1 接口编写4.2 接口发布4.3 调用4.4 结果(很明显,是异步调用) 五、问题一、背景 希望将H

一、背景

希望将Http的调用由同步等待改为异步,仍使用feign的便捷。

二、使用feign理由

本质上其实feign就是将httpclient常用的操作进行简单封装,且屏蔽底层的httpclient,无感知具体的client实现,轻松完成具体client的替换

三、解决方案

feign在10.8版本后提供了Async接口,如下:

四、demo代码实现

4.1 接口编写


public interface OriginFeignClient {

    @RequestLine("POST /async/server/api")

    CompletableFuture<String> api(@Param("param") String param);

}

4.2 接口发布


@Configuration

public class OriginFeignClientConfig {

    @Bean

    public springEncoder springEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {

        return new SpringEncoder(messageConverters);

    }

    @Bean

    public SpringDecoder springDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {

        return new SpringDecoder(messageConverters);

    }

    @Bean

    public OriginFeignClient originFeignClient(SpringEncoder springEncoder, SpringDecoder springDecoder) {

        return AsyncFeign.asyncBuilder()

                .encoder(springEncoder)

                .decoder(springDecoder)

                .target(OriginFeignClient.class, "http://localhost.charlesproxy.com:8090");

    }

}

4.3 调用


@GetMapping("testApi")

    public String testAsyncClient() throws ExecutionException, InterruptedException {

        List<CompletableFuture<String>> results = new ArrayList<>();

        for(int i = 0; i < 10; i++) {

            results.add(originFeignClient.api(i+""));

        }

        Thread.sleep(3000);

        int index = 0;

        for (CompletableFuture<String> result : results) {

            String str = result.get();

            log.info(String.fORMat("%d, result:%s, ", index, str));

            index++;

        }

        return "success";

    }

4.4 结果(很明显,是异步调用)

2021-05-11 14:31:29.989 - INFO [TraceId: , SpanId : ] 24745 --- [NIO-8091-exec-5] c.m.a.c.controller.ClientController : 0, result:receive: {"param":"0"} at 2021-05-11 02:31:27.243,

2021-05-11 14:31:29.993 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 1, result:receive: {"param":"1"} at 2021-05-11 02:31:27.243,

2021-05-11 14:31:29.995 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 2, result:receive: {"param":"2"} at 2021-05-11 02:31:27.244,

2021-05-11 14:31:29.995 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 3, result:receive: {"param":"3"} at 2021-05-11 02:31:27.245,

2021-05-11 14:31:29.995 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 4, result:receive: {"param":"4"} at 2021-05-11 02:31:27.243,

2021-05-11 14:31:29.996 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 5, result:receive: {"param":"5"} at 2021-05-11 02:31:27.243,

2021-05-11 14:31:29.996 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 6, result:receive: {"param":"6"} at 2021-05-11 02:31:27.244,

2021-05-11 14:31:29.997 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 7, result:receive: {"param":"7"} at 2021-05-11 02:31:27.243,

2021-05-11 14:31:29.997 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 8, result:receive: {"param":"8"} at 2021-05-11 02:31:27.244,

2021-05-11 14:31:29.998 - INFO [TraceId: , SpanId : ] 24745 --- [nio-8091-exec-5] c.m.a.c.controller.ClientController : 9, result:receive: {"param":"9"} at 2021-05-11 02:31:27.245,

 五、问题

feign增加的async实现是10.8版本,我们找到Spring Boot 2.2.13和相应cloud最新版Hoxton.SR11(当然不是最新,是该小版本下最新,因为目前项目中使用的就是该版本),排查思路就是以@EnableFeignClients为入口

1.EnableFeignClients内容如下


@Import(FeignClientsReGIStrar.class)
public @interface EnableFeignClients {
}

引入了FeignClientsRegistrar

2.FeignClientsRegistrar功能如下:

(1)扫描@FeignClient,并将其下入到BeanDefinition中

(2)调用registerFeignClient,构造FeignClientFactoryBean(创建feign的工厂类,关键在此

(3)进入FeignClientFactoryBean内部看下,构建feign的方法:getTarget():

从context中去找feign.Feign.Builder的实现(即@Bean),看下当前项目中有哪几种实现:

1.org.springframework.cloud.openfeign.FeignCircuitBreaker.Builder spring cloud定义的通用断路器

2.feign.hystrix.HystrixFeign.Builder 断路器的原生实现

先不管哪种builder,最终执行:loadBalance,方法内容如下:


protected <T> T loadBalance(Feign.Builder builder, FeignContext context,
		HardCodedTarget<T> target) {
	Client client = getOptional(context, Client.class);
	if (client != null) {
		builder.client(client);
		Targeter targeter = get(context, Targeter.class);
		return targeter.target(this, builder, context, target);
	}
 
	throw new IllegalStateException(
			"No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?");
}

 好了!!看到我们想要的了,Client的创建,不对,等等!!Client,我们先看下他的实现类是不是包含我们的AsyncClient,

一切幻想破灭

好了,所以目前的Spring cloud openfeign中仍未支持该特性,先这样用吧

到此这篇关于基于Feign实现异步调用的文章就介绍到这了,更多相关Feign异步调用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于Feign实现异步调用

本文链接: https://www.lsjlt.com/news/125888.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Feign实现异步调用
    目录一、背景二、使用feign理由三、解决方案四、demo代码实现4.1 接口编写4.2 接口发布4.3 调用4.4 结果(很明显,是异步调用) 五、问题一、背景 希望将h...
    99+
    2022-11-12
  • SpringCloud基于Feign的可编程式接口调用实现
    目录前言一、基本使用1.引依赖2.加注解3.声明接口4.调用二、进阶1.日志配置2.性能优化前言 Feign 可以替代 RestTemplate 完成可编程式接口调用,并且内部集成 ...
    99+
    2022-11-13
  • 如何在 PHP 中实现基于 HTTP 的异步 JavaScript 调用?
    在现代的 Web 开发中,异步调用变得越来越普遍。而在 PHP 开发中,我们常常需要与 JavaScript 进行交互。本文将介绍如何在 PHP 中实现基于 HTTP 的异步 JavaScript 调用。 什么是异步调用? 在传统的同步调用...
    99+
    2023-11-06
    http apache javascript
  • SpringCloudGateway调用Feign异步问题记录
    目录HttpMessageConverters原因解决方法Filter异步调用问题场景错误原因解决方案总结版本设定 spring cloud 2020.0.2版本 HttpMessa...
    99+
    2023-05-17
    Spring Cloud Gateway Gateway调用Feign异步 Gateway Feign异步问题
  • 基于JS实现带并发限制的异步调度器
    题目描述 JS实现一个带并发限制的异步调度器scheduler,保证同时运行的任务最多有两个。 例如目前有4个任务,完成时间分别为,1000ms,500ms,300ms,400ms ...
    99+
    2023-05-20
    JS实现异步调度器 JS异步调度器 JS调度器
  • 解决SpringCloud Feign异步调用传参问题
    背景 各个子系统之间通过feign调用,每个服务提供方需要验证每个请求header里的token。 public void invokeFeign() throws Exceptio...
    99+
    2022-11-13
  • SpringCloud基于Feign的可编程式接口怎么调用
    今天小编给大家分享一下SpringCloud基于Feign的可编程式接口怎么调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-30
  • ASP.NET基于事件的异步模式与异步Action怎么实现
    本篇内容主要讲解“ASP.NET基于事件的异步模式与异步Action怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET基于事件的异步模式与异步Action怎么实现”吧!尽管在A...
    99+
    2023-06-17
  • 基于springboot服务间Feign调用超时的解决方案
    解决springboot服务间Feign调用超时问题概述 1、起因 在完成项目功能需求的开发,经过自己测试以及通过测试组测试通过后,昨晚正式部署到线上环境进行正式运行前的最后一次的测...
    99+
    2022-11-12
  • 实现AJAX异步调用和局部刷新的基本步骤
    目录引言1、创建XMLHttpRequest对象2、创建HTTP请求3、设置响应HTTP请求状态变化的函数4、设置获取服务器返回数据的语句5、发送HTTP请求6、局部更新7、完整的A...
    99+
    2022-11-13
  • C#实现基于任务的异步编程模式
    目录一.延续任务二.同步上下文三.使用多个异步方法1.按顺序调用异步方法2.使用组合器四.转换异步模式五.错误处理1.异步方法的异常处理2.多个异步方法的异常处理3.使用Aggreg...
    99+
    2022-11-13
  • C#中怎么实现同步调用和异步调用
    今天就跟大家聊聊有关C#中怎么实现同步调用和异步调用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线...
    99+
    2023-06-17
  • java异步调用怎么实现
    在Java中,可以通过多线程、回调接口、Future和CompletableFuture等方式来实现异步调用。1. 多线程:创建一个...
    99+
    2023-09-16
    java
  • JavaScript如何实现异步调用
    小编给大家分享一下JavaScript如何实现异步调用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题可修改下面的 aa() ...
    99+
    2022-10-19
  • Python 实现异步调用函数
    async_call.py #coding:utf-8 from threading import Thread def async_call(fn): def wrapper(*args, **kwargs): ...
    99+
    2023-01-31
    函数 Python
  • java怎么实现异步调用
    在Java中,可以使用多种方法实现异步调用,下面列举了其中的两种常用方式: 使用线程池:可以使用Java中的`ExecutorSe...
    99+
    2023-10-25
    java
  • 如何实现WCF异步调用
    小编给大家分享一下如何实现WCF异步调用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!原来上网我下了很多WCF异步调用Demo。而我用的是VS2005,我在使用这...
    99+
    2023-06-17
  • WCF如何实现异步调用
    这篇文章主要为大家展示了“WCF如何实现异步调用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WCF如何实现异步调用”这篇文章吧。异步调用是编程中不可缺少的,在工作中积累一点经验,现在我们里关注...
    99+
    2023-06-17
  • 如何自定义feign调用实现hystrix超时、异常熔断
    需求描述 spring cloud 项目中feign 整合 hystrix经常使用,但是最近发现hystrix功能强大,但是对我们来说有些大材小用。 首先我只需要他的一个熔断作用,就...
    99+
    2022-11-12
  • Vue中的同步调用和异步调用怎么实现
    这篇“Vue中的同步调用和异步调用怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中的同步调用和异步调用怎么实现...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作