源碼位址: 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實作斷路器到這就結束了。
持續更新中,敬請關注……
“簡單的事情重複做,重複的事情認真做,認真的事情有創造性地做!”——
我是三分惡,一個能文能武的全棧開發,咱們下期見!