91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud中怎么自定義Hystrix請求命令

發布時間:2021-07-29 15:39:34 來源:億速云 閱讀:208 作者:Leah 欄目:大數據

Spring Cloud中怎么自定義Hystrix請求命令,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

自定義HystrixCommand

我們除了使用@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請求命令  

如果我們先啟動一個服務注冊中心,再啟動兩個服務提供者實例,再啟動一個服務消費者,然后再關掉一個服務提供者,此時再訪問,就會間隔的看到如下頁面:

Spring Cloud中怎么自定義Hystrix請求命令  

通過注解實現異步請求

在上篇文章(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小伙伴們可以自行度娘RxJava的用法,我這里就不再贅述,就說下observe和toObservable的區別:

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模式來執行

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲麻莱县| 建昌县| 兰考县| 正宁县| 乌鲁木齐县| 浪卡子县| 大名县| 阜新| 丰城市| 台中市| 阳江市| 贵州省| 保定市| 寿光市| 六安市| 桑日县| 宁国市| 瑞金市| 滕州市| 京山县| 万盛区| 博湖县| 中西区| 噶尔县| 临高县| 西昌市| 屯门区| 江孜县| 茂名市| 石城县| 太谷县| 宁蒗| 叙永县| 海丰县| 蚌埠市| 云林县| 赫章县| 农安县| 克山县| 京山县| 庄浪县|