溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中怎么自定義Hystrix請(qǐng)求命令

發(fā)布時(shí)間:2021-07-29 15:39:34 來源:億速云 閱讀:197 作者:Leah 欄目:大數(shù)據(jù)

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

自定義HystrixCommand

我們除了使用@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,然后重寫兩個(gè)方法:一個(gè)是getFallback,這個(gè)方法將在服務(wù)調(diào)用失敗時(shí)回調(diào);另一個(gè)是run方法,執(zhí)行請(qǐng)求時(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對(duì)象之后,我們有兩種方式來執(zhí)行請(qǐng)求,一種是調(diào)用execute方法發(fā)起一個(gè)同步請(qǐng)求,另一種是調(diào)用queue方法發(fā)起一個(gè)異步請(qǐng)求。
2.同步請(qǐng)求中可以直接返回請(qǐng)求結(jié)果。
3.異步請(qǐng)求中我們需要通過get方法來獲取請(qǐng)求結(jié)果,在調(diào)用get方法的時(shí)候也可以傳入超時(shí)時(shí)長。

執(zhí)行結(jié)果如下:

Spring Cloud中怎么自定義Hystrix請(qǐng)求命令  

如果我們先啟動(dòng)一個(gè)服務(wù)注冊(cè)中心,再啟動(dòng)兩個(gè)服務(wù)提供者實(shí)例,再啟動(dòng)一個(gè)服務(wù)消費(fèi)者,然后再關(guān)掉一個(gè)服務(wù)提供者,此時(shí)再訪問,就會(huì)間隔的看到如下頁面:

Spring Cloud中怎么自定義Hystrix請(qǐng)求命令  

通過注解實(shí)現(xiàn)異步請(qǐng)求

在上篇文章(Spring Cloud中的斷路器Hystrix)中我們使用了注解來配置Hystrix,當(dāng)時(shí)我們的寫法如下:

@HystrixCommand
public Book test2() {
    return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
}

那么這種請(qǐng)求是一種同步請(qǐng)求的方式,如果我們想要使用注解來實(shí)現(xiàn)異步請(qǐng)求怎么辦呢?很簡單,兩個(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,如下:

@HystrixCommand
    public Future<Book> test3() {
        return new AsyncResult<Book>() {
            @Override
            public 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();
}

對(duì)響應(yīng)式函數(shù)編程的支持

有的小伙伴可能對(duì)響應(yīng)式函數(shù)編程情有獨(dú)鐘,Hystrix對(duì)此也提供了相應(yīng)的支持,在我們獲取到BookCommand對(duì)象之后,也可以通過如下兩種方式來獲取到一個(gè)Observable來對(duì)數(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小伙伴們可以自行度娘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>() {
        @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();
            }
        }
    });
}

這個(gè)時(shí)候我們可以通過在注解中添加參數(shù)來描述是通過observe還是toObservable來實(shí)現(xiàn),如下:

@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式來執(zhí)行
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式來執(zhí)行

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI