亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Spring Cloud Feign原理詳解

瀏覽:5日期:2023-07-12 11:02:55
目錄Feign的大體機制@EnableFeignClients 和 @FeignClient 注解registerDefaultConfiguration方法registerFeignClients方法feign客戶端的動態代理

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

Feign的大體機制

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

Spring Cloud Feign原理詳解

@EnableFeignClients 和 @FeignClient 注解

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

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

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

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

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

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

其流程圖如下:

Spring Cloud Feign原理詳解

feign客戶端的動態代理

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

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

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

@Overridepublic 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);}

Spring Cloud Feign原理詳解

以上就是Spring Cloud Feign原理詳解的詳細內容,更多關于Spring Cloud Feign原理的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 黑人双插| 四色婷婷婷婷色婷婷开心网 | 六月丁香婷婷综合 | 韩国啪啪高清网站 | 国产高清在线精品一区免费97 | 久久日本精品99久久久 | 国产一区二区视频免费 | 欧美亚洲国产成人高清在线 | 搜索黄色毛片 | 成人欧美一区二区三区白人 | 日本一级特黄刺激爽大片 | 成人在线免费视频播放 | 二区三区不卡不卡视频 | 欧美精品亚洲精品日韩专区 | 免费一级欧美大片视频在线 | 欧美激情人成日本在线视频 | 日本无吗中文字幕免费婷婷 | 一级一毛片 | 中国一级特黄高清免费的大片 | huangse网站免费 | 国产福利视频精品 | 千百橹最新亚洲地址在线播放 | 婷婷丁香在线 | 色综色天天综合网 | 国产一二三区四区乱码2021 | 成人污污视频 | 日韩欧美一区二区三区四区 | 国产成a人片在线观看视频99 | 久久五月视频 | 中文字幕一区二区三区精彩视频 | a一级爱做片免费观看欧美 a一级黄 | 亚洲精品影院 | 一97日本道伊人久久综合影院 | 国产精品一区二区三区免费 | 国产欧美日韩在线观看精品 | 成人污 | 精品国产一区二区三区香蕉沈先生 | 国产男女性做爽歪歪爱视频 | 999久久久精品视频在线观看 | 亚洲欧美综合另类 | 国产一区二区三区毛片 |