原始碼地址:https://gitee.com/fighter3/eshop-project.git
持續更新中……
在上一節我們已經使用OpenFeign完成了服務間的呼叫。想一下,假如我們一個服務鏈路上上下游有十幾個服務,每個服務有若干個節點,其中一個節點故障,上游請求打到故障的節點,加入請求一直阻塞,大量堆積的請求可能會把服務打崩,可能導致級聯式的失敗,甚至整個鏈路失敗,這就是所謂的服務雪崩
,嚴重可能直接導致系統掛掉。為了避免這種可怕的情況,必要的容錯保護機制是必需的。
1、Hystrix簡介
Hystrix是Netflix的一個重要元件,提供了斷路器、資源隔離與自我修復功能。
如下是Hystrix作為斷路器,阻止級聯失敗。
但是Hystrix1.5.18版本之後進入了維護模式,我們採用的就是這個版本。在SpringCloud Alibaba的體系,有另外一個元件sentinel可以作為替代品,在後面我們會用到。
儘管Hystrix已經停止更新,但是經過多年迭代,目前已經是一個比較成熟的產品,所以仍然有比較廣泛的應用。
Hystrix在SpringCloud體系的使用也非常簡單,下面,我們開始吧!
2、引入Hystrix
仍然是用我們上節的例子。
- 採用spring-cloud-starter的方式引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 在application.yml開啟hystrix:
feign:
hystrix:
enabled: true
- 在服務啟動類加入@EnableHystrix註解,以使系統支援hystrix的功能。
@SpringBootApplication
@MapperScan("cn.fighter3.mapper")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "cn.fighter3.client")
@EnableHystrix
public class EshopGoodsApplication {
public static void main(String[] args) {
SpringApplication.run(EshopGoodsApplication.class, args);
}
}
- 編寫一個StockClientFallback類,實現StockClientFeign介面,這個類是用來幹什麼的呢?是用於Feign客戶端遠端呼叫失敗回撥的。
/**
* @Author 三分惡
* @Date 2021/5/29
* @Description 庫存服務回撥異常回撥類
*/
@Component
@Slf4j
public class StockClientFallback implements StockClientFeign {
public Integer addStock(StockAddDTO stockAddDTO) {
log.error("庫存服務-新增庫存不可用!");
return 0;
}
public Integer getAccountById(Integer goodsId) {
log.error("庫存服務-獲取庫存不可用!");
return 0;
}
}
- 在StockClientFeign中新增失敗回撥配置,原來是
@FeignClient(value = "stock-service")
@FeignClient(value = "stock-service", fallback = StockClientFallback.class)
還有另外一種方式,可以在方法上使用@HystrixCommand(fallbackMethod = "getDefaultUser")
來定義服務降級方法。
3、測試Hystrix
- 依次啟動Nacos-Server、商品服務,注意,我們沒有啟動庫存服務
- 開啟 http://localhost:8020/doc.html ,呼叫一下新增商品介面。想一下,正常情況下,會是什麼結果呢?由於庫存服務沒起,那麼連帶著商品服務也一定會返回異常,但是加入了hystrix,發現,介面返回成功的結果。
看一下我們打的日誌,發現回撥的方法被呼叫了。
好了,Hystrix實現斷路器到這就結束了。
持續更新中,敬請關注……
"簡單的事情重複做,重複的事情認真做,認真的事情有創造性地做!"——
我是三分惡,一個能文能武的全棧開發,我們們下期見!
參考:
【1】:小專欄《SpringCloudAlibaba微服務實戰 》