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

Spring?Cloud?OpenFeign?遠程調用

 更新時間:2022年08月22日 09:13:46   作者:austin  
這篇文章主要介紹了Spring?Cloud?OpenFeign?遠程調用,本文通過遠程調用的GitHub開放API用到的OpenFeign作為示例代碼作為入口進行講解。然后以圖解+解讀源碼的方式深入剖析了OpenFeign的運行機制和架構設計,需要的朋友可以參考一下

一、什么是Feign?

Feign makes writing java http clients easier,這是官方給出的一個說明,本意翻譯是:Feign使編寫Java http客戶端更容易,Feign是一個http請求調用的輕量級框架,可以以Java接口注解的方式調用Http請求,F(xiàn)eign可以通過處理注解,將請求模板化,當實際調用的時候,傳入參數(shù),根據(jù)參數(shù)再應用到請求上,進而轉化成真正的請求。

Feign封裝了Http調用流程,更適合面向接口化的編程習慣。

在服務調用的場景中,我們經常調用基于Http協(xié)議的服務,而我們經常使用到的遠程調用框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Forest、Netty等等,這些框架在基于自身的專注點提供了自身特性。而從角色劃分上來看,他們的職能是一致的提供Http調用服務。

二、??理解遠程調用

  • 本地調用(Local Procedure Call,簡稱LPC
  • 遠程調用(Remote Procedure Call,簡稱RPC

feign主要是為我們提供了遠程調用的服務,那么什么是遠程調用呢? 遠程調用說白了可以理解為不同服務之間方法的調用,實質上是兩臺主機間的網絡通信 ,涉及到網絡通信又必然會有序列化、反序列化,編解碼等一些必須要考慮的問題,現(xiàn)在業(yè)界內比較流行的一些 RPC 框架,例如:Dubbo提供的是基于接口的遠程方法調用,通過rpc遠程調用框架,客戶端只需要知道接口的定義即可調用遠程服務。

而 feign主要就是用來簡化我們發(fā)起遠程調用的代碼,以一個遠程調用Github開放的API為??:

/**
 * GitHub客戶端GitHubFeign,訪問GitHub開發(fā)平臺API,開放平臺API地址:https://www.apifox.cn/apihub/
 *
 * @author: jacklin
 * @date: 2022/6/30 21:20
 */
@FeignClient(name = "github-client", url = "https://api.github.com")
public interface GitHubFeign {


    /**
     * 查找github標準庫信息
     * <p>
     * https://api.github.com/search/repositories   v
     *
     * @author: jacklin
     * @since 2022/6/30 21:27
     **/
    @GetMapping(value = "/search/repositories", produces = MediaType.APPLICATION_JSON_VALUE)
    String searchRepositories(@RequestParam("q") String q);
}

第一步: Maven pom文件中引入 OpenFeign 組件。

第二步:客戶端需要定義一個GitHubFeign接口,里面定義一個searchRepositories()方法,可以看到這個接口上添加了@FeignClient注解,而括號里面指定了服務名:github-client,顯示聲明這個接口是用來遠程調用GitHub API服務的,url用來指定調用服務的全路徑,其他方法路徑前綴必須與url地址一致,完整的請求路徑URL地址:https://api.github.com/search/repositories

第三步:需要在服務啟動類添加@EnableFeignClients注解,在服務啟動時,Spring掃描被@FeignClints修飾的接口,基于動態(tài)代理生成本地JDK Proxy代理對象實例,然后將這些代理實例注冊到Spring IOC容器中,當遠程接口被調用時,由Proxy代理實例去完成真正的遠程訪問,并返回結果。

第四步:在Controller引入GitHubFeign服務,完成遠程服務調用:

@RestController
@RequestMapping(value = "/github", produces = MediaType.APPLICATION_JSON_VALUE)
public class GithubController {

    @Resource
    private GitHubFeign gitHubFeign;

    /**
     * 查找github標準庫信息
     *
     * @author: jacklin
     * @since 2022/6/30 21:36
     **/
    @GetMapping(value = "/searchRepositories")
    String searchRepositories(@RequestParam(value = "q") String q) {
        return gitHubFeign.searchRepositories(q);
    }
}

返回結果數(shù)據(jù)如下??:

可以看出,feign使得遠程調用跟本地方法是一樣,極大的簡化了rpc遠程調用的方式。

三、OpenFeign和Feign的區(qū)別

可以認為OpenFeign是Feign的增強版,不同的是OpenFeign支持Spring MVC注解

FeignOpenFeign
Feign是Netflix公司寫的,是SpringCloud組件中的一個輕量級RESTful的HTTP服務客戶端,是SpringCloud中的第一代負載均衡客戶端。OpenFeign的前身是Neflix Feign,Spring Cloud在Feign的基礎上擴展支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態(tài)代理的方式產生實現(xiàn)類,實現(xiàn)類中做負載均衡并調用其他服務。

OpenFeignFeign底層都內置了Ribbon負載均衡組件,在導入OpenFeign依賴后無需專門導入Ribbon依賴,用做客戶端負載均衡,去調用注冊中心服務。

四、OpenFeign核心工作原理

  • 通過 @EnableFeignCleints觸發(fā)Spring應用程序對classpath中@FeignClient修飾類的掃描。
  •  解析到 @FeignClient 修飾類后,Feign框架通過擴展Spring Bean Deifinition的注冊邏輯,最終注冊一個FeignClientFacotoryBean進入Spring容器
  •  Spring容器在初始化其他用到 @FeignClient 接口的類時, 獲得的是FeignClientFacotryBean產生的一個代理對象Proxy
  •  基于Java原生的動態(tài)代理機制,針對Proxy的調用,都會被統(tǒng)一轉發(fā)給Feign框架所定義的一個 InvocationHandler,由該Handler完成后續(xù)的HTTP轉換,發(fā)送、接收以及HTTP響應的工作。

五、OpenFeign包掃描原理

要想通過OpenFeign實現(xiàn)遠程調用,就涉及到一個OpenFeign的核心注解:@EnableFeignClient,根據(jù)字面意思可以知道,該注解是開啟OpenFeign的功能,一般都會被添加到我們的啟動類上。

Spring包掃描的大體流程:

  • 開啟OpenFeign功能@EnableFeignClients,接著通過@Import(FeignClientsRegistrar.class) 這個import的方式導入FeignClientsRegistrar類,開啟OpenFeign組件的加載。
@SpringBootApplication
@EnableFeignClients
public class MambaBlockDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MambaBlockDemoApplication.class, args);
    }
}

