Spring Cloud中怎么自定義Hystrix請求命令,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創(chuàng)新互聯(lián)服務項目包括莊浪網(wǎng)站建設、莊浪網(wǎng)站制作、莊浪網(wǎng)頁制作以及莊浪網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,莊浪網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到莊浪省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
我們除了使用@HystrixCommand注解,也可以自定義類繼承自HystrixCommand,如下:
public class BookCommand extends HystrixCommand<Book> { private RestTemplate restTemplate; @Override protected Book getFallback() { return new Book("宋詩選注", 88, "錢鐘書", "三聯(lián)書店"); } public BookCommand(Setter setter, RestTemplate restTemplate) { super(setter); this.restTemplate = restTemplate; } @Override protected Book run() throws Exception { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); } }
在BookCommand中注入RestTemplate,然后重寫兩個方法:一個是getFallback,這個方法將在服務調(diào)用失敗時回調(diào);另一個是run方法,執(zhí)行請求時調(diào)用。構(gòu)造方法的第一個參數(shù)主要用來保存一些分組信息。
當BookCommand創(chuàng)建成功之后,我們就可以在我們的Controller中調(diào)用它了,如下:
@RequestMapping("/test1") public Book test1() throws ExecutionException, InterruptedException { BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); //同步調(diào)用 //Book book1 = bookCommand.execute(); //異步調(diào)用 Future<Book> queue = bookCommand.queue(); Book book = queue.get(); return book; }
關(guān)于這一段調(diào)用,我說如下幾點:
1.獲取到BookCommand對象之后,我們有兩種方式來執(zhí)行請求,一種是調(diào)用execute方法發(fā)起一個同步請求,另一種是調(diào)用queue方法發(fā)起一個異步請求。
2.同步請求中可以直接返回請求結(jié)果。
3.異步請求中我們需要通過get方法來獲取請求結(jié)果,在調(diào)用get方法的時候也可以傳入超時時長。
執(zhí)行結(jié)果如下:
如果我們先啟動一個服務注冊中心,再啟動兩個服務提供者實例,再啟動一個服務消費者,然后再關(guān)掉一個服務提供者,此時再訪問,就會間隔的看到如下頁面:
在上篇文章(Spring Cloud中的斷路器Hystrix)中我們使用了注解來配置Hystrix,當時我們的寫法如下:
@HystrixCommand public Book test2() { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); }
那么這種請求是一種同步請求的方式,如果我們想要使用注解來實現(xiàn)異步請求怎么辦呢?很簡單,兩個步驟:
1.配置HystrixCommandAspect的Bean
在項目的入口類中配置一個HystrixCommandAspect的Bean,如下:
@Bean public HystrixCommandAspect hystrixCommandAspect() { return new HystrixCommandAspect(); }
2.通過AsyncResult來執(zhí)行調(diào)用
還是使用@HystrixCommand注解,但是方法的實現(xiàn)使用AsyncResult,如下:
@HystrixCommand public Future<Book> test3() { return new AsyncResult<Book>() { @Override public Book invoke() { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); } }; }
OK,如此之后我們就可以通過注解來實現(xiàn)異步調(diào)用了。調(diào)用方式如下:
@RequestMapping("/test3") public Book test3() throws ExecutionException, InterruptedException { Future<Book> bookFuture = bookService.test3(); //調(diào)用get方法時也可以設置超時時長 return bookFuture.get(); }
有的小伙伴可能對響應式函數(shù)編程情有獨鐘,Hystrix對此也提供了相應的支持,在我們獲取到BookCommand對象之后,也可以通過如下兩種方式來獲取到一個Observable
BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); Observable<Book> observe = bookCommand.observe(); Observable<Book> bookObservable = bookCommand.toObservable();
關(guān)于Observable
1.observe命令在調(diào)用的時候會立即返回一個Observable。
2.toObservable則不會立即返回一個Observable,訂閱者調(diào)用數(shù)據(jù)的時候才會執(zhí)行。
當然,響應式函數(shù)編程也可以通過注解來實現(xiàn),如下:
@HystrixCommand public Observable<Book> test4() { return Observable.create(new Observable.OnSubscribe<Book>() { @Override public void call(Subscriber<? super Book> subscriber) { if (!subscriber.isUnsubscribed()) { Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); subscriber.onNext(book); subscriber.onCompleted(); } } }); }
這個時候我們可以通過在注解中添加參數(shù)來描述是通過observe還是toObservable來實現(xiàn),如下:
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式來執(zhí)行 @HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式來執(zhí)行
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站欄目:SpringCloud中怎么自定義Hystrix請求命令
本文URL:http://www.chinadenli.net/article46/jcoieg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、商城網(wǎng)站、網(wǎng)站排名、域名注冊、做網(wǎng)站、自適應網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)