springcloud之FeignClient使用詳解
前言
在微服務(wù)項(xiàng)目中會(huì)存在多個(gè)微服務(wù)之間互相調(diào)用的情況,如何高效便捷的進(jìn)行遠(yuǎn)程過程調(diào)用便成為新的議論話題。spring-cloud中提供的feign方式可以有效解決該問題。
Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求。
如下testMicroServiceAccess方法便是feignClient調(diào)用,但是外部看起來和普通方法無二。

業(yè)務(wù)場景
假設(shè)同一個(gè)注冊(cè)中心上有兩個(gè)微服務(wù):A和B,為完成某個(gè)業(yè)務(wù)功能,B微服務(wù)需要調(diào)用A微服務(wù)中的某個(gè)方法邏輯獲取返回結(jié)果,并且二者是不能作為jar互相依賴的,按照傳統(tǒng)方式只能如下處理:
請(qǐng)求——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>B微服務(wù)——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>A微服務(wù)——>結(jié)束
即便是拆掉外部網(wǎng)關(guān)和應(yīng)用層,也需要通過內(nèi)部網(wǎng)關(guān)中轉(zhuǎn)才能訪問到A微服務(wù),況且還要考慮超時(shí)熔斷、路由負(fù)載等問題。
引入feign后簡化流程,并且其結(jié)合ribbon實(shí)現(xiàn)路由負(fù)載超時(shí)熔斷等措施,具體流程如下:
請(qǐng)求——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>B微服務(wù)——>feignClient——>A微服務(wù)——>結(jié)束
架構(gòu)說明
按照上述業(yè)務(wù)假設(shè)進(jìn)行架構(gòu)說明:
1、為保持系統(tǒng)良好的可擴(kuò)展性,降低模塊耦合度,新建A-FeignClient模塊,用于提供feign接口和相關(guān)實(shí)體類。后期作為jar文件推送到Maven私服中,供A、B微服務(wù)各自引用。
2、A微服務(wù)中僅需要在啟動(dòng)類上增加開啟feign的注解,可以考慮增加A-FeignClient依賴,這樣三個(gè)模塊使用同一份實(shí)體類,保證一致性。

3、B微服務(wù)中增加A-FeignClient模塊的依賴,編寫客戶端調(diào)用代碼。