FeignClientsRegistrar負責Feign接口的加載,源碼如下:

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
   //注冊配置
   registerDefaultConfiguration(metadata, registry);
   //注冊FeignClient
   registerFeignClients(metadata, registry);
}
  • registerFeignClients()方法會調用findCandidateComponents()方法來查找指定路徑的basePackages下所有被@FeignClients注解修飾的類、接口。
LinkedHashSet<BeanDefinition> candidateComponents = Set<BeanDefinition> findCandidateComponents(String basePackage)
  • 只保留被@FeignClient的修飾的接口。
for (BeanDefinition candidateComponent : candidateComponents) {
   if (candidateComponent instanceof AnnotatedBeanDefinition) {
      // verify annotated class is an interface
      AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
      AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
      Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");

      Map<String, Object> attributes = annotationMetadata
            .getAnnotationAttributes(FeignClient.class.getCanonicalName());

      String name = getClientName(attributes);
      registerClientConfiguration(registry, name, attributes.get("configuration"));
      //注入到Spring容器中
      registerFeignClient(registry, annotationMetadata, attributes);
   }
}

六、總結

本文通過遠程調用的GitHub開放API用到的OpenFeign作為示例代碼作為入口進行講解。然后以圖解+解讀源碼的方式深入剖析了OpenFeign的運行機制和架構設計

到此這篇關于Spring Cloud OpenFeign 遠程調用的文章就介紹到這了,更多相關Spring Cloud OpenFeign 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring源碼學習之動態(tài)代理實現(xiàn)流程

    Spring源碼學習之動態(tài)代理實現(xiàn)流程

    這篇文章主要給大家介紹了關于Spring源碼學習之動態(tài)代理實現(xiàn)流程的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 帶你了解10道java入門面試題

    帶你了解10道java入門面試題

    面試題相信大家都不陌生,想要一個好的工作面試題必不可少的,下面和小編一起來學習與了解Java當中有有些什么面試題吧,希望能給你帶來幫助
    2021-08-08
  • 詳解SpringBoot基礎之banner玩法解析

    詳解SpringBoot基礎之banner玩法解析

    SpringBoot項目啟動時會在控制臺打印一個默認的啟動圖案,這個圖案就是我們要講的banner,這篇文章主要介紹了SpringBoot基礎之banner玩法解析,感興趣的小伙伴們可以參考一下
    2019-04-04
  • MybatisPlus中如何調用Oracle存儲過程

    MybatisPlus中如何調用Oracle存儲過程

    這篇文章主要介紹了MybatisPlus中如何調用Oracle存儲過程的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • springboot普通類中如何獲取session問題

    springboot普通類中如何獲取session問題

    這篇文章主要介紹了springboot普通類中如何獲取session問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解Java中Thread 和Runnable區(qū)別

    詳解Java中Thread 和Runnable區(qū)別

    這篇文章主要介紹了Java中Thread 和Runnable的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • spring cloud config和bus組件實現(xiàn)自動刷新功能

    spring cloud config和bus組件實現(xiàn)自動刷新功能

    今天通過本文給大家介紹spring cloud config和bus組件實現(xiàn)自動刷新功能,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-10-10
  • 連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路

    連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路

    今天小編就為大家分享一篇關于連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java設計模式之狀態(tài)模式

    Java設計模式之狀態(tài)模式

    這篇文章介紹了Java設計模式之狀態(tài)模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • AsyncHttpClient IOExceptionFilter異常過濾器

    AsyncHttpClient IOExceptionFilter異常過濾器

    這篇文章主要為大家介紹了AsyncHttpClient IOExceptionFilter異常過濾器代碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論