欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud Feign原理詳解

 更新時間:2021年06月07日 17:31:11   作者:起岸星辰  
Feign 主要是幫助我們方便進行rest api服務間的調(diào)用,本文從Spring Cloud對feign封裝的源碼中去了解其主要實現(xiàn)機制

Feign 主要是幫助我們方便進行rest api服務間的調(diào)用,其大體實現(xiàn)思路就我們通過標記注解在一個接口類上(注解上將包含要調(diào)用的接口信息),之后在調(diào)用時根據(jù)注解信息組裝好請求信息,接下來基于ribbon這些負載均衡器來生成真實的服務地址,最后將請求發(fā)送出去;之后將接收到的結(jié)果反序列化為相關(guān)的Java對象供我們直接使用。 下面我們走進Spring Cloud對feign封裝的源碼中去了解其主要實現(xiàn)機制。

Feign的大體機制

通過在啟動類上標記 @EnableFeignClients 注解來開啟feign的功能,服務啟動后會掃描 @FeignClient 注解標記的接口,然后根據(jù)掃描的注解信息為每個接口類生成feign客戶端請求,同時解析接口方法中的Spring MVC的相關(guān)注解,通過專門的注解解析器識別這些注解信息,以便后面可以正確的組裝請求參數(shù),使用 Ribbon 和 Eureka 獲取到請求服務的真實地址等信息,最后使用 http 相關(guān)組件進行執(zhí)行調(diào)用。其大致流程圖如下:

@EnableFeignClients 和 @FeignClient 注解

在EnableFeignClients 注解類中有一個 @Import(FeignClientsRegistrar.class)的配置

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
// 引入FeignClientsRegistrar 來掃描@FeignClient注解下的類
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
    ...
}

我們追蹤代碼進入到FeignClientsRegistrar類中,會發(fā)現(xiàn)FeignClientsRegistrar 類實現(xiàn)了ImportBeanDefinitionRegistrar(在spring context 項目中)接口,因此spring boot啟動時會調(diào)用它的registerBeanDefinitions()方法,該方法中會掃描 EnableFeignClients 和 FeignClient 注解信息并設置相關(guān)信息。

/**
 * spring boot 啟動時會自動調(diào)用 ImportBeanDefinitionRegistrar 入口方法
 */
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata
        , BeanDefinitionRegistry registry) {
    // 讀取 @EnableFeignClients 注解中信息
    registerDefaultConfiguration(metadata, registry);
    // 掃描所有@FeignClient注解的類
    registerFeignClients(metadata, registry);
}

registerDefaultConfiguration方法

在registerDefaultConfiguration()方法中會讀取@EnableFeignClients注解信息,然后將這些信息注冊到一個 BeanDefinitionRegistry 里面去;之后feign的一些默認配置將通過這里注冊的信息中取獲取。

registerFeignClients方法

  • registerFeignClients()方法會掃描相關(guān)包路徑(如果EnableFeignClients的basePackages沒有配置,默認會直接使用啟動類所在的包路徑)下所有的@FeiginClient注解的類
  • 然后根據(jù)@FeiginClient注解信息向BeanDefinitionRegistry里面注冊bean,注意這里設置的bean名稱生成規(guī)則是使用服務名+FeignClientSpecification.class.getSimpleName(),因此如果對一個服務寫多個接口類會發(fā)生bean名稱重復導致注冊失敗。所以需要增加一個 allow-bean-definition-overriding: true 的配置。
  • 最后會調(diào)用 registerFeignClient() 方法注冊feign客戶端,這里的bean名稱的為當前接口類的類路徑。

其流程圖如下:

feign客戶端的動態(tài)代理

上面registerFeignClient()方法中在構(gòu)建bean的時候,實際構(gòu)建的是FeignClientFactoryBean。

BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);

FeignClientFactoryBean 類對父類的getObject()方法進行了重寫,后面動態(tài)代理時使用的就是它來獲取feign client的。在這里會根據(jù)上面注解配置,同時會讀取application.yml配置信息,根據(jù)配置來設置feign的相關(guān)信息,比如編解碼器、注解解析器、請求超時時間等;之后如果沒有設置url那么就會和負載均衡器(ribbon)整合。最后會通過反射將接口中相關(guān)方法進行解析保存供后面進行jdk代理使用。

@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();
  }
  // 需要代理,執(zhí)行代理方法
  return dispatch.get(method).invoke(args);
}

以上就是Spring Cloud Feign原理詳解的詳細內(nèi)容,更多關(guān)于Spring Cloud Feign原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 新手初學Java流程控制

    新手初學Java流程控制

    這篇文章主要介紹了JAVA流程控制語句的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下,希望可以幫到你
    2021-07-07
  • springboot使用@Slf4j進行日志的記錄步驟詳解

    springboot使用@Slf4j進行日志的記錄步驟詳解

    這篇文章主要介紹了springboot使用@Slf4j進行日志的記錄,使用@Slf4j的注解進行日志記錄非常方便,本文給大家分享操作步驟,需要的朋友可以參考下
    2023-08-08
  • JavaWeb學習筆記分享(必看篇)

    JavaWeb學習筆記分享(必看篇)

    下面小編就為大家?guī)硪黄狫avaWeb學習筆記分享(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • MyBatis Plus之實現(xiàn)動態(tài)排序方式

    MyBatis Plus之實現(xiàn)動態(tài)排序方式

    這篇文章主要介紹了MyBatis Plus之實現(xiàn)動態(tài)排序方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 新建Maven工程出現(xiàn)Process?Terminated的問題解決

    新建Maven工程出現(xiàn)Process?Terminated的問題解決

    當Maven出現(xiàn)"Process terminated"錯誤時,這通常是由于配置文件或路徑錯誤導致的,本文主要介紹了新建Maven工程出現(xiàn)Process?Terminated的問題解決,感興趣的可以了解一下
    2024-04-04
  • 分析ThreadLocal內(nèi)存泄漏問題

    分析ThreadLocal內(nèi)存泄漏問題

    ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程生命周期內(nèi)起作用,減少同一個線程內(nèi)多個函數(shù)或者組件之間一些公共變量傳遞的復雜度,但是如果濫用ThreadLocal可能會導致內(nèi)存泄漏,所以本文將為大家分析ThreadLocal內(nèi)存泄漏問題
    2023-07-07
  • Springboot 2使用外部Tomcat源碼分析

    Springboot 2使用外部Tomcat源碼分析

    這篇文章主要介紹了Springboot 2使用外部Tomcat源碼分析,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot 動態(tài)定時器的使用方法

    SpringBoot 動態(tài)定時器的使用方法

    這篇文章主要介紹了SpringBoot 動態(tài)定時器的使用方法,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-05-05
  • 詳解Spring MVC4 純注解配置教程

    詳解Spring MVC4 純注解配置教程

    本篇文章主要介紹了Spring MVC4 純注解配置教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法

    Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法

    這篇文章主要介紹了Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論