調(diào)用邏輯
1、A-FeignClient
- a、在A-FeignClient中增加接口,通過spring注解標(biāo)識(shí)其提供服務(wù)的真正接口路徑。
- b、@FeignClient注解中name值目標(biāo)微服務(wù)名,contextId用于標(biāo)識(shí)FeignClient名。
- c、方法名上的postmapping用于標(biāo)識(shí)該方法需要轉(zhuǎn)發(fā)的接口路徑。下圖代碼示例中意思即:調(diào)用該方法后會(huì)代理到A微服務(wù)的/demoServer/testMicroServiceAccess接口中。
- d、通過實(shí)現(xiàn)該接口的方式新建一個(gè)類,可以用于feign調(diào)用失敗后的容錯(cuò)處理。
package com.demo.DemoFeignClient;
/**
* 微服務(wù)之間調(diào)用的核心接口 Aikes
* 注解@FeignClient中contextID參數(shù)用于標(biāo)識(shí)client,防止多個(gè)接口共用同一個(gè)目標(biāo)FeignClient沖突
*/
@FeignClient(name = "A-server" ,contextId = "DemoFeignClient", fallback = DemoFeignClientFallback.class )
public interface DemoFeignClient{
@PostMapping("/demoServer/testMicroServiceAccess")
public ApiResponse<String> testMicroServiceAccess(@RequestBody ServerAccessRequest<DemoPo> cServerAccessRequest);
}
/**
* 增加訪問失敗時(shí)的處理邏輯
*/
@Component
class DemoFeignClientFallback implements DemoFeignClient{
@Override
public ApiResponse<String> testMicroServiceAccess(ServerAccessRequest<DemoPo> cServerAccessRequest) {
ApiResponse<String> tApiResponse = new ApiResponse<>();
tApiResponse.setStatus(ApiResponse.BUSY);
return tApiResponse;
}
}2、A微服務(wù)
作為服務(wù)提供方,只需要正常編寫業(yè)務(wù)邏輯即可,重點(diǎn)需要考慮請(qǐng)求入?yún)⒌膶?shí)體類把控,建議引用A-FeignClient中,保證一致性。
package com.demo.DemoFeignServerController;
/**
* 服務(wù)提供方 Aikes
*/
@Controller
@RequestMapping("demoServer")
@RestController
@Slf4j
public class DemoFeignServerController {
@PostMapping("/testMicroServiceAccess")
public ApiResponse<String> testMicroServiceAccess(@RequestBody ServerAccessRequest<DemoPo> cServerAccessRequest) {
log.info(cServerAccessRequest.toString());
log.info("This is FeignServerController");
ApiResponse<String> tApiResponse = new ApiResponse<String>();
tApiResponse.setStatus(ApiResponse.SUCCESS);
tApiResponse.setStatusText(ApiResponse.SUCCESS_TEXT);
tApiResponse.setData(cServerAccessRequest.getData().getDemoName());
return tApiResponse;
}
}3、B微服務(wù)
作為服務(wù)消費(fèi)方,在核心邏輯處理中,通過調(diào)用引入的A-FeignClient模塊的接口,由feign負(fù)責(zé)代理轉(zhuǎn)發(fā)到A微服務(wù),實(shí)現(xiàn)調(diào)用A微服務(wù)的相關(guān)邏輯。
package com.demo.DemoFeignClientController;
/**
* 服務(wù)消費(fèi)方 Aikes
*/
public class DemoFeignClientController {
@Autowired
private DemoFeignClient mDemoFeignClient;
public void doService() {
//TODO 業(yè)務(wù)處理
ApiResponse<String> tApiResponse = this.testFeign();//調(diào)用 A微服務(wù) 處理邏輯
//TODO 處理返回結(jié)果
}
public ApiResponse<String> testFeign() {
ServerAccessRequest<DemoPo> tServerAccessRequest = new ServerAccessRequest<DemoPo>();
tServerAccessRequest.setBusinessNo("TEST001");
return mDemoFeignClient.testMicroServiceAccess(tServerAccessRequest);
}
}小結(jié)
通過feign的方式可以降低服務(wù)間調(diào)用的復(fù)雜度,從而提升系統(tǒng)性能。但同時(shí)帶來的問題也需要重點(diǎn)考量:
- 1、服務(wù)間調(diào)用失敗后的事務(wù)一致性處理,需要結(jié)合各自業(yè)務(wù)場景分析。
- 2、錯(cuò)綜復(fù)雜的服務(wù)間調(diào)用開啟后,相當(dāng)于給系統(tǒng)開了后門,需要考慮增加服務(wù)間調(diào)用日志記錄的功能,推薦使用自定義注解+AOP統(tǒng)一處理。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringCloud中的@FeignClient注解使用詳解
- SpringCloud @FeignClient注入Spring容器原理分析
- SpringCloud之@FeignClient()注解的使用詳解
- SpringCloud FeignClient 超時(shí)設(shè)置
- SpringCloud全面解析@FeignClient標(biāo)識(shí)接口的過程
- SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題
- SpringCloud @FeignClient參數(shù)的用法解析
- SpringCloud之@FeignClient()注解的使用方式
- SpringCloud中FeignClient自定義配置
相關(guān)文章
通過Spring Boot整合Mybatis分析自動(dòng)配置詳解
這篇文章主要給大家介紹了關(guān)于如何通過Spring Boot整合Mybatis分析自動(dòng)配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Java讀取Properties文件的七種方法的總結(jié)
這篇文章主要介紹了Java讀取Properties文件的七種方法的總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-07-07
SpringBoot+EasyExcel實(shí)現(xiàn)自定義復(fù)雜樣式導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何結(jié)果EasyExcel實(shí)現(xiàn)自定義復(fù)雜樣式導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-07-07
一步步教你把SpringBoot項(xiàng)目打包成Docker鏡像
Docker可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目打包成Docker鏡像的相關(guān)資料,需要的朋友可以參考下2023-02-02
在Mybatis使用Integer與''進(jìn)行比較的坑及解決
這篇文章主要介紹了在Mybatis使用Integer與''進(jìn)行比較的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析
目前有個(gè)需求,需要使用不同的數(shù)據(jù)源,例如某業(yè)務(wù)要用A數(shù)據(jù)源,另一個(gè)業(yè)務(wù)要用B數(shù)據(jù)源,所以下面這篇文章主要給大家介紹了關(guān)于Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析,需要的朋友可以參考下2021-12-12

