javascript
Spring Cloud自定义Hystrix请求命令
在上篇文章中,我們介紹了斷路器Hystrix的一個(gè)簡單使用,主要是通過注解來實(shí)現(xiàn)斷路器的功能的,不過對于Hystrix的使用,除了注解,我們也可以使用繼承類的方式來實(shí)現(xiàn),本文我們就來看看另一種Hystrix的使用方式。
本文是Spring Cloud系列的第十一篇文章,了解前十篇文章內(nèi)容有助于更好的理解本文:
1.使用Spring Cloud搭建服務(wù)注冊中心
2.使用Spring Cloud搭建高可用服務(wù)注冊中心
3.Spring Cloud中服務(wù)的發(fā)現(xiàn)與消費(fèi)
4.Eureka中的核心概念
5.什么是客戶端負(fù)載均衡
6.Spring RestTemplate中幾種常見的請求方式
7.RestTemplate的逆襲之路,從發(fā)送請求到負(fù)載均衡
8.Spring Cloud中負(fù)載均衡器概覽
9.Spring Cloud中的負(fù)載均衡策略
10.Spring Cloud中的斷路器Hystrix
本文所使用的服務(wù)注冊中心、服務(wù)提供者和服務(wù)消費(fèi)者都是我們在前文中搭建出來的,這里我就不再贅述,不了解的小伙伴請翻看本系列前面幾篇文章(文末提供了源碼下載)。
自定義HystrixCommand
我們除了使用@HystrixCommand注解,也可以自定義類繼承自HystrixCommand,如下:
public class BookCommand extends HystrixCommand<Book> {private RestTemplate restTemplate;@Overrideprotected Book getFallback() {return new Book("宋詩選注", 88, "錢鐘書", "三聯(lián)書店");}public BookCommand(Setter setter, RestTemplate restTemplate) {super(setter);this.restTemplate = restTemplate;}@Overrideprotected Book run() throws Exception {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);} }在BookCommand中注入RestTemplate,然后重寫兩個(gè)方法:一個(gè)是getFallback,這個(gè)方法將在服務(wù)調(diào)用失敗時(shí)回調(diào);另一個(gè)是run方法,執(zhí)行請求時(shí)調(diào)用。構(gòu)造方法的第一個(gè)參數(shù)主要用來保存一些分組信息。
同步調(diào)用和異步調(diào)用
當(dāng)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)用,我說如下幾點(diǎn):
1.獲取到BookCommand對象之后,我們有兩種方式來執(zhí)行請求,一種是調(diào)用execute方法發(fā)起一個(gè)同步請求,另一種是調(diào)用queue方法發(fā)起一個(gè)異步請求。
2.同步請求中可以直接返回請求結(jié)果。
3.異步請求中我們需要通過get方法來獲取請求結(jié)果,在調(diào)用get方法的時(shí)候也可以傳入超時(shí)時(shí)長。
執(zhí)行結(jié)果如下:
如果我們先啟動(dòng)一個(gè)服務(wù)注冊中心,再啟動(dòng)兩個(gè)服務(wù)提供者實(shí)例,再啟動(dòng)一個(gè)服務(wù)消費(fèi)者,然后再關(guān)掉一個(gè)服務(wù)提供者,此時(shí)再訪問,就會(huì)間隔的看到如下頁面:
通過注解實(shí)現(xiàn)異步請求
在上篇文章([Spring Cloud中的斷路器Hystrix]())中我們使用了注解來配置Hystrix,當(dāng)時(shí)我們的寫法如下:
@HystrixCommand public Book test2() {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); }那么這種請求是一種同步請求的方式,如果我們想要使用注解來實(shí)現(xiàn)異步請求怎么辦呢?很簡單,兩個(gè)步驟:
1.配置HystrixCommandAspect的Bean
在項(xiàng)目的入口類中配置一個(gè)HystrixCommandAspect的Bean,如下:
@Bean public HystrixCommandAspect hystrixCommandAspect() {return new HystrixCommandAspect(); }2.通過AsyncResult來執(zhí)行調(diào)用
還是使用@HystrixCommand注解,但是方法的實(shí)現(xiàn)使用AsyncResult,如下:
@HystrixCommandpublic Future<Book> test3() {return new AsyncResult<Book>() {@Overridepublic Book invoke() {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);}};}OK,如此之后我們就可以通過注解來實(shí)現(xiàn)異步調(diào)用了。調(diào)用方式如下:
@RequestMapping("/test3") public Book test3() throws ExecutionException, InterruptedException {Future<Book> bookFuture = bookService.test3();//調(diào)用get方法時(shí)也可以設(shè)置超時(shí)時(shí)長return bookFuture.get(); }對響應(yīng)式函數(shù)編程的支持
有的小伙伴可能對響應(yīng)式函數(shù)編程情有獨(dú)鐘,Hystrix對此也提供了相應(yīng)的支持,在我們獲取到BookCommand對象之后,也可以通過如下兩種方式來獲取到一個(gè)Observable<Book>來對數(shù)據(jù)進(jìn)行二次處理:
BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);Observable<Book> observe = bookCommand.observe();Observable<Book> bookObservable = bookCommand.toObservable();關(guān)于Observable<Book>小伙伴們可以自行度娘RxJava的用法,我這里就不再贅述,就說下observe和toObservable的區(qū)別:
1.observe命令在調(diào)用的時(shí)候會(huì)立即返回一個(gè)Observable。
2.toObservable則不會(huì)立即返回一個(gè)Observable,訂閱者調(diào)用數(shù)據(jù)的時(shí)候才會(huì)執(zhí)行。
通過注解支持響應(yīng)式函數(shù)編程
當(dāng)然,響應(yīng)式函數(shù)編程也可以通過注解來實(shí)現(xiàn),如下:
@HystrixCommand public Observable<Book> test4() {return Observable.create(new Observable.OnSubscribe<Book>() {@Overridepublic void call(Subscriber<? super Book> subscriber) {if (!subscriber.isUnsubscribed()) {Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);subscriber.onNext(book);subscriber.onCompleted();}}}); }這個(gè)時(shí)候我們可以通過在注解中添加參數(shù)來描述是通過observe還是toObservable來實(shí)現(xiàn),如下:
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式來執(zhí)行 @HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式來執(zhí)行OK,Hystrix自定義請求命令我們就先說這么多,整體上來看,還是注解要方便一些。下篇文章我們來看看服務(wù)降級的問題。
案例地址:https://github.com/lenve/SimpleSpringCloud
更多JavaEE資料請關(guān)注公眾號:
總結(jié)
以上是生活随笔為你收集整理的Spring Cloud自定义Hystrix请求命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java从入门到放弃》JavaSE入门
- 下一篇: JS 装饰器(Decorator)场景实