java 熔断_Hystrix服务熔断
## 熔斷原理
熔斷器,頁腳斷路器,其英文單詞為:Circuit Breaker.
熔斷機制的原理很簡單,像家里的電路熔斷器,如果電路發生短路能立刻熔斷電路,避免發生火災.在分布式系統中應用這一模式之后,服務調用方可以自己進行判斷某些服務反應慢或者存在大量超時的情況時,能夠主動熔斷,防止整個系統被拖垮.
不同于電路熔斷只能斷不能自動重連,Hystrix可以實現彈性容錯,當情況好轉之后,可以自動重連.這就好比魔術師把鴿子變沒了容易,但是真正考驗技術的是如何把小時的鴿子再變回來.
通過斷路的方式,可以將后續請求直接拒絕掉,一段時間之后允許部分請求通過,如果調用成功則回到電路閉合狀態,否則繼續斷開.

## 狀態機三種狀態
1. Closed:關閉狀態(斷路器關閉),所有請求都正常訪問.
2. Open:打開狀態(斷路器打開),所有請求都會被降級.Hystrix會對請求情況計數,當一定時間內失敗請求百分比達到閾值,則觸發熔斷,斷路器會完全關閉.默認失敗比例的閾值是50%,請求次數最少不低于20次.
3. Half Open:半開狀態,Closed狀態不是永久的,關閉后會進入休眠時間(默認是5S).隨后斷路器會自動進入半開狀態.此時會釋放部分請求通過,若這些請求都是健康的,則會完全關閉斷路器,否則繼續保持打開,再次進行休眠計劃.
## 配置
circuitBreaker.requestVolumeThreshold:觸發熔斷的最小請求次數,默認20.
circuitBreaker.sleepWindowInMilliseconds:休眠時長,默認是5000毫秒.
circuitBreaker.errorThresholdPercentage:觸發熔斷的失敗請求最小占比,默認50%.
## 代碼
~~~
@RestController
@RequestMapping("/user")
@DefaultProperties(defaultFallback = "defaultCallBack")
public class UserController
{
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/{id}")
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //最近請求的次數
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠時間
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") //錯誤百分比
})
public String index(@PathVariable("id") Long id)
{
if (id % 2 == 0) {
throw new RuntimeException(""); //模擬請求失敗
}
String url = "http://user-server/user/";
return restTemplate.getForObject(url + id, String.class);
}
public String defaultCallBack()
{
return "服務器壓力很大";
}
}
~~~
### 快速請求幾次,觸發熔斷器:

### 當我們再次請求正常邏輯之后,會快速失敗:

總結
以上是生活随笔為你收集整理的java 熔断_Hystrix服务熔断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SRAM cell 详解
- 下一篇: 8位并行左移串行转换电路_双向移位寄存器