天天看點

hystrix 源碼 線程池隔離_基于hystrix的高并發&高可用服務架構基礎執行個體(線程池隔離技術)...

hystrix 源碼 線程池隔離_基于hystrix的高并發&高可用服務架構基礎執行個體(線程池隔離技術)...

代碼倉庫:https://gitee.com/jikeh/JiKeHCN-RELEASE.git

1、簡介

1)wiki簡介

https://github.com/Netflix/Hystrix/wiki

簡而言之:

在分布式系統中,存在很多依賴服務,有的時候某些依賴服務出現故障也是很正常的,我們如何保證在某個依賴服務故障的時候,來保證系統能夠整體正常運作呢?

使用hystrix,我們可以把其,當作一種類似于springboot,dubbo,mybatis的架構,使用了該架構,可以保證我們的系統服務高可用

Hystrix可以讓我們在分布式系統中對服務進行一些控制:資源隔離、限流、熔斷、降級、運維監控,通過這些方法幫助我們提升分布式系統的可用性和穩定性

這節,我們主要講一下使用hystrix的線程池隔離技術來實作資源隔離的基礎執行個體,下一節我們将抽取廣告系統的某個功能來應用下該技術!!!

那什麼是資源隔離?

資源隔離:讓整個業務系統裡,不會因某個依賴服務出現故障,而耗盡系統所有的資源,比如線程資源

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);

}

}