一、Feign 的工作原理
Spring Cloud Feign 是一個(gè)聲明式的 Web 服務(wù)客戶端愉老,它使得編寫 Web 服務(wù)客戶端變得非常容易场绿。它是基于 Netflix Feign 開發(fā)的,是一個(gè)輕量級(jí)的 RESTful HTTP 客戶端嫉入。
讓我們來看一下 Feign 的工作原理:
聲明式 REST 客戶端: Feign 提供了一種更簡(jiǎn)單的方法來定義和創(chuàng)建 REST 客戶端焰盗。通過創(chuàng)建接口并用注解來配置請(qǐng)求璧尸,開發(fā)者可以非常容易地定義服務(wù)端點(diǎn)。
集成 Ribbon 和 Hystrix: Feign 自然集成了 Ribbon(負(fù)載均衡器)和 Hystrix(斷路器)熬拒,這意味著在使用 Feign 時(shí)爷光,您可以非常容易地實(shí)現(xiàn)服務(wù)的負(fù)載均衡和容錯(cuò)。
注解支持: Feign 使用注解如 @FeignClient 來聲明一個(gè)接口是一個(gè) Feign 客戶端澎粟,這個(gè)注解包含了服務(wù)的名稱和配置信息蛀序。通過注解 @RequestMapping 或 @GetMapping 等,您可以定義請(qǐng)求的 URL活烙、方法類型等徐裸。
動(dòng)態(tài)代理: 當(dāng)您定義一個(gè) Feign 客戶端接口時(shí),F(xiàn)eign 使用動(dòng)態(tài)代理來生成實(shí)現(xiàn)啸盏。這個(gè)實(shí)現(xiàn)內(nèi)部處理了 HTTP 請(qǐng)求的發(fā)送和結(jié)果的映射重贺。
請(qǐng)求和響應(yīng)的處理: Feign 內(nèi)部使用了 HttpClient 來發(fā)送 HTTP 請(qǐng)求,并且會(huì)自動(dòng)處理請(qǐng)求和響應(yīng)回懦。您可以使用不同的編碼器和解碼器來處理請(qǐng)求和響應(yīng)的數(shù)據(jù)格式气笙。
易于擴(kuò)展: Feign 提供了多種插件,例如編碼器怯晕、解碼器潜圃、攔截器等,這些都可以用來自定義 Feign 的行為贫贝。
二秉犹、@FeignClient注解工作原理
@FeignClient 注解的工作原理是在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建帶注解接口的代理。該接口中的每個(gè)方法對(duì)應(yīng)于對(duì)注釋中指定的服務(wù)的 HTTP 請(qǐng)求稚晚。當(dāng)調(diào)用該接口的方法時(shí)崇堵,Spring會(huì)攔截該調(diào)用并將其轉(zhuǎn)換為HTTP請(qǐng)求,包括URL映射客燕、請(qǐng)求和響應(yīng)正文轉(zhuǎn)換以及標(biāo)頭設(shè)置鸳劳。然后,它將請(qǐng)求發(fā)送到目標(biāo)服務(wù)也搓,處理響應(yīng)赏廓,并將其作為方法的返回值返回。
三傍妒、@FeignClient源碼解析
1. 獲取客戶端名稱
源碼中可以看到類FeignClientsRegistrar的方法registerFeignClients注冊(cè)客戶端
2. 獲取configuration
接著就是將configuration中的配置類加載到BeanDefinitionRegistry中了
3. 注冊(cè)客戶端
接著就是registerFeignClient 注冊(cè)客戶端了幔摸,首先會(huì)將注解屬性添加到definition
最后Feign接口注冊(cè)到了注冊(cè)器中,名稱為包名+接口名颤练,F(xiàn)eign接口實(shí)際生成的Bean對(duì)象為FeignClientFactoryBean