1. 概述
老話說的好:做人要正直,做事要正派,胸懷坦蕩、光明磊落,才會贏得他人的信賴與尊敬。
言歸正傳,之前聊了服務間通訊的元件 Feign,今天我們來聊聊服務降級。
服務降級簡單的理解就是給一個備選方案,當服務呼叫報錯或者超時時,能終止遠端呼叫,並很快的返回備選的結果,避免引發服務雪崩。
今天我們用兩個例子,模擬一下 介面報錯 和 介面超時 的服務降級實現。
我們使用 hystrix 實現服務降級,雖然從 Spring Cloud 2020.0 版本開始,移除了 hystrix 元件,但並不影響我們對他的使用。
閒話不多說,直接上程式碼。
2. 介面報錯的服務降級
2.1 被呼叫服務
2.1.1 介面程式碼
@GetMapping("/exception") String exception() throws Exception;
2.1.2 實現類程式碼
@Override public String exception() throws Exception { if(1==1) { throw new Exception("模擬異常"); } return null; }
2.2 呼叫服務
2.2.1 主要依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 健康檢查 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.9.RELEASE</version> </dependency>
這裡 hystrix 使用目前的最新版本 2.2.9.RELEASE。
2.2.2 主要配置
feign: circuitbreaker: enabled: true # 開啟 feign 的斷路器 hystrix: command: default: fallback: enabled: true # 開啟服務降級
2.2.3 降級工廠類的開發
@Component public class MyEurekaClientServiceFactory implements FallbackFactory<EurekaClientService> { @Override public EurekaClientService create(Throwable cause) { return new EurekaClientService() { @Override public String exception() throws Exception { System.out.println("exception方法 降級"); return "exception方法 降級"; } }; } }
2.2.4 在 Feign 介面配置降級工廠類
@FeignClient(name = "my-eureka-client", fallbackFactory = MyEurekaClientServiceFactory.class) // name為 呼叫服務的名稱 @RequestMapping("/api") public interface EurekaClientService { @GetMapping("/exception") String exception() throws Exception; }
2.2.5 啟動類增加 @EnableHystrix 註解
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableHystrix public class MyFeignApplication { public static void main(String[] args) { SpringApplication.run(MyFeignApplication.class, args); } }
2.2.6 啟動服務測試
可以正常進入降級方法。
3. 介面超時的服務降級
3.1 被呼叫服務
3.1.1 介面程式碼
@GetMapping("/timeout")
String timeout(@RequestParam Integer timeoutSecond);
3.1.2 實現類程式碼
@Override public String timeout(Integer timeoutSecond) { System.out.println("呼叫timeout方法"); try { Thread.sleep(timeoutSecond * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } return "success:" + port; }
3.2 呼叫服務
3.2.1 主要配置
feign: client: config: # 全域性配置 default: connectTimeout: 1000 # 連線超時時間,單位ms readTimeout: 3000 # 獲取Response響應超時時間,單位ms # 針對 my-eureka-client 的 feign 配置,優先順序高於全域性配置 my-eureka-client: connectTimeout: 300 # 連線超時時間,單位ms readTimeout: 5000 # 獲取Response響應超時時間,單位ms circuitbreaker: enabled: true # 開啟 feign 的斷路器 hystrix: command: default: fallback: enabled: true # 開啟服務降級 execution: timeout: enabled: true # 全域性超時配置 isolation: thread: timeoutInMilliseconds: 3000 # 超時時間配置 interruptOnTimeout: true # 超時後是否終止執行緒 interruptOnFutureCancel: true # 取消後是否終止執行緒
注意:feign 的 readTimeout 屬性和 hystrix 的 timeoutInMilliseconds 屬性會同時生效,以超時時間最短的為準。
3.2.2 降級工廠類的開發
@Component public class MyEurekaClientServiceFactory implements FallbackFactory<EurekaClientService> { @Override public EurekaClientService create(Throwable cause) { return new EurekaClientService() { @Override public String exception() throws Exception { System.out.println("exception方法 降級"); return "exception方法 降級"; } @Override public String timeout(Integer timeoutSecond) { return "timeout方法 降級"; } }; } }
3.2.3 啟動服務測試
可以正常進入降級方法。
4. 綜述
今天聊了一下 服務降級 的相關知識,希望可以對大家的工作有所幫助。
歡迎幫忙點贊、評論、轉發、加關注 :)
關注追風人聊Java,每天更新Java乾貨。
5. 個人公眾號
追風人聊Java,歡迎大家關注