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

Spring中Feign的調(diào)用流程詳解

 更新時間:2023年11月21日 09:06:00   作者:dalianpai  
這篇文章主要介紹了Spring中Feign的調(diào)用流程詳解,分析過了創(chuàng)建的代理是FeignInvocationHandler,那我們就打斷點,停在它的反射方法上,看看到底做了什么,需要的朋友可以參考下

Feign的調(diào)用流程

動態(tài)代理的入口

前面已經(jīng)分析過了創(chuàng)建的代理是FeignInvocationHandler,那我們就打斷點,停在它的反射方法上,看看到底做了什么。

@Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      if ("equals".equals(method.getName())) {
        try {
          Object otherHandler =
              args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
          return equals(otherHandler);
        } catch (IllegalArgumentException e) {
          return false;
        }
      } else if ("hashCode".equals(method.getName())) {
        return hashCode();
      } else if ("toString".equals(method.getName())) {
        return toString();
      }
 
      return dispatch.get(method).invoke(args);
    }

dispatch此處就是之前封裝的5個SynchronousMethodHandler方法的集合,這里更加方法去獲取,然后調(diào)用invoke方法。來到了SynchronousMethodHandler這個方法。

@Override
  public Object invoke(Object[] argv) throws Throwable {
    RequestTemplate template = buildTemplateFromArgs.create(argv);
    Options options = findOptions(argv);
    Retryer retryer = this.retryer.clone();
    while (true) {
      try {
        return executeAndDecode(template, options);
      } catch (RetryableException e) {
        try {
          retryer.continueOrPropagate(e);
        } catch (RetryableException th) {
          Throwable cause = th.getCause();
          if (propagationPolicy == UNWRAP && cause != null) {
            throw cause;
          } else {
            throw th;
          }
        }
        if (logLevel != Logger.Level.NONE) {
          logger.logRetry(metadata.configKey(), logLevel);
        }
        continue;
      }
    }
  }

第一行首先會創(chuàng)建出一個template的,它的結(jié)果如下圖:

image-20211020111759451

最終把上面獲取到的2個變量帶到了executeAndDecode方法,這個方法才是執(zhí)行和解碼的方法。

Object executeAndDecode(RequestTemplate template, Options options) throws Throwable {
      //這里的request就已經(jīng)把服務名給加上了,變成了一個具體的請求。
    Request request = targetRequest(template);
 
    if (logLevel != Logger.Level.NONE) {
      logger.logRequest(metadata.configKey(), logLevel, request);
    }
 
    Response response;
    long start = System.nanoTime();
    try {
       //來到了這里,無論是負載均衡還是請求響應都是這邊完成的,那我們就點進去看看。
      response = client.execute(request, options);
      // ensure the request is set. TODO: remove in Feign 12
      response = response.toBuilder()
          .request(request)
          .requestTemplate(template)
          .build();
    } catch (IOException e) {
      if (logLevel != Logger.Level.NONE) {
        logger.logIOException(metadata.configKey(), logLevel, e, elapsedTime(start));
      }
      throw errorExecuting(request, e);
    }
    long elapsedTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
 
 
    if (decoder != null)
      return decoder.decode(response, metadata.returnType());
 
    CompletableFuture<Object> resultFuture = new CompletableFuture<>();
    asyncResponseHandler.handleResponse(resultFuture, metadata.configKey(), response,
        metadata.returnType(),
        elapsedTime);
 
    try {
      if (!resultFuture.isDone())
        throw new IllegalStateException("Response handling not done");
 
      return resultFuture.join();
    } catch (CompletionException e) {
      Throwable cause = e.getCause();
      if (cause != null)
        throw cause;
      throw e;
    }
  }

image-20211020134735701

image-20211019163335889

Feign是如何實現(xiàn)負載均衡的

image-20211019163652954

image-20211020134908197

先進入到前面的lbClient方法,返回一個FeignLoadBalancer,說明這里和ribbon結(jié)合了。

private FeignLoadBalancer lbClient(String clientName) {
		return this.lbClientFactory.create(clientName);
	}

