最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Feign實現(xiàn)異步調(diào)用

 更新時間:2021年05月14日 09:35:11   作者:努力的小星星  
近期,需要對之前的接口進行優(yōu)化,縮短接口的響應時間,但是springcloud中的feign是不支持傳遞異步化的回調(diào)結(jié)果的,因此有了以下的解決方案,記錄一下,需要的朋友可以參考下

一、背景

希望將http的調(diào)用由同步等待改為異步,仍使用feign的便捷。

二、使用feign理由

本質(zhì)上其實feign就是將httpclient常用的操作進行簡單封裝,且屏蔽底層的httpclient,無感知具體的client實現(xiàn),輕松完成具體client的替換

三、解決方案

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

四、demo代碼實現(xiàn)

4.1 接口編寫

public interface OriginFeignClient {

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

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

}

4.2 接口發(fā)布

@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 調(diào)用

@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 結(jié)果(很明顯,是異步調(diào)用)

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實現(xiàn)是10.8版本,我們找到Spring boot 2.2.13和相應cloud最新版Hoxton.SR11(當然不是最新,是該小版本下最新,因為目前項目中使用的就是該版本),排查思路就是以@EnableFeignClients為入口

1.EnableFeignClients內(nèi)容如下

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

引入了FeignClientsRegistrar

2.FeignClientsRegistrar功能如下:

(1)掃描@FeignClient,并將其下入到BeanDefinition中

(2)調(diào)用registerFeignClient,構(gòu)造FeignClientFactoryBean(創(chuàng)建feign的工廠類,關(guān)鍵在此

(3)進入FeignClientFactoryBean內(nèi)部看下,構(gòu)建feign的方法:getTarget():

從context中去找feign.Feign.Builder的實現(xiàn)(即@Bean),看下當前項目中有哪幾種實現(xiàn):

1.org.springframework.cloud.openfeign.FeignCircuitBreaker.Builder Spring Cloud定義的通用斷路器

2.feign.hystrix.HystrixFeign.Builder 斷路器的原生實現(xiàn)

先不管哪種builder,最終執(zhí)行:loadBalance,方法內(nèi)容如下:

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的創(chuàng)建,不對,等等!!Client,我們先看下他的實現(xiàn)類是不是包含我們的AsyncClient,

一切幻想破滅

好了,所以目前的Spring cloud openfeign中仍未支持該特性,先這樣用吧

到此這篇關(guān)于基于Feign實現(xiàn)異步調(diào)用的文章就介紹到這了,更多相關(guān)Feign異步調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java讀取zip/jar包中文件的幾種方式

    java讀取zip/jar包中文件的幾種方式

    這篇文章主要給大家介紹了關(guān)于java讀取zip/jar包中文件的幾種方式,在我們?nèi)粘J褂弥袎嚎s文件是非常常用的,文中通過示例代碼將java讀取zip/jar包中文件的方法介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Springboot接收文件與發(fā)送文件實例教程

    Springboot接收文件與發(fā)送文件實例教程

    最近工作中遇到個需求,springboot簡單的上傳文檔或者圖片,并且進行操作,操作完后進行保存指定路徑,下面這篇文章主要給大家介紹了關(guān)于Springboot接收文件與發(fā)送文件的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • SpringBoot參數(shù)校驗之@Validated的使用詳解

    SpringBoot參數(shù)校驗之@Validated的使用詳解

    這篇文章主要通過示例為大家詳細介紹一下介紹了SpringBoot參數(shù)校驗中@Validated的使用方法,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • Mybatis Limit實現(xiàn)分頁功能

    Mybatis Limit實現(xiàn)分頁功能

    這篇文章主要介紹了Mybatis Limit實現(xiàn)分頁功能,使用Limit實現(xiàn)分頁可以減少數(shù)據(jù)的處理量,本文通過代碼講解的非常詳細,需要的朋友可以參考下
    2021-04-04
  • SpringSecurity 自定義表單登錄的實現(xiàn)

    SpringSecurity 自定義表單登錄的實現(xiàn)

    這篇文章主要介紹了SpringSecurity 自定義表單登錄的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 基于Java實現(xiàn)抽獎系統(tǒng)

    基于Java實現(xiàn)抽獎系統(tǒng)

    這篇文章主要為大家詳細介紹了基于Java實現(xiàn)抽獎系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • MyBatis逆向工程的創(chuàng)建和使用

    MyBatis逆向工程的創(chuàng)建和使用

    這篇文章主要介紹了MyBatis逆向工程的創(chuàng)建和使用,需要的朋友可以參考下
    2017-08-08
  • Java中進程與線程的區(qū)別

    Java中進程與線程的區(qū)別

    這篇文章主要介紹了Java進程與線程的區(qū)別,進程(Process)是操作系統(tǒng)分配資源的基本單位,線程(Thread)是操作系統(tǒng)能夠進行運算調(diào)度的基本單位,下文更多兩者區(qū)別。需要的小伙伴可以參考一下
    2022-05-05
  • java使用ajax完成上傳文件

    java使用ajax完成上傳文件

    這篇文章主要為大家詳細介紹了java使用ajax完成上傳文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java中方法作為參數(shù)傳遞的方式

    Java中方法作為參數(shù)傳遞的方式

    這篇文章主要介紹了Java如何讓方法作為參數(shù)傳遞,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論

塔河县| 吉木乃县| 安平县| 永城市| 吴忠市| 平利县| 时尚| 漳浦县| 连城县| 南京市| 泗阳县| 民勤县| 依兰县| 平和县| 军事| 星子县| 德清县| 红原县| 周口市| 夏津县| 赣榆县| 万盛区| 彭阳县| 宁远县| 吉水县| 西宁市| 延长县| 齐齐哈尔市| 台中县| 博客| 贵港市| 宾川县| 自治县| 榆社县| 永善县| 鲁甸县| 平顺县| 鄂温| 天等县| 札达县| 垦利县|