Java B2B2C多使用者商城 springcloud架構-服務容錯保護(Hystrix服務降級)
動手試一試
在開始使用Spring Cloud Hystrix實現斷路器之前,我們先拿之前實現的一些內容作為基礎,其中包括:
eureka-server
工程:服務註冊中心,埠:1001eureka-client
工程:服務提供者,兩個例項啟動埠分別為2001
下面我們可以複製一下之前實現的一個服務消費者:eureka-consumer-ribbon
,命名為eureka-consumer-ribbon-hystrix
。下面我們開始對其進行改在:
第一步:pom.xml
的dependencies節點中引入spring-cloud-starter-hystrix
依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> |
第二步:在應用主類中使用@EnableCircuitBreaker
或@EnableHystrix
註解開啟Hystrix的使用:
@EnableCircuitBreaker @EnableDiscoveryClient @SpringBootApplication public class Application { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } |
注意:這裡我們還可以使用Spring Cloud應用中的@SpringCloudApplication
註解來修飾應用主類,該註解的具體定義如下所示。我們可以看到該註解中包含了上我們所引用的三個註解,這也意味著一個Spring Cloud標準應用應包含服務發現以及斷路器。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker public @interface SpringCloudApplication { } |
第三步:改造服務消費方式,新增ConsumerService
類,然後將在Controller
中的邏輯遷移過去。最後,在為具體執行邏輯的函式上增加@HystrixCommand
註解來指定服務降級方法,比如:
@RestController public class DcController { @Autowired ConsumerService consumerService; @GetMapping("/consumer") public String dc() { return consumerService.consumer(); } class ConsumerService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "fallback") public String consumer() { return restTemplate.getForObject("http://eureka-client/dc", String.class); } public String fallback() { return "fallback"; } } } |
下面我們來驗證一下上面Hystrix帶來的一些基礎功能。我們先把涉及的服務都啟動起來,然後訪問localhost:2101/consumer
,此時可以獲取正常的返回,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]
。
為了觸發服務降級邏輯,我們可以將服務提供者eureka-client
的邏輯加一些延遲,比如:
@GetMapping("/dc") public String dc() throws InterruptedException { Thread.sleep(5000L); String services = "Services: " + discoveryClient.getServices(); System.out.println(services); return services; } |
重啟eureka-client
之後,再嘗試訪問localhost:2101/consumer
,此時我們將獲得的返回結果為:fallback
。我們從eureka-client
的控制檯中,可以看到服務提供方輸出了原本要返回的結果,但是由於返回前延遲了5秒,而服務消費方觸發了服務請求超時異常,服務消費者就通過HystrixCommand註解中指定的降級邏輯進行執行,因此該請求的結果返回了fallback
。這樣的機制,對自身服務起到了基礎的保護,同時還為異常情況提供了自動的服務降級切換機制。Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼請加企鵝求求: 貳一四七七七五六叄叄