您好,登錄后才能下訂單哦!
Spring Cloud中怎么自定義Hystrix請求命令,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
我們除了使用@HystrixCommand注解,也可以自定義類繼承自HystrixCommand,如下:
public class BookCommand extends HystrixCommand<Book> { private RestTemplate restTemplate; @Override protected Book getFallback() { return new Book("宋詩選注", 88, "錢鐘書", "三聯書店"); } 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,這個方法將在服務調用失敗時回調;另一個是run方法,執行請求時調用。構造方法的第一個參數主要用來保存一些分組信息。
當BookCommand創建成功之后,我們就可以在我們的Controller中調用它了,如下:
@RequestMapping("/test1") public Book test1() throws ExecutionException, InterruptedException { BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); //同步調用 //Book book1 = bookCommand.execute(); //異步調用 Future<Book> queue = bookCommand.queue(); Book book = queue.get(); return book; }
關于這一段調用,我說如下幾點:
1.獲取到BookCommand對象之后,我們有兩種方式來執行請求,一種是調用execute方法發起一個同步請求,另一種是調用queue方法發起一個異步請求。
2.同步請求中可以直接返回請求結果。
3.異步請求中我們需要通過get方法來獲取請求結果,在調用get方法的時候也可以傳入超時時長。
執行結果如下:
如果我們先啟動一個服務注冊中心,再啟動兩個服務提供者實例,再啟動一個服務消費者,然后再關掉一個服務提供者,此時再訪問,就會間隔的看到如下頁面:
在上篇文章(Spring Cloud中的斷路器Hystrix)中我們使用了注解來配置Hystrix,當時我們的寫法如下:
@HystrixCommand public Book test2() { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); }
那么這種請求是一種同步請求的方式,如果我們想要使用注解來實現異步請求怎么辦呢?很簡單,兩個步驟:
1.配置HystrixCommandAspect的Bean
在項目的入口類中配置一個HystrixCommandAspect的Bean,如下:
@Bean public HystrixCommandAspect hystrixCommandAspect() { return new HystrixCommandAspect(); }
2.通過AsyncResult來執行調用
還是使用@HystrixCommand注解,但是方法的實現使用AsyncResult,如下:
@HystrixCommand public Future<Book> test3() { return new AsyncResult<Book>() { @Override public Book invoke() { return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class); } }; }
OK,如此之后我們就可以通過注解來實現異步調用了。調用方式如下:
@RequestMapping("/test3") public Book test3() throws ExecutionException, InterruptedException { Future<Book> bookFuture = bookService.test3(); //調用get方法時也可以設置超時時長 return bookFuture.get(); }
有的小伙伴可能對響應式函數編程情有獨鐘,Hystrix對此也提供了相應的支持,在我們獲取到BookCommand對象之后,也可以通過如下兩種方式來獲取到一個Observable
BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate); Observable<Book> observe = bookCommand.observe(); Observable<Book> bookObservable = bookCommand.toObservable();
關于Observable
1.observe命令在調用的時候會立即返回一個Observable。
2.toObservable則不會立即返回一個Observable,訂閱者調用數據的時候才會執行。
當然,響應式函數編程也可以通過注解來實現,如下:
@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(); } } }); }
這個時候我們可以通過在注解中添加參數來描述是通過observe還是toObservable來實現,如下:
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式來執行 @HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式來執行
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。