1. 程式人生 > >Spring Cloud構建微服務架構:服務容錯保護(Hystrix服務降級)

Spring Cloud構建微服務架構:服務容錯保護(Hystrix服務降級)

tro sco load 服務架構 延遲 正常 map ati href

動手試一試

在開始使用Spring Cloud Hystrix實現斷路器之前,我們先拿之前實現的一些內容作為基礎,其中包括:

  • eureka-server工程:服務註冊中心,端口:1001
  • eureka-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構建微服務架構:服務容錯保護(Hystrix服務降級)