国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

基于Feign實(shí)現異步調用

發(fā)布時(shí)間:2021-07-06 11:13 來(lái)源:腳本之家 閱讀:0 作者:努力的小星星 欄目: 開(kāi)發(fā)技術(shù) 歡迎投稿:712375056

目錄

    一、背景

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

    二、使用feign理由

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

    三、解決方案

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

    四、demo代碼實(shí)現

    4.1 接口編寫(xiě)

    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 調用

    @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,

     五、問(wèn)題

    feign增加的async實(shí)現是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(創(chuàng )建feign的工廠(chǎng)類(lèi),關(guān)鍵在此

    (3)進(jìn)入FeignClientFactoryBean內部看下,構建feign的方法:getTarget():

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

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

    2.feign.hystrix.HystrixFeign.Builder 斷路器的原生實(shí)現

    先不管哪種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的創(chuàng )建,不對,等等??!Client,我們先看下他的實(shí)現類(lèi)是不是包含我們的AsyncClient,

    一切幻想破滅

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

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

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

    都市激情 在线 亚洲 国产| 久久久久人妻一区精品| 精品福利视频一区二区三区| 精品国产自线午夜福利| 亚洲人av高清无码| 免费A级毛片无码A∨蜜芽试看|