什麼是Hystrix,Hystrix如何使用

什麼是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框架,那麼就須要對集羣進行改造

 

在銷售模塊調用會員模塊的時候,會給銷售模塊加上一個延遲,好比說 銷售模塊在限定的時間內沒有接收到會員模塊的響應或者有問題,就會觸發容錯的邏輯。

若是銷售模塊與會員模塊屢次鏈接失敗,那麼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

相關文章
相關標籤/搜索