SpringCloud Hystrix 容錯保護


 

相關概念

容錯

在分佈式系統中,某個版塊可能會出現問題,比如連接超時、發生異常,需要用一些方式提升系統容錯,在一些板塊出問題時,系統也能正常運行、依然可用,不會被某個板塊的問題拖垮。

Hystrix是一個容錯框架,提供了服務限流、服務降級、熔斷、監控、cache等功能,可以有效阻止服務調用故障造成的級聯故障。

 

服務限流

當消費者對某提供者的調用請求個數較多時,消費者可以限制自身對提供者發起的請求個數,請求個數超過指定值時,使請求快速失敗。服務限流將正常請求、快速失敗的請求隔離開來,也叫作隔離策略。

Hystrix的限流方式有2種:線程池、信號量。
 

1、THREAD  線程池,默認的隔離策略

將每個服務調用請求都包裝爲一個線程,放到服務調用的線程池中。線程池中的服務調用請求都是正在執行的,線程池滿了就放到隊列中排隊等待,隊列滿了就讓後續的服務調用請求快速失敗。
 

2、SEMAPHORE  信號量

信號量即可同時執行的服務調用請求個數,默認值10。進行一次服務調用,將信號量-1;完成一個調用請求將信號量+1;信號量爲0時使後續服務調用請求快速失敗。
 

信號量適用於高併發的服務調用,因爲高併發時線程池中線程數極多,資源開銷大。信號量一般只用於非網絡調用。

 

斷路器

消費者監控服務調用請求的失敗率,失敗率達到閾值時打開斷路器,熔斷鏈路,切斷下游服務,防止下游服務的故障影響到上游服務,後續的服務調用請求快速失敗。

斷路器打開後自動開啓5min的窗口期(數值可調),窗口期內的服務調用請求都快速失敗,5min後斷路器半開,放行部分服務調用請求,如果這些服務調用請求都成功了,說明問題已修復,關閉斷路器,鏈路恢復通行,即鏈路的自我修復。

 

服務降級

服務調用請求(快速)失敗之後,會執行預案(回退方法)代替服務調用。

 

hystrix用於限制服務調用,自然是在服務消費者中使用的。

feign集成了hystrix,可以直接使用hystrix,也可以使用feign自帶的hystrix。

 

使用Feign自帶的Hystrix

這種方式需要和feign搭配使用

1、在application.yml中啓用feign自帶的hystrix

feign:
  hystrix:
    enabled: true

 

2、在feign包下編寫服務調用的回退類

@Component  //放到spring容器中
public class OrderServiceFeignFallback implements OrderServiceFeign {  //實現feign接口

    //實現的方法就是接口中對應方法的回退方法
    @Override
    public List<Order> findOrdersByUserId(Integer userId) {
        
    }

}

 

3、在feign接口中指定回退類

@FeignClient(name = "order-service", fallback = OrderServiceFeignFallback.class)  //指定回退類
public interface OrderServiceFeign {

    @GetMapping("/api/v1/order/list/{user_id}") 
    List<Order> findOrdersByUserId(@PathVariable("user_id") Integer userId);

}

 

直接使用Hystrix

1、創建時勾選Spring Cloud Circuit Breaker -> Hystrix [Maintenance],或者手動添加依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

 

2、引導類上加 @EnableCircuitBreaker或@EnableHystrix

 

3、指定回退方法

@Service
public class UserService {

  @Autowired
    private OrderServiceFeign orderServiceFeign;  //注入要使用的Feign接口

	@HystrixCommand(fallbackMethod = "findOrdersByIdFallback")  //指定回退方法
    public List<Order> findOrdersById(Integer userId){
        return orderServiceFeign.findOrdersByUserId(userId);
    }

	// 回退方法。參數表、返回值類型要與原方法相同
    public List<Order> findOrdersByIdFallback(Integer userId){
       
    }
    
}

 

2種方式的對比

  • 第一種要和feign搭配使用,第二種無此要求
  • 第一種只作用於服務調用,第二種可以作用於所有方法,不侷限於消費者、服務調用,可以給所有方法指定回退方法、添加容錯保護
  • 第一種更加方便、好維護
  • 第二種可以在application.yml中配置hystrix相關參數,第一種則不能
hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: THREAD  #指定隔離策略,默認線程池
          thread:
            timeoutInMilliseconds: 4000  #指定方法執行的超時時間,默認1000,ms,指定時間內未完成就認爲失敗,執行回退方法
            #semaphore:
              #maxConcurrentRequests: 100  #如果使用信號量,可以指定信號數

 

Hystrix 的監控儀表盤(瞭解)

實際開發中用得不多,瞭解即可
 

actuator 監控服務調用

1、添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 
2、application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*"  #監控服務調用的所有數據,默認只監控部分數據

 
3、訪問 127.0.0.1:8781/actuator/hystrix.stream ,ip、port換爲消費者的
刷新服務調用,已經監控到數據
在這裏插入圖片描述
 

dashboard 儀表盤

上面密密麻麻的數據不直觀,hystrix提供了儀表盤來直觀展示監控到的數據。儀表盤可以在消費者中配置,也可以單獨寫一個子模塊作爲儀表盤
 
1、創建時勾選Spring Cloud Circuit Breaker -> Hystrix DasdBoard [Maintenance],或者手動添加依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

如果單獨用一個服務來作爲儀表盤,只加這個依賴即可,這個依賴中已經包含了spring-boot-start-web
 

2、引導類上加 @EnableHystrixDashboard
 

3、springboot web項目默認使用8080端口,如果單獨使用一個服務作爲儀表盤,看是否需要修改端口
 

4、訪問 127.0.0.1:8080/hystrix , ip、port換爲儀表盤所在模塊的

輸入要監控的 actuator 的地址,儀表盤啓動時會在console打印可監控的actuator地址
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章