Spring Cloud Java OpenFeign

Spring Cloud -- OpenFeign超時控制、日誌功能

黃翰暉 Jacob Huang 2021/11/15 09:00:00
57

前言

      微服務和微服務間互相呼叫,有時候會出現一種狀況,就是兩邊的呼叫等待時間的不一致造成的錯誤,例如:Service端微服務需處理的時間為10秒,但是Client端的微服務卻只等5秒便拋出time out的錯誤,這部分通常在開發時就應該要溝通處理好。而OpenFeign針對這樣的狀況有提供了相應的處理功能,今天我們將要來分享OpenFeign的超時控制的設定。

      再來分享OpenFeign的一個小功能:日誌功能,它可以將從http呼叫後API執行的一連串流程,非常詳細的紀錄下來,雖然說可能蠻多人都喜歡使用@SLF4J,不過因為這個功能能記錄的蠻詳細的,並且不用太多程式就可以完成,因此提供給大家做個參考~

 

OpenFeign超時控制

      接下來,我們需要做出一個模擬的環境,來模擬出Service端和Client端處理速度不一致的情境:

 

1. 首先,在payment8001中增加一段程式,這段程式沒有任何意義,只是想要讓它執行3秒鐘

 

2. 再來,我們從OpenFeign的客戶端中的Service介面加一段呼叫該程式的方法

 

3. 加入Controller呼叫Service程式,程式預設為等待1秒鐘

 

4. 啟動payment 8001、Feign、Eureka 7001、7002

 

5. 啟動成功後,打開網頁 http://localhost/consumer/payment/feign/timeout,可以看到執行後出現了time out

 

6. 為了解決這樣的問題,我們需要在Feign Client端中的application.yml中加入如下圖的設定

 

7. 加完之後重啟,開啟網頁後我們可以看到已經排除了因為兩個微服務執行時間不一,造成的time out問題

 

OpenFeign日誌紀錄

      這次一樣是用到之前已經做好的Feign Client端的package,如果還沒完成可以參考 "Spring Cloud -- OpenFeign初探" 先把這包package完成,這個功能最主要的作用,就是對Feign的介面呼叫情況進行監控及輸出。

      OpenFeign的日誌有分4種日誌級別:

1. NONE:此為預設,代表不顯示任何日誌。

2. BASIC:僅記錄呼叫方法、URL、response狀態碼及執行時間。

3. HEADERS:除了BASIC的信息之外,另有request及response的開頭訊息

4. FULL:除了HEADERS的信息之外,另有request及response的正文及原數據

 

     再來我們針對OpenFeign的日誌設置做一個Demo:

1. 在Feign Client這一包中加一個config的package,並建立一個FeignConfig的類別

 

2. 在FeignConfig中配置日誌的bean,這邊我們直接使用Full來看整個log顯示的狀態

 

3. 再來我們在application.yml中加上日誌的設定,File可以設定路徑將log存入自己想要設定的路徑

 

4. 再來我們啟動Eureka7001、7002,Feign、Payment8001、8002,開啟網頁後查詢 http://localhost/consumer/payment/get/1

查詢成功後可以看到console的部份會顯示非常完整的log

 

5. 當然在我們設定的路徑中也有儲存相對應的log

 

      以上,為OpenFeign在超時時間所產生的問題上給出的解決方案以及日誌紀錄的功能,分享給大家,下一篇我們將開始進到下一個功能 -> Hystrix服務降級及熔斷,文章中若有疏漏,也歡迎各位前輩不吝指教,謝謝大家~

參考文獻

 

尚硅谷Spring Cloud教程

Spring Cloud官方網站

 

黃翰暉 Jacob Huang