日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring Cloud HystrixCommands的功能Hystrix

發(fā)布時(shí)間:2023/12/3 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring Cloud HystrixCommands的功能Hystrix 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring的WebClient提供了一個(gè)非阻塞客戶端來進(jìn)行服務(wù)調(diào)用。 Hystrix雖然現(xiàn)在處于維護(hù)模式,但已通過防止級(jí)聯(lián)故障,為慢速或故障上游服務(wù)的呼叫提供斷路器來保護(hù)服務(wù)對(duì)服務(wù)的呼叫。

在本文中,我將探討Spring Cloud如何提供一種更新的功能方法,以使用Hystrix封裝遠(yuǎn)程調(diào)用。

考慮一個(gè)簡單的服務(wù),該服務(wù)返回使用實(shí)體Wiremock工具建模的實(shí)體列表(例如城市列表):

WIREMOCK_SERVER.stubFor(WireMock.get(WireMock.urlMatching( "/cities" )) .withHeader( "Accept" , WireMock.equalTo( "application/json" )) .willReturn(WireMock.aResponse() .withStatus(HttpStatus.OK.value()) .withFixedDelay( 5000 ) .withHeader( "Content-Type" , "application/json" )))

當(dāng)使用類型為“ / cities”的uri進(jìn)行調(diào)用時(shí),此Wiremock終結(jié)點(diǎn)將使用以下類型的json進(jìn)行響應(yīng):

[ { "country" : "USA" , "id" : 1 , "name" : "Portland" , "pop" : 1600000 }, { "country" : "USA" , "id" : 2 , "name" : "Seattle" , "pop" : 3200000 }, { "country" : "USA" , "id" : 3 , "name" : "SFO" , "pop" : 6400000 } ]

延遲5秒后。

傳統(tǒng)方法

使用Hystrix的方法有很多,傳統(tǒng)上,我傾向于使用顯式的Hystrix Command保護(hù)遠(yuǎn)程調(diào)用的方法,具體如下:

import com.netflix.hystrix.HystrixCommandGroupKey import com.netflix.hystrix.HystrixCommandKey import com.netflix.hystrix.HystrixCommandProperties import com.netflix.hystrix.HystrixObservableCommand import org.bk.samples.model.City import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.http.MediaType import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.bodyToFlux import org.springframework.web.util.UriComponentsBuilder import reactor.core.publisher.Flux import rx.Observable import rx.RxReactiveStreams import rx.schedulers.Schedulers import java.net.URI CitiesHystrixCommand( class CitiesHystrixCommand( private val webClientBuilder: WebClient.Builder, private val citiesBaseUrl: String ) : HystrixObservableCommand<City>( HystrixObservableCommand.Setter .withGroupKey(HystrixCommandGroupKey.Factory.asKey( "cities-service" .withGroupKey(HystrixCommandGroupKey.Factory.asKey( "cities-service" )) .andCommandKey(HystrixCommandKey.Factory.asKey( "cities-service" .andCommandKey(HystrixCommandKey.Factory.asKey( "cities-service" )) .andCommandPropertiesDefaults(HystrixCommandProperties.Setter() .withExecutionTimeoutInMilliseconds( 4000 ))) { override fun construct(): Observable<City> { val buildUri: URI = UriComponentsBuilder .fromUriString(citiesBaseUrl) .path( "/cities" ) .build() .encode() .toUri() val webClient: WebClient = this .webClientBuilder.build() val result: Flux<City> = webClient.get() .uri(buildUri) .accept(MediaType.APPLICATION_JSON) .exchange() .flatMapMany { clientResponse -> clientResponse.bodyToFlux<City>() } return RxReactiveStreams.toObservable(result) } override fun resumeWithFallback(): Observable<City> { LOGGER.error( "Falling back on cities call" , executionException) LOGGER.error( , executionException) return Observable.empty() } companion object { private val LOGGER: Logger = LoggerFactory.getLogger(CitiesHystrixCommand:: class .java) } }

現(xiàn)在可以使用以下代碼通過以下方式進(jìn)行遠(yuǎn)程調(diào)用:

import org.springframework.http.MediaType import org.springframework.web.reactive.function.client.WebClient class CitiesHystrixCommandBasedClient( private val webClientBuilder: WebClient.Builder, private val citiesBaseUrl: String ) { fun getCities(): Flux<City> { val citiesObservable: Observable<City> = CitiesHystrixCommand(webClientBuilder, citiesBaseUrl) .observe() .subscribeOn(Schedulers.io()) return Flux .from(RxReactiveStreams .toPublisher(citiesObservable)) } }

這里要注意兩件事:

1. WebClient返回代表城市列表的Project Reactor“ Flux”類型 ,但是Hystrix 基于Rx-Java 1 ,因此使用RxJavaReactiveStreams 提供的 “ RxReactiveStreams.toObservable()”調(diào)用將Flux轉(zhuǎn)換為Rx-Java Observable。 這里的圖書館 。

2.我仍然希望在應(yīng)用程序的其余部分中使用Project Reactor“ Flux”類型,因此還有另一個(gè)適配器將Rx-Java Observable轉(zhuǎn)換回Flux“ Flux.from(RxReactiveStreams.toPublisher(citiesObservable))”一旦包裝在Hystrix中的呼叫返回。

如果我嘗試使用5秒鐘延遲的Wiremock樣本嘗試此客戶端,則它將正確處理延遲并在一秒鐘后返回。

功能方法

使用HystrixCommands的新功能性方法可以避免使用以前方法的許多樣板,該功能性方法是Spring Cloud附帶的實(shí)用程序類,它提供了使用Hystrix進(jìn)行遠(yuǎn)程調(diào)用的功能性方法。

使用HystrixCommands進(jìn)行的整個(gè)調(diào)用如下所示:

import com.netflix.hystrix.HystrixCommandProperties import org.bk.samples.model.City import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.cloud.netflix.hystrix.HystrixCommands import org.springframework.http.MediaType import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.bodyToFlux import org.springframework.web.util.UriComponentsBuilder import reactor.core.publisher.Flux import rx.schedulers.Schedulers import java.net.URI class CitiesFunctionalHystrixClient( private val webClientBuilder: WebClient.Builder, private val citiesBaseUrl: String ) { fun getCities(): Flux<City> { return HystrixCommands .from(callCitiesService()) .commandName( "cities-service" ) .groupName( "cities-service" ) .commandProperties( HystrixCommandProperties.Setter() .withExecutionTimeoutInMilliseconds( 1000 ) ) .toObservable { obs -> obs.observe() .subscribeOn(Schedulers.io()) } .fallback { t: Throwable -> LOGGER.error(t.message, t) Flux.empty() } .toFlux() } fun callCitiesService(): Flux<City> { val buildUri: URI = UriComponentsBuilder .fromUriString(citiesBaseUrl) .path( "/cities" ) .build() .encode() .toUri() val webClient: WebClient = this .webClientBuilder.build() return webClient.get() .uri(buildUri) .accept(MediaType.APPLICATION_JSON) .exchange() .flatMapMany { clientResponse -> clientResponse.bodyToFlux<City>() } } companion object { private val LOGGER: Logger = LoggerFactory.getLogger(CitiesHystrixCommand:: class .java) } }

這種方法避免了很多樣板–

1.不再需要顯式命令 2.通話和后備均以流暢的方式編碼 3.可以明確指定任何替代–在此特定情況下,超時(shí)時(shí)間為1秒。

結(jié)論

我喜歡HystrixCommands帶給WebClient使用Hystrix的簡潔性。 我的github倉庫中提供了整個(gè)示例– https://github.com/bijukunjummen/webclient-hystrix-sample,使這些示例正常工作所需的所有依賴項(xiàng)都屬于此倉庫。 如果您對(duì)使用Rx-Java 1感興趣,那么可以介紹一種方法
在這里可以幫助您避免使用香草Hystrix

翻譯自: https://www.javacodegeeks.com/2019/05/functional-hystrix-using-spring-cloud-hystrixcommands.html

總結(jié)

以上是生活随笔為你收集整理的使用Spring Cloud HystrixCommands的功能Hystrix的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。