此處調(diào)用了一個create方法,那就進去看看。

image-20211019164151403

注意這里的factory,其實就是SpringClientFactory,從它里面獲取了lb,lb里面包含了注冊的服務清單,然后再把它放到本地的緩存當中。

image-20211019164405363

接著就會執(zhí)行,現(xiàn)在它的sumbit方法中打一個斷點:

image-20211020140024852

發(fā)現(xiàn)里面會執(zhí)行一個selectServer()方法,肯定是這個里面選擇了服務

image-20211020140146188

在點進去看看,于是就找到了ribbon中熟悉的方法了,就是這里選擇了那個服務

image-20211020140513907

選擇好了那個服務,就繼續(xù)放下走,開始這邊拼接ip和url了

image-20211019164601834

會把選擇的ip和后面請求的url都傳進來。

image-20211020135733168

在其父類的reconstructURIWithServer方法中完成了拼接,如下圖:

image-20211020135847867

后面就是請求響應和解碼了

到此這篇關于Spring中Feign的調(diào)用流程詳解的文章就介紹到這了,更多相關Feign的調(diào)用流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot+Vue添加騰訊云人臉識別的項目實踐

    SpringBoot+Vue添加騰訊云人臉識別的項目實踐

    人臉識別是一種基于人臉特征進行身份認證和識別的技術,本文主要介紹了SpringBoot+Vue添加騰訊云人臉識別的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java8使用Function讀取文件

    Java8使用Function讀取文件

    這篇文章主要為大家詳細介紹了Java8如何使用Function讀取文件,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • 新手了解java IO基礎知識

    新手了解java IO基礎知識

    這篇文章主要介紹了java 基礎知識之IO總結(jié)的相關資料,Java中的I/O分為兩種類型,一種是順序讀取,一種是隨機讀取,需要的朋友可以參考下,希望對你有幫助
    2021-07-07
  • springboot集成Lucene的詳細指南

    springboot集成Lucene的詳細指南

    這篇文章主要為大家詳細介紹了springboot集成Lucene的詳細指南,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-05-05
  • Java程序員必須知道的5個JVM命令行標志

    Java程序員必須知道的5個JVM命令行標志

    這篇文章主要介紹了每個Java程序員必須知道的5個JVM命令行標志,需要的朋友可以參考下
    2015-03-03
  • Spring Batch輕量級批處理框架實戰(zhàn)

    Spring Batch輕量級批處理框架實戰(zhàn)

    本文主要介紹了Spring Batch輕量級批處理框架實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • SpringBoot項目整合jasypt實現(xiàn)過程詳解

    SpringBoot項目整合jasypt實現(xiàn)過程詳解

    這篇文章主要介紹了SpringBoot項目整合jasypt實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • idea統(tǒng)計代碼行數(shù)Statistic的步驟詳解

    idea統(tǒng)計代碼行數(shù)Statistic的步驟詳解

    這篇文章主要介紹了idea統(tǒng)計代碼行數(shù)Statistic的步驟詳解,本文通過使用Statistic插件操作的,通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程

    JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程

    這篇文章主要介紹了JAVA對象分析之偏向鎖、輕量級鎖、重量級鎖升級過程,又對這方面感興趣的同學可以跟著一起研究下
    2021-02-02
  • 理解 Java 核心基礎精髓解析

    理解 Java 核心基礎精髓解析

    這篇文章主要介紹了解 Java 核心基礎精髓解析問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-03-03

最新評論

杂多县| 灵璧县| 静安区| 滨海县| 兴城市| 西林县| 潢川县| 上杭县| 准格尔旗| 嘉鱼县| 赤城县| 赤城县| 普兰县| 堆龙德庆县| 大厂| 奈曼旗| 宁波市| 大厂| 长垣县| 渝北区| 陆川县| 石楼县| 高州市| 太仆寺旗| 平南县| 潞西市| 昔阳县| 万载县| 辰溪县| 苍南县| 仁化县| 衡水市| 沽源县| 澎湖县| 益阳市| 吉隆县| 保定市| 夏河县| 逊克县| 玉田县| 玉树县|