經過以前Spring Cloud系列教程中的《Spring Cloud構建微服務架構:服務容錯保護(Hystrix服務降級)》一文,咱們已經知道如何經過Hystrix來保護本身的服務不被外部依賴方拖垮的狀況。可是實際使用過程當中常常碰到開發反應「莫名」觸發了降級邏輯的狀況。爲了更精準的定位觸發緣由,或是在降級邏輯中須要根據不一樣的異常作不一樣的處理時,在降級方法中,咱們但願能夠獲取到主邏輯中拋出的異常信息。接下來就來介紹一下Hystrix兩種不一樣實現方式中如何在降級邏輯中獲取異常信息的方法。java
先介紹一下用註解方式定義的Hystrix命令是如何在降級邏輯中獲取異常的,實現很是簡單,先看下面的例子:spring
@HystrixCommand(fallbackMethod = "fallback") User getUserById(String id) { throw new RuntimeException("getUserById command failed"); } User fallback(String id, Throwable throwable) { return new User("def", "def"); }
這裏定義了一個主邏輯函數getUserById
,主邏輯中會主動拋出一個異常,從而觸發該主邏輯的降級函數fallback
。重點看fallback
函數中的最後一個傳參Throwable throwable
。經過這樣的簡單定義,開發人員就能夠很方便的獲取觸發降級邏輯的異常信息,用做日誌記錄或者其它複雜的業務邏輯了。架構
在繼承方式中要獲取觸發異常也很是簡單,具體以下:ide
public static class UserCommand extends HystrixCommand<User> { protected UserCommand() { super(HystrixCommandGroupKey.Factory.asKey("UserCommand")); } @Override protected User run() throws Exception { throw new RuntimeException("getUserById command failed"); } @Override protected User getFallback() { System.out.println(getFailedExecutionException().getMessage()); return new User("def", "def"); } }
上面的實現同上一節註解方式的實現同樣,在使用繼承方式的時候經過getFailedExecutionException
方法就能夠獲取到觸發降級的異常信息了。函數
咱們在實際使用Hystrix的時候,有時候一些業務異常或者內部RPC由服務提供方拋出的異常在消費方沒能考慮周到,會觸發一些意料以外的降級。因此在降級邏輯中,建議每一段都加入觸發異常的日誌記錄,以方便定位問題緣由。微服務