代碼倉(cāng)庫(kù):https://gitee.com/jikeh/JiKeHCN-RELEASE.git
1、簡(jiǎn)介
1)wiki簡(jiǎn)介
https://github.com/Netflix/Hystrix/wiki
簡(jiǎn)而言之:
在分布式系統(tǒng)中,存在很多依賴服務(wù),有的時(shí)候某些依賴服務(wù)出現(xiàn)故障也是很正常的,我們?nèi)绾伪WC在某個(gè)依賴服務(wù)故障的時(shí)候,來(lái)保證系統(tǒng)能夠整體正常運(yùn)行呢?
使用hystrix,我們可以把其,當(dāng)作一種類似于springboot,dubbo,mybatis的框架,使用了該框架,可以保證我們的系統(tǒng)服務(wù)高可用
Hystrix可以讓我們?cè)诜植际较到y(tǒng)中對(duì)服務(wù)進(jìn)行一些控制:資源隔離、限流、熔斷、降級(jí)、運(yùn)維監(jiān)控,通過(guò)這些方法幫助我們提升分布式系統(tǒng)的可用性和穩(wěn)定性
這節(jié),我們主要講一下使用hystrix的線程池隔離技術(shù)來(lái)實(shí)現(xiàn)資源隔離的基礎(chǔ)實(shí)例,下一節(jié)我們將抽取廣告系統(tǒng)的某個(gè)功能來(lái)應(yīng)用下該技術(shù)?。?!
那什么是資源隔離?
資源隔離:讓整個(gè)業(yè)務(wù)系統(tǒng)里,不會(huì)因某個(gè)依賴服務(wù)出現(xiàn)故障,而耗盡系統(tǒng)所有的資源,比如線程資源
2)官網(wǎng)介紹的簡(jiǎn)單使用
https://github.com/Netflix/Hystrix
簡(jiǎn)單看下,如果看不懂也沒(méi)事,繼續(xù)往下看,當(dāng)然也可以看我上傳的視頻
2、基礎(chǔ)功能
獲取廣告信息
這里,我們就是獲取一個(gè)字符串來(lái)模擬獲取廣告信息:
private String getStr(String name){
return 'Hello ' + name + '!';
}
3、使用hystrix的線程池隔離技術(shù)改造上面的代碼
1)處理單個(gè)請(qǐng)求
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)處理批量請(qǐng)求 public class ObservableCommandHelloWorld extends HystrixObservableCommand private String[] adIds; public ObservableCommandHelloWorld(String[] adIds) { super(HystrixCommandGroupKey.Factory.asKey('GetAdsGroup')); this.adIds = adIds; } @Override protected Observable 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、單元測(cè)試 1)測(cè)試單個(gè)請(qǐng)求 /** * Hystrix基礎(chǔ)實(shí)例1:?jiǎn)蝹€(gè)請(qǐng)求 */ public class UnitTestCommand { //同步: @Test public void testSynchronous() { String str = new CommandHelloWorld('World').execute(); System.out.println(str); } //異步: @Test public void testAsynchronous() throws Exception { Future String str = fWorld.get(); System.out.println(str); } } 2)測(cè)試批量請(qǐng)求 /** * Hystrix基礎(chǔ)實(shí)例2:批量請(qǐng)求(基于觀察者) */ public class UnitTestObservableCommand { //異步: @Test public void testAsynchronous() throws Exception { String adIds = '1,2,3'; //異步獲取執(zhí)行: HystrixObservableCommand Observable //訂閱一個(gè)觀察者來(lái)觀察執(zhí)行結(jié)果 observable.subscribe(new Observer public void onCompleted() { System.out.println('獲取完了所有的廣告數(shù)據(jù)'); } public void onError(Throwable e) { e.printStackTrace(); } public void onNext(String adInfo) { System.out.println(JSONObject.toJSONString(adInfo)); } }); //同步獲取執(zhí)行結(jié)果:我們一次查詢,肯定是返回結(jié)果集的組合 List Iterator while(iterator.hasNext()) { ads.add(iterator.next()); } System.out.println('最終的結(jié)果集:'+ads); } }
聯(lián)系客服