代碼倉庫:https://gitee.com/jikeh/JiKeHCN-RELEASE.git
1、簡介
1)wiki簡介
https://github.com/Netflix/Hystrix/wiki
簡而言之:
在分布式系統中,存在很多依賴服務,有的時候某些依賴服務出現故障也是很正常的,我們如何保證在某個依賴服務故障的時候,來保證系統能夠整體正常運作呢?
使用hystrix,我們可以把其,當作一種類似于springboot,dubbo,mybatis的架構,使用了該架構,可以保證我們的系統服務高可用
Hystrix可以讓我們在分布式系統中對服務進行一些控制:資源隔離、限流、熔斷、降級、運維監控,通過這些方法幫助我們提升分布式系統的可用性和穩定性
這節,我們主要講一下使用hystrix的線程池隔離技術來實作資源隔離的基礎執行個體,下一節我們将抽取廣告系統的某個功能來應用下該技術!!!
那什麼是資源隔離?
資源隔離:讓整個業務系統裡,不會因某個依賴服務出現故障,而耗盡系統所有的資源,比如線程資源
2)官網介紹的簡單使用
https://github.com/Netflix/Hystrix
簡單看下,如果看不懂也沒事,繼續往下看,當然也可以看我上傳的視訊
2、基礎功能
擷取廣告資訊
這裡,我們就是擷取一個字元串來模拟擷取廣告資訊:
private String getStr(String name){
return 'Hello ' + name + '!';
}
3、使用hystrix的線程池隔離技術改造上面的代碼
1)處理單個請求
public class CommandHelloWorld extends HystrixCommand{
private final String name;
public CommandHelloWorld(String name) {
super(HystrixCommandGroupKey.Factory.asKey('GetAdsGroup'));
this.name = name;
}
@Override
protected String run() {
return 'Hello ' + name + '!';
}
}
2)處理批量請求
public class ObservableCommandHelloWorld extends HystrixObservableCommand{
private String[] adIds;
public ObservableCommandHelloWorld(String[] adIds) {
super(HystrixCommandGroupKey.Factory.asKey('GetAdsGroup'));
this.adIds = adIds;
}
@Override
protected Observableconstruct() {
return Observable.create(new Observable.OnSubscribe() {
public void call(Subscriber super="" string=""?> observer) {
try {
for(String adId : adIds) {
observer.onNext('Hello ' + adId + '!');
}
observer.onCompleted();
} catch (Exception e) {
observer.onError(e);
}
}
}).subscribeOn(Schedulers.io());
}
}
4、單元測試
1)測試單個請求
public class UnitTestCommand {
//同步:
@Test
public void testSynchronous() {
String str = new CommandHelloWorld('World').execute();
System.out.println(str);
}
//異步:
@Test
public void testAsynchronous() throws Exception {
FuturefWorld = new CommandHelloWorld('World').queue();
String str = fWorld.get();
System.out.println(str);
}
}
2)測試批量請求
public class UnitTestObservableCommand {
//異步:
@Test
public void testAsynchronous() throws Exception {
String adIds = '1,2,3';
//異步擷取執行:
HystrixObservableCommandgetAdInfosCommand = new ObservableCommandHelloWorld(adIds.split(','));
Observableobservable = getAdInfosCommand.observe();
//訂閱一個觀察者來觀察執行結果
observable.subscribe(new Observer() {
public void onCompleted() {
System.out.println('擷取完了所有的廣告資料');
}
public void onError(Throwable e) {
e.printStackTrace();
}
public void onNext(String adInfo) {
System.out.println(JSONObject.toJSONString(adInfo));
}
});
//同步擷取執行結果:我們一次查詢,肯定是傳回結果集的組合
Listads = new ArrayList<>();
Iteratoriterator = observable.toBlocking().getIterator();
while(iterator.hasNext()) {
ads.add(iterator.next());
}
System.out.println('最終的結果集:'+ads);
}
}