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

詳解openfeign集成spring?cloud?loadbalancer實現負載均衡流程

 更新時間:2023年07月06日 09:45:07   作者:子瞻  
這篇文章主要介紹了openfeign集成spring?cloud?loadbalancer實現負載均衡流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Feignclient負載均衡中如何起作用

當我們在項目中調用自己實現的Feignclient負載均衡中如何起作用?請看下圖:

圖一

在圖一中我們可以發(fā)現,在ConsumerController中調用自定義的DemoFeignClient方法時,通過spring容器中對DemoFeignclient的代理類的調用最終通過feign.SynchronousMethodHandler.invoke()->openfeign.loadbalancer.execute()->org.springframework.cloud.loadbalancer.blocking.client.FeignBlockingLoadBalancerClient.choose()->org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer.choose()這樣的調用鏈,最終執(zhí)行spring cloud loadbalaner中的輪詢負載均橫策略!

然而,上圖中的這些關鍵類是如何組合起來發(fā)揮作用呢?請我們一起繼續(xù)分析!spring cloud項目啟動后,spring容器解析并加載LoadBalancerClientConfiguration.java配置文件(如下圖所示)

圖二

然后將"reactorServiceInstanceLoadBalancer"注冊到beanDefinitionMap中。
然后會掃描我們聲明的controller,因為conroller中注入了DemoFeignClient,因此spring容器會遞歸創(chuàng)建DemoFeignClient,創(chuàng)建DemoFiegnClient過程中會通過AbstractAutowireCapableBeanFactory.obtainFromSupplier()注入instanceSupplier實例,也就是FeignClientFactoryBean實例!

主要邏輯

下面是org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClient()方法主要邏輯:

private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata,
            Map<String, Object> attributes) {
          //忽略非核心代碼片段
            BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(clazz, () -> {
            //設置url
            factoryBean.setUrl(getUrl(beanFactory, attributes));
            //設置路徑
            factoryBean.setPath(getPath(beanFactory, attributes));
            //decode404 布爾值            factoryBean.setDecode404(Boolean.parseBoolean(String.valueOf(attributes.get("decode404"))));
            Object fallback = attributes.get("fallback");
            //設置fallback
            if (fallback != null) {
                factoryBean.setFallback(fallback instanceof Class ? (Class<?>) fallback
                        : ClassUtils.resolveClassName(fallback.toString(), null));
            }
            //設置fallback工廠類
            Object fallbackFactory = attributes.get("fallbackFactory");
            if (fallbackFactory != null) {
                factoryBean.setFallbackFactory(fallbackFactory instanceof Class ? (Class<?>) fallbackFactory
                        : ClassUtils.resolveClassName(fallbackFactory.toString(), null));
            }
            //實例化我們聲明的DemoClient
            return factoryBean.getObject();
        });
}

這還沒有完,org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject()中最終執(zhí)行l(wèi)oadBalance();在loadBalance()中實例化FeignInvocationHandler;

調用DemoFeignClient中方法

在項目啟動成功之后,我們調用DemoFeignClient中的方法時

圖三

通過圖三可以發(fā)現,描述DemoFeignClient的RootBeanDefinition的類中還有一個叫“instanceSupplier”的類型屬性,它的值是“FeignClientsRegistrar$lambda”,那么這個類時什么時候被注入進來的呢?答案就是上面分析項目啟動過程中spring容器根據RootBeanDefinition對DemoFeignClient的描述,通過對"FeignClientsRegistrar$lambda"的調用完成對DemoFeignClient實例的創(chuàng)建。

在完成創(chuàng)建DemoFeignClient實例后,我們調用org.springframework.cloud.openfeign.loadbalancer。

FeignBlockingLoadBalancerClient.execute()執(zhí)行負載均衡策略時,執(zhí)行到如下代碼塊

Set<LoadBalancerLifecycle> supportedLifecycleProcessors = LoadBalancerLifecycleValidator
                .getSupportedLifecycleProcessors(
                        loadBalancerClientFactory.getInstances(serviceId, LoadBalancerLifecycle.class),
                        RequestDataContext.class, ResponseData.class, ServiceInstance.class);

"loadBalancerClientFactory.getInstances(serviceId, LoadBalancerLifecycle.class)"邏輯會獲取LoadBalancer實例,最終調用LoadBalancerClientConfiguration.java中的reactorServiceInstanceLoadBalancer()實現創(chuàng)建負載均衡實例邏輯

@Bean
    @ConditionalOnMissingBean
    public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,
            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        //創(chuàng)建負載均衡實例,而且我們發(fā)現默認的負載均衡實例是輪詢負載均衡實例
        return new RoundRobinLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

ok,截止到目前為止,我們的負載均衡實例已經創(chuàng)建完成!

這樣一來,我們通過openfeign進行遠程調用時,通過下圖的調用鏈

圖四

FeignInvocationHandler.invoke()->SynchronousMethodHandler.invoke()->org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute()->org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.choose()->org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer.choose(),這樣的調用鏈最終根據RoundRobinLoadBalancer.choose()獲取服務實例。

