Hystrix熔斷器
我們學習微服務就是將一個個的模塊拆分爲一個個的服務 , 如下 , c和d服務調用後B服務,B服務調用A服務
圖如下 :
我們從圖中不難發現 , 當A服務出現問題的時候 導致B服務也不可用 , 可能會發生級聯傳遞,導致整個服務鏈上的服務不可用 ,隨即整個服務就崩潰了!當一個系統劃分的模塊越多,這種故障發生的頻率就會越高, 對於這個問題,Spring Cloud中最重要的解決方案就是斷路器,那麼本文我們就來看看什麼是斷路器。
首先將以前的user , order 和Eureka Server 服務啓動,將order服務啓動兩份 , 端口分別是8002和8003 , eureka截圖如下:
此時我們隨便訪問一個接口可以看到下圖
, 立即關閉一個order服務刷新兩遍一定會出現
這是因爲ribbon的負載均衡機制是默認是輪詢 , 顧名思義就是來回切換 ,所以當一個服務提供者關掉之後,刷新的時候服務請求成功和請求失敗是成對出現的:當服務消費者去請求那個被關掉的服務提供者的時候就會請求失敗,當服務消費者去請求正常的服務提供者時就能獲得期望的結果。請求失敗時不能給用戶展示這樣一個ErrorPage,而應該是一個可控的頁面,OK,我們來看看如何使用斷路器來解決這個問題。
- 服務消費者中加入斷路器jart(user)
<dependency>
<!-- hystrix的啓動包 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
- user啓動類加上註解@EnableCircuitBreaker , 表示 開啓斷路器功能
- 創建HystrixService類
/**
* @ClassName: HystrixService
* @Description:
* @author: 田曉斌
* @date: 2019年4月22日 下午7:00:42
*/
@Service
public class HystrixService {
@Autowired
private RestTemplate restTemplate;
/*
* @HystrixCommand註解來指定請求失敗時回調的方法
*/
@HystrixCommand(fallbackMethod = "error")
public String findOrderByUser(String id) {
Integer oid = 123;
return this.restTemplate.getForObject("http://springcloud-eureka-order/order/" + oid, String.class);
}
/*
* error()方法是一個請求失敗時回調的方法。
*/
public String error(String id) {
return "error";
}
}
- Controller代碼
/**
* @ClassName: HystrixController
* @Description:
* @author: 田曉斌
* @date: 2019年4月22日 下午7:01:59
*/
@RestController
public class HystrixController {
@Autowired
private HystrixService hystrixService;
@GetMapping(value = "/hystrix/findOrder/{id}")
public String helloController(@PathVariable String id) {
return hystrixService.findOrderByUser(id);
}
}
編碼完成 , 測試步驟和上面的步驟相同 , 啓動工程後關閉一個order服務,刷新多次發現
OK,大家看到,此時如果服務調用失敗,就會調用失敗的那個回調方法。
事實上,不僅僅是服務提供者被關閉時我們需要斷路器,如果請求超時也會觸發熔斷請求,調用回調方法返回數據。
好了斷路器就介紹到這裏 , 歡迎留言討論