什麼是Hystrix,Hystrix如何使用html
容錯框架Hystrix,SpringCloud將Hystrix整合到Netflix項目中了。它主要用來添加一個延遲的閥值和容錯邏輯。來幫助咱們控制分佈式系統之間的組件交互。java
那麼什麼是延遲閥值呢:就拿下圖中的銷售模塊舉例,在銷售模塊調用會員模塊的時候,會給銷售模塊加上一個延遲,好比說 銷售模塊在限定的時間內沒有接收到會員模塊的響應或者有問題,就會觸發容錯的邏輯。數據庫
下面簡單的介紹下,什麼是Hystrix容錯框架服務器
1. Hystrix 能使你的系統在出現依賴服務失效的時候,經過隔離系統所依賴的服務,防止服務級聯失敗,同時提供失敗回退機制,更優雅地應對失效,並使你的系統能更快地從異常中恢復。網絡
2. Hystrix 能作什麼?app
2.1 防止單個依賴耗盡容器(例如 Tomcat)內全部用戶線程框架
2.2 下降系統負載,對沒法及時處理的請求快速失敗(fail fast)而不是排隊運維
2.3 提供失敗回退,以在必要時讓失效對用戶透明化分佈式
2.4 使用隔離機制(例如『艙壁』/『泳道』模式,熔斷器模式等)下降依賴服務對整個系統的影響ide
2.5 針對系統服務的度量、監控和報警,提供優化以知足近實時性的要求
2.6 在 Hystrix 絕大部分須要動態調整配置並快速部署到全部應用方面,提供優化以知足快速恢復的要求
2.7 能保護應用不受依賴服務的整個執行過程當中失敗的影響,而不單單是網絡請求
下面以一張圖給你們簡單的舉個例子
![]() |
首先,咱們把銷售模塊看做是服務調用者,把會員模塊看做服務提供者。 若是會員模塊請求不到數據,鏈接數據庫超時。有些網站就會有那種狀況,就是若是是請求超時,也不會給用戶一個很好的提示,那麼這個時候 用戶可無論你出了什麼問題,用戶就會一直點,一直刷新 這樣的話,就會發送不少請求到服務器,銷售模塊就會積壓不少請求,會員模塊就會一直等待數據庫的超時返回,這樣就會致使整個集羣都有問題了,服務會被阻塞。
傳統的解決方式: 1. 添加超時機制 2. 人肉運維。。。
還有一種,那就是本章內容要講的:Hystrix 容錯框架 |
![]()
|
在銷售模塊調用會員模塊的時候,會給銷售模塊加上一個延遲,好比說 銷售模塊在限定的時間內沒有接收到會員模塊的響應或者有問題,就會觸發容錯的邏輯。 若是銷售模塊與會員模塊屢次鏈接失敗,那麼Hystrix就會觸發它的斷路器,將這個節點的銷售模塊與會員模塊的連接所有斷掉,全部的請求過來,都會走那個回退邏輯。(回退邏輯屬於銷售模塊中的一部分,並非一個新的模塊) 這樣的話,其實是在保護銷售模塊,它就不用等待超時響應這樣的結果了,就直接的能夠返回給客戶,告訴客戶這裏有問題了。這樣作就能夠減輕整個集羣的負擔了。 |
首先,建立兩個接口後 再將服務跑起來:
@RestController public class MyController {
// 模仿成功返回的接口 @RequestMapping(value="/successHello", method=RequestMethod.GET) public String successHello(){ return "successHello"; }
// 模仿在請求的過程當中,出現錯誤的接口 @RequestMapping(value="/errorHello", method=RequestMethod.GET) public String errorHello() throws Exception { Thread.sleep(10000); return "errorHello"; } }
服務開啓以後,咱們來建立一個客戶端,對接口進行訪問:
String url_success = "http://localhost:8080/successHello"; HttpGet httpGet = new HttpGet(url_success); CloseableHttpClient httpClient = HttpClients.createDefault(); HttpResponse httpResponse = httpClient.execute(httpGet); String result = EntityUtils.toString(httpResponse.getEntity()); System.out.println(result);
咱們再將url換成:http://localhost:8080/errorHello,再執行一下 看效果:
errorHello也是能夠正常的返回,只不過由於設置了線程的睡眠,晚了10秒才返回結果,,,上面說的都不是重點,重點是上面與下面的對比,請繼續向下看:
接下來咱們建立一個實現命令類:HelloCommand.java 需繼承 HystrixCommand 類
public class HelloCommand extends HystrixCommand<String>{ protected HelloCommand() { super(HystrixCommandGroupKey.Factory.asKey("TestGroup")); } @Override protected String run() throws Exception { // String url = "http://localhost:8080/successHello"; String url = "http://localhost:8080/errorHello"; HttpGet httpGet = new HttpGet(url); CloseableHttpClient httpClient = HttpClients.createDefault(); HttpResponse httpResponse = httpClient.execute(httpGet); String result = EntityUtils.toString(httpResponse.getEntity()); return result; } }
再修改一下main方法,注意觀察命令類是怎樣使用的:
HelloCommand helloCommand = new HelloCommand(); String result = helloCommand.execute(); System.out.println(result);
若是url使用successHello訪問,那麼就會正常的返回數據,由於這個接口能快速調通,沒有出現鏈接錯誤等問題:
可是若是使用加了線程睡眠的接口errorHello,結果會是什麼樣的呢,咱們來看一下:
咱們能夠看到,因鏈接超時報的錯 重點是 no fallback available. 說明了,咱們沒有配置回退的邏輯,下面咱們就加上這個邏輯,需實現 getFallback 方法:
@Override protected String getFallback() { return "No fallback available."; }
好,咱們添加完回退邏輯後,再來執行下main方法,看看還會不會報錯:
原文出處:https://www.cnblogs.com/lpxdbk/p/9842736.html