在不少系統架構中都須要考慮橫向擴、單點故障等問題,對於一個龐大的應用集羣,部分服務或者機器出現問題不可避免,在出現故障時,如何減小故障的影響、保障集羣的高可用,成爲一個重要的工做,Hystrix 是一個幫助解決分佈式系統交互時超時處理和容錯的類庫,它一樣擁有保護系統的能力。Hystrix 主要實現如下功能: apache
Hystrix 使用示例 網絡
建立Maven項目,命名爲 hystrix-client,並增長 hystrix 依賴和 Http 提交相關依賴,POM.xml 內容以下:架構
<?xmlversion="1.0"encoding="UTF-8"?>maven
<projectxmlns="http://maven.apache.org/POM/4.0.0" 分佈式
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ide
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> 測試
<modelVersion>4.0.0</modelVersion> this
<groupId>org.lixue</groupId>url
<artifactId>hystrix-client</artifactId> spa
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--Hystrix依賴-->
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.12</version>
</dependency>
<!--logback日誌依賴-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--http客戶端依賴-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
</project>
命令類須要繼承 HystrixCommand 類,並實現其 run 方法執行具體業務,實現 getFallback 方法執行回退業務,在調用 run 方法超時或者斷路器處於打開狀態時,會調用 getFallback 方法進行回退。
package org.lixue.hystrixclient;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandProperties;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class SpeakSleepCommand extends HystrixCommand<String>{
private int sleep;
private CloseableHttpClient httpClient;
private String url;
public SpeakSleepCommand(intsleep){
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Speak"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()));
this.sleep=sleep;
this.httpClient=HttpClients.createDefault();
this.url="http://localhost:8080/speak/sleep?seconds="+this.sleep;
}
protected String run() throws Exception{
try{
HttpGet request=new HttpGet(this.url);
HttpResponse response=httpClient.execute(request);
return EntityUtils.toString(response.getEntity());
}catch(Exceptionex){
ex.printStackTrace();
return ex.getMessage();
}
}
@Override
protected String getFallback(){
return"call fallback";
}
}
實例化咱們建立的 SpeakSleepCommand 類,並調用 execute 來執行(調用 run 方法不會使用 Hystrix)
package org.lixue.hystrixclient;
public class HystrixClient{
public static void main(String[]args){
SpeakSleepCommand cmd=new SpeakSleepCommand(10);
try{
Stringresult=cmd.execute();
System.out.println("請求結果="+result);
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
默認狀況下,Hystrix 是 1000 毫秒超時,咱們在實例化傳入的是10秒,所以在調用的時候會執行 getFallback 方法;若是修改在實例化傳入 0 秒,不進行阻塞,會正常返回結果值。