public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
                .getIfAvailable(NoopServiceInstanceListSupplier::new);
        //返回服務實例
        return supplier.get(request).next()
                .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances));
    }

拿到服務實例后,FeignBlockingLoadBalancerClient.execute()中最終通過LoadBalancerUtils.executeWithLoadBalancerLifecycleProcessing()獲取響應結果!

下面是具體代碼邏輯:

static Response executeWithLoadBalancerLifecycleProcessing(Client feignClient, Request.Options options,
            Request feignRequest, org.springframework.cloud.client.loadbalancer.Request lbRequest,
            org.springframework.cloud.client.loadbalancer.Response<ServiceInstance> lbResponse,
            Set<LoadBalancerLifecycle> supportedLifecycleProcessors, boolean loadBalanced, boolean useRawStatusCodes)
            throws IOException {
        supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStartRequest(lbRequest, lbResponse));
        try {
            //通過openfeign調用,獲取響應結果
            Response response = feignClient.execute(feignRequest, options);
            if (loadBalanced) {
                supportedLifecycleProcessors.forEach(
                        lifecycle -> lifecycle.onComplete(new CompletionContext<>(CompletionContext.Status.SUCCESS,
                                lbRequest, lbResponse, buildResponseData(response, useRawStatusCodes))));
            }
            return response;
        }
        catch (Exception exception) {
            if (loadBalanced) {
                supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onComplete(
                        new CompletionContext<>(CompletionContext.Status.FAILED, exception, lbRequest, lbResponse)));
            }
            throw exception;
        }
    }

以上就是詳解openfeign集成spring cloud loadbalancer實現負載均衡流程的詳細內容,更多關于spring cloud loadbalancer的資料請關注腳本之家其它相關文章!

相關文章

  • java實現ThreadLocal線程局部變量的實現

    java實現ThreadLocal線程局部變量的實現

    本文主要介紹了java實現ThreadLocal線程局部變量的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • SpringBoot整合iText7導出PDF及性能優(yōu)化方式

    SpringBoot整合iText7導出PDF及性能優(yōu)化方式

    在SpringBoot項目中整合iText7庫以導出PDF文件,不僅能夠滿足報告生成需求,而且可以處理復雜的文檔布局與樣式,整合步驟包括添加Maven依賴、編寫PDF生成代碼,性能優(yōu)化方面,建議使用流式處理、緩存樣式與字體、優(yōu)化HTML/CSS結構、采用異步處理
    2024-09-09
  • springboot security自定義認證過程

    springboot security自定義認證過程

    這篇文章主要介紹了springboot security自定義認證過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java實現簡單的給sql語句賦值的示例

    java實現簡單的給sql語句賦值的示例

    這篇文章主要介紹了java實現簡單的給sql語句賦值的示例,需要的朋友可以參考下
    2014-05-05
  • java正則表達式獲取url的host示例

    java正則表達式獲取url的host示例

    使用httpclient抓取頁面信息時需要填寫HOST,使用此正則提取抓取URL的HOST內容
    2014-02-02
  • java關鍵字static學習心得

    java關鍵字static學習心得

    本篇文章給大家分享一篇關于java關鍵字static的學習心得,有這方面需要的朋友學習下吧。
    2018-01-01
  • java實現點擊按鈕事件彈出子窗口

    java實現點擊按鈕事件彈出子窗口

    這篇文章主要為大家詳細介紹了java實現點擊按鈕事件彈出子窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • idea使用jclasslib插件查看字節(jié)碼

    idea使用jclasslib插件查看字節(jié)碼

    這篇文章主要為大家介紹了idea使用jclasslib插件查看字節(jié)碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 教你使用Java實現掃雷小游戲(最新完整版)

    教你使用Java實現掃雷小游戲(最新完整版)

    本文給大家介紹使用Java實現掃雷小游戲,本程序封裝了五個類,分別是主類GameWin類,繪制底層地圖和繪制頂層地圖的類MapBottom類和MapTop類,繪制底層數字的類BottomNum類,以及初始化地雷的BottomRay類和工具GameUtil類,用于存靜態(tài)參數和方法,感興趣的朋友一起看看吧
    2022-05-05
  • SpringMVC整合SSM實現表現層數據封裝詳解

    SpringMVC整合SSM實現表現層數據封裝詳解

    這篇文章主要介紹了SpringMVC整合SSM實現表現層數據封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10

最新評論

衡水市| 河津市| 吉安市| 巨鹿县| 仪征市| 瑞安市| 饶阳县| 洛川县| 新巴尔虎右旗| 福鼎市| 吴江市| 合阳县| 敦化市| 游戏| 云浮市| 田林县| 镇赉县| 灵山县| 石城县| 体育| 余干县| 阿尔山市| 万山特区| 凤冈县| 响水县| 上高县| 寻甸| 甘洛县| 闵行区| 丹江口市| 高邑县| 江都市| 福建省| 芜湖县| 鄂伦春自治旗| 怀集县| 昌黎县| 舟曲县| 灌云县| 静乐县| 长治市|