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

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

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

調用邏輯
1、A-FeignClient
- a、在A-FeignClient中增加接口,通過spring注解標識其提供服務的真正接口路徑。
- b、@FeignClient注解中name值目標微服務名,contextId用于標識FeignClient名。
- c、方法名上的postmapping用于標識該方法需要轉發(fā)的接口路徑。下圖代碼示例中意思即:調用該方法后會代理到A微服務的/demoServer/testMicroServiceAccess接口中。
- d、通過實現該接口的方式新建一個類,可以用于feign調用失敗后的容錯處理。
package com.demo.DemoFeignClient;
/**
* 微服務之間調用的核心接口 Aikes
* 注解@FeignClient中contextID參數用于標識client,防止多個接口共用同一個目標FeignClient沖突
*/
@FeignClient(name = "A-server" ,contextId = "DemoFeignClient", fallback = DemoFeignClientFallback.class )
public interface DemoFeignClient{
@PostMapping("/demoServer/testMicroServiceAccess")
public ApiResponse<String> testMicroServiceAccess(@RequestBody ServerAccessRequest<DemoPo> cServerAccessRequest);
}
/**
* 增加訪問失敗時的處理邏輯
*/
@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微服務
作為服務提供方,只需要正常編寫業(yè)務邏輯即可,重點需要考慮請求入參的實體類把控,建議引用A-FeignClient中,保證一致性。
package com.demo.DemoFeignServerController;
/**
* 服務提供方 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微服務
作為服務消費方,在核心邏輯處理中,通過調用引入的A-FeignClient模塊的接口,由feign負責代理轉發(fā)到A微服務,實現調用A微服務的相關邏輯。
package com.demo.DemoFeignClientController;
/**
* 服務消費方 Aikes
*/
public class DemoFeignClientController {
@Autowired
private DemoFeignClient mDemoFeignClient;
public void doService() {
//TODO 業(yè)務處理
ApiResponse<String> tApiResponse = this.testFeign();//調用 A微服務 處理邏輯
//TODO 處理返回結果
}
public ApiResponse<String> testFeign() {
ServerAccessRequest<DemoPo> tServerAccessRequest = new ServerAccessRequest<DemoPo>();
tServerAccessRequest.setBusinessNo("TEST001");
return mDemoFeignClient.testMicroServiceAccess(tServerAccessRequest);
}
}小結
通過feign的方式可以降低服務間調用的復雜度,從而提升系統性能。但同時帶來的問題也需要重點考量:
- 1、服務間調用失敗后的事務一致性處理,需要結合各自業(yè)務場景分析。
- 2、錯綜復雜的服務間調用開啟后,相當于給系統開了后門,需要考慮增加服務間調用日志記錄的功能,推薦使用自定義注解+AOP統一處理。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringCloud中的@FeignClient注解使用詳解
- SpringCloud @FeignClient注入Spring容器原理分析
- SpringCloud之@FeignClient()注解的使用詳解
- SpringCloud FeignClient 超時設置
- SpringCloud全面解析@FeignClient標識接口的過程
- SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題
- SpringCloud @FeignClient參數的用法解析
- SpringCloud之@FeignClient()注解的使用方式
- SpringCloud中FeignClient自定義配置
相關文章
通過Spring Boot整合Mybatis分析自動配置詳解
這篇文章主要給大家介紹了關于如何通過Spring Boot整合Mybatis分析自動配置的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07
SpringBoot+EasyExcel實現自定義復雜樣式導入導出
這篇文章主要為大家詳細介紹了SpringBoot如何結果EasyExcel實現自定義復雜樣式導入導出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-07-07
Springboot動態(tài)切換數據源的具體實現與原理分析
目前有個需求,需要使用不同的數據源,例如某業(yè)務要用A數據源,另一個業(yè)務要用B數據源,所以下面這篇文章主要給大家介紹了關于Springboot動態(tài)切換數據源的具體實現與原理分析,需要的朋友可以參考下2021-12-12

