SpringCloud Alibaba實戰(9:Hystrix容錯保護)

三分惡發表於2021-06-29

原始碼地址:https://gitee.com/fighter3/eshop-project.git

持續更新中……

在上一節我們已經使用OpenFeign完成了服務間的呼叫。想一下,假如我們一個服務鏈路上上下游有十幾個服務,每個服務有若干個節點,其中一個節點故障,上游請求打到故障的節點,加入請求一直阻塞,大量堆積的請求可能會把服務打崩,可能導致級聯式的失敗,甚至整個鏈路失敗,這就是所謂的服務雪崩,嚴重可能直接導致系統掛掉。為了避免這種可怕的情況,必要的容錯保護機制是必需的。

服務雪崩

1、Hystrix簡介

Hystrix是Netflix的一個重要元件,提供了斷路器、資源隔離與自我修復功能。

如下是Hystrix作為斷路器,阻止級聯失敗。

hystrix阻止級聯失敗

但是Hystrix1.5.18版本之後進入了維護模式,我們採用的就是這個版本。在SpringCloud Alibaba的體系,有另外一個元件sentinel可以作為替代品,在後面我們會用到。

Hystrix停止維護

儘管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微服務實戰 》

【2】:Spring Cloud Hystrix:服務容錯保護

相關文章