天天看點

實戰Spring Cloud 微服務容錯保護Hystrix

文章目錄

  • ​​背景​​
  • ​​一、微服務容錯保護的措施​​
  • ​​1.1 服務熔斷​​
  • ​​1.2 服務降級​​
  • ​​Spring Cloud Hystrix​​
  • ​​二、實戰Hystrix​​
  • ​​2.1 引入Hystrix依賴​​
  • ​​2.2 開啟Hystrix支援​​
  • ​​2.3 配置Hystrix​​
  • ​​2.4 在微服務調用接口中增加服務容錯保護​​
  • ​​2.5 啟動背景微服務進行測試服務可用性​​
  • ​​2.6 關閉背景微服務測試熔斷處理​​
  • ​​小結​​

背景

  • 由于網絡或者自身的原因,微服務并不能保證服務百分之百可用。對不可用的微服務反複重試調用,會增加伺服器的負載,嚴重的情況下會導緻該服務癱瘓。
  • 調用互相依賴的微服務而出現問題也在所難免的。當遇到問題時,應及時地啟動應急預案,讓系統進行自我調節和保護。
  • 如果不能及時有效地隔離有問題的微服務,則所有的服務請求有可能會因為這個單點故障而阻塞,導緻整個服務鍊都不能正常對外提供服務,進而産生雪崩效應。此時就需要我們對微服務進行容錯保護,及時發現微服務故障并進行處理。
實戰Spring Cloud 微服務容錯保護Hystrix

一、微服務容錯保護的措施

1.1 服務熔斷

  • 類似熔斷保險絲機制,當調用鍊路的某個微服務不可用或者響應時間太長時,會進行服務熔斷,不再有該節點微服務的調用,快速傳回錯誤的響應資訊。當檢測到該節點微服務調用響應正常後,再恢複調用鍊路。

1.2 服務降級

  • 當整個微服務架構的負載超出了預設的上限門檻值或即将到來的流量預計将會超過預設的門檻值時,為了保證重要或基本的服務能正常運作,可以将一些不重要或不緊急的服務進行降級、 延遲 或 暫停使用。

Spring Cloud Hystrix

  • 在Spring Cloud Netflix所提供的解決方案中有一個名為Hystrix(豪豬)的庫,通過該庫可以為我們解決以下問題:·
  1. 對第三方接口/依賴服務潛在的調用失敗提供保護和控制機制。·
  2. 在分布式系統中隔離資源,降低耦合,防止服務之間互相調用而導緻級連失敗;·
  3. 快速失敗及迅速恢複。·在合适的時機對服務進行優雅降級處理。·對服務提供近乎實時的監控、報警和控制操作。
實戰Spring Cloud 微服務容錯保護Hystrix

二、實戰Hystrix

  • 對于微服務容錯來說保護的是服務消費方,下面我們對服務調用者UserConsumer進行更改。

2.1 引入Hystrix依賴

<!-- pom.xml -->
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>      

2.2 開啟Hystrix支援

  • 在啟動類中增加@EnableCircuitBreaker注解
/**
 * 主啟動類
 */
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class DemoConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoConsumerApplication.class, args);
    }
}      

2.3 配置Hystrix

# application.yml 

# 啟用hystrix
feign:
  hystrix:
    enabled: true
# hystrix逾時設定
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000      

2.4 在微服務調用接口中增加服務容錯保護

  • 在接口中增加服務容錯處理,指定服務熔斷時處理的類名
/**
 * 商品微服務接口
 */
@Component
// 增加服務容錯處理,指定服務熔斷時處理的類名
@FeignClient(value="goods-service",fallback =FallBackService.class )
public interface GoodService {

    @GetMapping(value="/api/goods")
    List<GoodsDTO> getGoods();

}      
  • 實作服務熔斷時處理類
/**
 * 服務熔斷處理
 */
@Component
public class FallBackService implements GoodService {
    private final static Logger logger= LoggerFactory.getLogger(FallBackService.class) ;

    @Override
    public List<GoodsDTO> getGoods() {
        logger.info("服務已熔斷...");
        return new ArrayList<>();
    }
}      

2.5 啟動背景微服務進行測試服務可用性

  • 啟動背景微服務
  • 實戰Spring Cloud 微服務容錯保護Hystrix
  • 微服務被調用
  • 實戰Spring Cloud 微服務容錯保護Hystrix
  • 消費者擷取到微服務提供的商品資訊
  • 實戰Spring Cloud 微服務容錯保護Hystrix

2.6 關閉背景微服務測試熔斷處理

  • 關閉背景微服務:檢視nacos控制台,沒有微服務運作
  • 實戰Spring Cloud 微服務容錯保護Hystrix
  • 使用Rest HttpClient進行服務調用測試:調用者發現微服務已熔斷,傳回空資料。
實戰Spring Cloud 微服務容錯保護Hystrix
實戰Spring Cloud 微服務容錯保護Hystrix

小結

  • 本文介紹了微服務雪崩效應及容錯保護機制,及如何使用Hystrix進行基本的熔斷和降級等技術實作服務容錯,進而提高微服務系統的整體健壯性。
  • 但不幸的是Hystrix也已經停更
  • 目前阿裡的Sentinel可以完美替換hystrix