哦哇資訊網

Feign 與 OpenFeign

由 BUG弄潮兒 發表于 美食2022-12-13

1。 什麼是Feign

Netflix Feign 是 Netflix 公司釋出的一種實現負載均衡和服務呼叫的開源元件。Spring Cloud 將其與 Netflix 中的其他開源服務元件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合進 Spring Cloud Netflix 模組中,整合後全稱為 Spring Cloud Netflix Feign Feign 對 Ribbon (

http://c。biancheng。net/springcloud/ribbon。html

)進行了整合,利用 Ribbon 維護了一份可用服務清單,並透過 Ribbon 實現了客戶端的負載均衡。Feign 是一種宣告式服務呼叫元件,它在 RestTemplate 的基礎上做了進一步的封裝。透過 Feign,我們只需要宣告一個介面並透過註解進行簡單的配置(類似於 Dao 介面上面的 Mapper 註解一樣)即可實現對 HTTP 介面的繫結。透過 Feign,我們可以像呼叫本地方法一樣來呼叫遠端服務,而完全感覺不到這是在進行遠端呼叫。Feign 支援多種註解,例如 Feign 自帶的註解以及 JAX-RS 註解等,但遺憾的是 Feign 本身並不支援 Spring MVC 註解,這無疑會給廣大 Spring 使用者帶來不便。

2。 什麼是openFeign

2019 年 Netflix 公司宣佈 Feign 元件正式進入停更維護狀態,於是 Spring 官方便推出了一個名為 OpenFeign 的元件作為 Feign 的替代方案。

OpenFeign 全稱 Spring Cloud OpenFeign,它是 Spring 官方推出的一種宣告式服務呼叫與負載均衡元件,它的出現就是為了替代進入停更維護狀態的 Feign。OpenFeign 是 Spring Cloud 對 Feign 的二次封裝,它具有 Feign 的所有功能,並在 Feign 的基礎上增加了對 Spring MVC 註解的支援,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。

常用註解

註解

說明

@FeignClient

該註解用於通知 OpenFeign 元件對 @RequestMapping 註解下的介面進行解析,並透過動態代理的方式產生實現類,實現負載均衡和服務呼叫。

@EnableFeignClients

該註解用於開啟 OpenFeign 功能,當 Spring Cloud 應用啟動時,OpenFeign 會掃描標有 @FeignClient 註解的介面,生成代理並註冊到 Spring 容器中。

@RequestMapping

Spring MVC 註解,在 Spring MVC 中使用該註解對映請求,透過它來指定控制器(Controller)可以處理哪些 URL 請求,相當於 Servlet 中 web。xml 的配置。

@GetMapping

Spring MVC 註解,用來對映 GET 請求,它是一個組合註解,相當於 @RequestMapping(method = RequestMethod。GET) 。

@PostMapping

Spring MVC 註解,用來對映 POST 請求,它是一個組合註解,相當於 @RequestMapping(method = RequestMethod。POST) 。

3。 Feign與OpenFeign的對比

相同點

Feign 和 OpenFeign 都是 Spring Cloud 下的遠端呼叫和負載均衡元件。

Feign 和 OpenFeign 作用一樣,都可以實現服務的遠端呼叫和負載均衡。

Feign 和 OpenFeign 都對 Ribbon 進行了整合,都利用 Ribbon 維護了可用服務清單,並透過 Ribbon 實現了客戶端的負載均衡。

Feign 和 OpenFeign 都是在服務消費者(客戶端)定義服務繫結介面並透過註解的方式進行配置,以實現遠端服務的呼叫。

不同點

Feign 和 OpenFeign 的依賴項不同,Feign 的依賴為 spring-cloud-starter-feign,而 OpenFeign 的依賴為 spring-cloud-starter-openfeign。

Feign 和 OpenFeign 支援的註解不同,Feign 支援 Feign 註解和 JAX-RS 註解,但不支援 Spring MVC 註解;OpenFeign 除了支援 Feign 註解和 JAX-RS 註解外,還支援 Spring MVC 註解。

4。 openFeign使用

引入依賴

<!—— openfeign依賴 ——> org。springframework。cloud spring-cloud-starter-openfeign<!—— openfeign最佳化請求連線池依賴 ——> io。github。openfeign feign-httpclient

定義遠端呼叫介面

在 @FeignClient 註解中,value 屬性的取值為:服務提供者的服務名,即服務提供者配置檔案(application。yml)中 spring。application。name 的取值。

介面中定義的每個方法都與服務提供者中 Controller 定義的服務方法對應。

openfeign本身並不具備fallback降級屬性,需要搭配降級框架如(hystrix或sentinel)。如果未引入降級框架,即使宣告fallback降級服務類,在遠端呼叫發生異常時,也不會觸發

@Component@FeignClient(value = “service5”)public interface FeignService { @GetMapping(“/api/v1/service5”) List get(); }

啟動類添加註解@EnableFeignClients

@EnableFeignClients@EnableEurekaClient@SpringBootApplicationpublic class Service3Application { public static void main(String[] args) { SpringApplication。run(Service3Application。class, args); }}

Controller引入呼叫

@RestController@RequestMapping(“api/v1/service3”)public class Controller { @Resource private FeignService feignService; @GetMapping public List get() { return feignService。get(); }}

5。 OpenFeign超時處理

openFeign 客戶端的預設超時時間為 1 秒鐘,如果服務端處理請求的時間超過 1 秒就會報錯。為了避免這樣的情況,我們需要對 OpenFeign 客戶端的超時時間進行控制。

yml新增如下進行配置

ribbon: ReadTimeout: 6000 #建立連線所用的時間,適用於網路狀況正常的情況下,兩端兩端連線所用的時間 ConnectionTimeout: 6000 #建立連線後,服[[=務器讀取到可用資源的時間feign: client: httpclient: enabled: true # 開啟 HttpClient最佳化連線池 compression: request: enabled: true # 開啟請求資料的壓縮功能 mime-types: text/xml,application/xml, application/json # 壓縮型別 min-request-size: 1024 # 最小壓縮值標準,當資料大於 1024 才會進行壓縮 response: enabled: true # 開啟響應資料壓縮功能

6。 OpenFeign日誌增強

yml新增日誌級別宣告

logging: level: com。ftc。service3。FeignService: debug #feign日誌以什麼樣的級別監控該介面

說明:

com。ftc。service3。FeignService 是開啟 @FeignClient 註解的介面(即服務繫結介面)的完整類名。也可以只配置部分路徑,表示監控該路徑下的所有服務繫結介面

debug:表示監聽該介面的日誌級別。

建立日誌配置類

@Configurationpublic class ConfigBean { /** * OpenFeign 日誌增強 * 配置 OpenFeign 記錄哪些內容 */ @Bean Logger。Level feginLoggerLevel() { return Logger。Level。FULL; }}

該配置的作用是透過配置的 Logger。Level 物件告訴 OpenFeign 記錄哪些日誌內容。Logger。Level 的具體級別如下:

NONE:不記錄任何資訊。

BASIC:僅記錄請求方法、URL 以及響應狀態碼和執行時間。

HEADERS:除了記錄 BASIC 級別的資訊外,還會記錄請求和響應的頭資訊。

FULL:記錄所有請求與響應的明細,包括頭資訊、請求體、元資料等等。

FULL級別如圖:

source : //www。yuque。com/u27809381/ca4o9w/ocr3v6

TAG: Feign註解OpenFeignSpring介面