目錄
相關概念
容錯
在分佈式系統中,某個版塊可能會出現問題,比如連接超時、發生異常,需要用一些方式提升系統容錯,在一些板塊出問題時,系統也能正常運行、依然可用,不會被某個板塊的問題拖垮。
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地址