代碼倉庫:https:///jikeh/JiKeHCN-RELEASE.git 1、簡介 1)wiki簡介 https://github.com/Netflix/Hystrix/wiki 簡而言之: 在分布式系統(tǒng)中,存在很多依賴服務(wù),有的時候某些依賴服務(wù)出現(xiàn)故障也是很正常的,我們?nèi)绾伪WC在某個依賴服務(wù)故障的時候,來保證系統(tǒng)能夠整體正常運(yùn)行呢? 使用hystrix,我們可以把其,當(dāng)作一種類似于springboot,dubbo,mybatis的框架,使用了該框架,可以保證我們的系統(tǒng)服務(wù)高可用 Hystrix可以讓我們在分布式系統(tǒng)中對服務(wù)進(jìn)行一些控制:資源隔離、限流、熔斷、降級、運(yùn)維監(jiān)控,通過這些方法幫助我們提升分布式系統(tǒng)的可用性和穩(wěn)定性 這節(jié),我們主要講一下使用hystrix的線程池隔離技術(shù)來實(shí)現(xiàn)資源隔離的基礎(chǔ)實(shí)例,下一節(jié)我們將抽取廣告系統(tǒng)的某個功能來應(yīng)用下該技術(shù)?。?! 那什么是資源隔離? 資源隔離:讓整個業(yè)務(wù)系統(tǒng)里,不會因某個依賴服務(wù)出現(xiàn)故障,而耗盡系統(tǒng)所有的資源,比如線程資源 2)官網(wǎng)介紹的簡單使用 https://github.com/Netflix/Hystrix 簡單看下,如果看不懂也沒事,繼續(xù)往下看,當(dāng)然也可以看我上傳的視頻 2、基礎(chǔ)功能 獲取廣告信息 這里,我們就是獲取一個字符串來模擬獲取廣告信息: private String getStr(String name){ return 'Hello ' + name + '!'; } 3、使用hystrix的線程池隔離技術(shù)改造上面的代碼 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 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、單元測試 1)測試單個請求 /** * Hystrix基礎(chǔ)實(shí)例1:單個請求 */ 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)測試批量請求 /** * Hystrix基礎(chǔ)實(shí)例2:批量請求(基于觀察者) */ public class UnitTestObservableCommand { //異步: @Test public void testAsynchronous() throws Exception { String adIds = '1,2,3'; //異步獲取執(zhí)行: HystrixObservableCommand Observable //訂閱一個觀察者來觀察執(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); } } |
|