一、Feign介紹
????????Feign是一個聲明式的HTTP客戶端框架,用于簡化微服務架構中服務之間的通信。它是Spring Cloud框架的一部分,旨在提供一種優(yōu)雅且易于使用的方式來定義和調用HTTP請求。
????????Feign的設計目標是讓服務之間的通信變得更加簡單和直觀。通常情況下,在微服務架構中,一個服務需要調用另一個服務的API來獲取數(shù)據(jù)或執(zhí)行操作。使用傳統(tǒng)的方式,我們需要手動編寫HTTP請求、處理請求和響應等操作,而Feign的出現(xiàn)簡化了這個過程。
????????使用Feign,只需定義一個接口來描述要調用的服務的API,然后通過注解來配置請求和響應的處理方式。Feign會根據(jù)接口定義自動生成可用的HTTP請求,將請求發(fā)送到目標服務,并將響應轉換為適當?shù)膶ο箢愋头祷亍?/p>
Feign具有以下特性和優(yōu)勢:
- 聲明式的API定義:通過簡單地定義接口,可以清晰地描述服務之間的通信,而不必關注底層的HTTP細節(jié)。
- 內(nèi)置負載均衡支持:Feign與Spring Cloud的服務注冊和發(fā)現(xiàn)機制集成,可以自動實現(xiàn)負載均衡,輕松處理多個實例的服務調用。
- 請求和響應的自動序列化和反序列化:Feign可以自動處理請求和響應的序列化和反序列化,使您能夠以面向對象的方式處理數(shù)據(jù)。
- 整合服務熔斷和限流:Feign與Spring Cloud的熔斷器(如Hystrix)和限流器(如Sentinel)集成,可以提供服務熔斷和限流的能力,增加系統(tǒng)的穩(wěn)定性和可靠性。
- 易于擴展:Feign提供了可插拔的機制,允許您通過自定義配置和攔截器等方式來擴展和定制其行為。
?二、Feign的使用
這里我以 pig 項目為例進行說明。項目地址:https://gitee.com/log4j/pig
1. 項目模塊說明
pig ├── pig-auth -- 授權服務提供[3000] └── pig-common -- 系統(tǒng)公共模塊 ├── pig-common-bom -- 全局依賴管理控制 ├── pig-common-core -- 公共工具類核心包 ├── pig-common-datasource -- 動態(tài)數(shù)據(jù)源包 ├── pig-common-job -- xxl-job 封裝 ├── pig-common-log -- 日志服務 ├── pig-common-mybatis -- mybatis 擴展封裝 ├── pig-common-seata -- 分布式事務 ├── pig-common-security -- 安全工具類 ├── pig-common-swagger -- 接口文檔 ├── pig-common-feign -- feign 擴展封裝 └── pig-common-xss -- xss 安全封裝 ├── pig-register -- Nacos Server[8848] ├── pig-gateway -- Spring Cloud Gateway網(wǎng)關[9999] └── pig-upms -- 通用用戶權限管理模塊 └── pig-upms-api -- 通用用戶權限管理系統(tǒng)公共api模塊 └── pig-upms-biz -- 通用用戶權限管理系統(tǒng)業(yè)務處理模塊[4000] └── pig-visual └── pig-monitor -- 服務監(jiān)控 [5001] ├── pig-codegen -- 圖形化代碼生成 [5002] ├── pig-sentinel-dashboard -- 流量高可用 [5003] └── pig-xxl-job-admin -- 分布式定時任務管理臺 [5004]
?2. Feign客戶端定義
(1)引入Feign依賴
在pig-upms-api模塊和pig-upms-biz模塊都需要引入feign依賴:
<!--feign 注解依賴-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pig-common-feign</artifactId>
<optional>true</optional>
</dependency>
(2)定義位置
????????在代碼中可以看到,F(xiàn)eign的客戶端定義在了 pig-upms-api 模塊中。將Feign的客戶端定義在pig-upms-api模塊下是一種常見的設計模式。這種模式的目的是將Feign的客戶端接口定義為API模塊的一部分,使得其他模塊可以通過引入pig-upms-api依賴來使用該API,并通過Feign實現(xiàn)與pig-upms-biz模塊(通用用戶權限管理系統(tǒng)的業(yè)務處理模塊)之間的通信。
?(3)Feign客戶端定義
以RemoteUserService為例:
//標識這是一個Feign客戶端接口,contextId指定客戶端的id,用于和其他客戶端區(qū)分
//value="pig-upms-biz" 指定了要調用的服務名稱
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UMPS_SERVICE)
public interface RemoteUserService {
//通過用戶名查詢用戶、角色信息
//@GetMapping注解指定了要調用的HTTP GET請求的路徑。這里是 /user/info/{username}
//headers指定了請求的頭部信息,這里HEADER_FROM_IN的值是"from=Y"
@GetMapping(value = "/user/info/{username}", headers = SecurityConstants.HEADER_FROM_IN)
R<UserInfo> info(@PathVariable("username") String username);
//通過手機號碼查詢用戶、角色信息
@GetMapping(value = "/app/info/{phone}", headers = SecurityConstants.HEADER_FROM_IN)
R<UserInfo> infoByMobile(@PathVariable("phone") String phone);
//根據(jù)部門id,查詢對應的用戶 id 集合
@GetMapping(value = "/user/ids", headers = SecurityConstants.HEADER_FROM_IN)
R<List<Long>> listUserIdByDeptIds(@RequestParam("deptIds") Set<Long> deptIds);
}
實際上這個Feign客戶端會發(fā)送請求到SysUserController:
?(4)在其他模塊測試
比如說,我想要在 pig-codegen 模塊下使用 Feign 進行接口調用,需要先在 codegen 模塊引入 pig-upms-api 的依賴,因為我們將Feign的客戶端定義在了pig-upms-api下。
<!--upms api、model 模塊-->
<dependency>
<groupId>com.pig4cloud</groupId>
<artifactId>pig-upms-api</artifactId>
</dependency>
編寫一個測試Controller:
@RestController
@RequiredArgsConstructor //自動生成構造方法,在生成FeignDemoController會將remoteUserService傳入
@RequestMapping("/feignDemo")
public class FeignDemoController {
//注入Feign客戶端接口 RemoteUserService
//定義為final 確保在實例化后變量不會發(fā)生意外改變
private final RemoteUserService remoteUserService;
@Inner(value = false)
@GetMapping("/test")
public R<UserInfo> test() {
//假設傳入的用戶名是 admin
String username = "admin";
//調用feign中的info方法
return remoteUserService.info(username);
}
}
啟動服務測試,可以看到成功獲取到了admin用戶的信息:
補充:關于在兩種注入方式的理解:
在注入
remoteUserService
屬性時,可以使用@RequiredArgsConstructor
注解或@Autowired
注解兩種方式。這兩種方式有以下區(qū)別:
@RequiredArgsConstructor
: 當在類上使用@RequiredArgsConstructor
注解時,它會自動為您生成一個構造方法,該構造方法會將remoteUserService
作為參數(shù)傳入并進行注入。這種方式是通過構造函數(shù)注入依賴。使用@RequiredArgsConstructor
注解可以簡化代碼,減少手動編寫構造方法的工作。
@Autowired
: 當在屬性上使用@Autowired
注解時,它會自動將相應類型的實例注入到該屬性中。這種方式是通過字段注入依賴。Spring框架會自動掃描并查找與RemoteUserService
類型匹配的實例,并將其注入到remoteUserService
屬性中。使用@Autowired
注解可以方便地進行依賴注入,但需要確保所需的實例存在且唯一。文章來源:http://www.zghlxwxcb.cn/news/detail-551133.html總體而言,這兩種注入方式的效果是一樣的,都會將
RemoteUserService
注入到remoteUserService
屬性中。選擇使用哪種方式取決于偏好和項目中的約定。使用@RequiredArgsConstructor
可以提供更簡潔的代碼,而使用@Autowired
則更加靈活,可以適應更多不同的場景。文章來源地址http://www.zghlxwxcb.cn/news/detail-551133.html
到了這里,關于使用Feign進行微服務之間的接口調用:Spring Cloud Alibaba中的聲明式服務調用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!