使用Spring Cloud HystrixCommands的功能Hystrix

Spring的WebClient提供了一个非阻塞客户端来进行服务调用。 Hystrix虽然现在处于维护模式,但已通过防止级联故障,为慢速或故障上游服务的呼叫提供断路器来保护服务对服务的呼叫。

在本文中,我将探讨Spring Cloud如何提供一种更新的功能方法,以使用Hystrix封装远程调用。

考虑一个简单的服务,该服务返回使用实体Wiremock工具建模的实体列表(例如城市列表):

 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" ))) 

当使用类型为“ / cities”的uri进行调用时,此Wiremock终结点将使用以下类型的json进行响应:

 [ { "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秒后。

传统方法

使用Hystrix的方法有很多,传统上,我倾向于使用显式的Hystrix Command保护远程调用的方法,具体如下:

 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) }  } 

现在可以使用以下代码通过以下方式进行远程调用:

 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()”调用将Flux转换为Rx-Java Observable。 这里的图书馆 。

2.我仍然希望在应用程序的其余部分中使用Project Reactor“ Flux”类型,因此还有另一个适配器将Rx-Java Observable转换回Flux“ Flux.from(RxReactiveStreams.toPublisher(citiesObservable))”一旦包装在Hystrix中的呼叫返回。

如果我尝试使用5秒钟延迟的Wiremock样本尝试此客户端,则它将正确处理延迟并在一秒钟后返回。

功能方法

使用HystrixCommands的新功能性方法可以避免使用以前方法的许多样板,该功能性方法是Spring Cloud附带的实用程序类,它提供了使用Hystrix进行远程调用的功能性方法。

使用HystrixCommands进行的整个调用如下所示:

 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.可以明确指定任何替代–在此特定情况下,超时时间为1秒。

结论

我喜欢HystrixCommands带给WebClient使用Hystrix的简洁性。 我的github仓库中提供了整个示例– https://github.com/bijukunjummen/webclient-hystrix-sample,使这些示例正常工作所需的所有依赖项都属于此仓库。 如果您对使用Rx-Java 1感兴趣,那么可以介绍一种方法
在这里可以帮助您避免使用香草Hystrix

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串口服务器端口配置及调试的6大技巧

1、如何配置串行服务器&#xff1f; 在使用终端串口服务器之前&#xff0c;必须在连接和使用系统之前根据自己的操作环境和应用程序要求配置参数。这些参数主要包括网络参数&#xff0c;每个串行端口的操作模式&#xff0c;打印服务以及设备本身的管理信息和其他内容。 2、如…

飞畅科技告诉你什么是集成串口服务器POE交换机?

飞畅科技FCM系列工业POE交换机&#xff0c;提供7个百兆自适应RJ45端口3个千兆SFP上联光口插槽1路RS-485数据端口1路RS232数据端口&#xff0c;其中1-7口支持IEEE 802.3af/at标准PoE供电&#xff0c;单端口PoE功率达30W&#xff0c;整机最大PoE输出功率为240W。该系列产品是针对…

[渝粤教育] 三江学院 数字电子技术 参考 资料

教育 -数字电子技术-章节资料考试资料-三江学院【】 第一章作业 第一章测验 1、【单选题】在二进制计数系统中&#xff0c;每个变量的取值为&#xff08;&#xff09;。 A、0和1 B、0~7 C、0~9 D、0~F 参考资料【 】 2、【单选题】二进制数的权值为&#xff08;&#xff09;。 …

E820-DTU模拟量无线数传电台:物联网工业现场无线数传应用

为帮助用户在使用本公司产品时&#xff0c;能轻松快速的了解产品的使用方法&#xff0c;故写下E820-DTU工业现场无线变送应用手册&#xff0c;在此&#xff0c;读者需要了解本应用手册所针对的设备型号为我公司的E820-DTU(2I2-433L)&#xff0c;以下均简称为E820&#xff0c;或…

[渝粤教育] 三江学院 软件测试 参考 资料

教育 -软件测试-章节资料考试资料-三江学院【】 随堂练习 1、【单选题】下列关于软件测试的说法中正确的是&#xff1a; A、因为测试工作简单&#xff0c;所以其对软件产品质量影响不大&#xff1b; B、通过软件测试&#xff0c;主要发现软件产品的功能问题&#xff1b; C、软件…

【lora模块技术无线数传电台】E90-DTU产品高防护等级的体现

E90-DTU-SL系列采用最新一代军工级LoRa调制技术&#xff0c;在原来的基础上距离更远&#xff0c;功耗更低&#xff0c;无疑为物联网的建设注入了新的力量&#xff0c;而亿佰特在E90-DTU-SL系列的基础又加上了P&#xff1b;引起了大家的注意&#xff0c;那么P到底是什么意思呢&a…

[渝粤教育] 上海交通大学 流体力学 参考 资料

教育 -流体力学-章节资料考试资料-上海交通大学【】 单元作业 单元测验 1、【单选题】一个物体微元的变形大小与所受切应力相关&#xff0c;这个物体可以是&#xff1a; A、刚体 B、弹性体 C、流体 D、无 参考资料【 】 2、【单选题】一个物体微元的变形速度大小与所受切应力成…

什么是交换机?交换机的工作原理是什么?

交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层&#xff0c;即数据链路层。交换机拥有一条高带宽的背部总线和内部交换矩阵&am…

为什么5G物联网无线通信数传设备必须进行OTA更新

成都亿佰特电子科技有限公司一家集研发、生产、销售一体&#xff0c;具备完整产业链的高新技术企业。产品涵盖LoRa、WiFi、蓝牙、ZigBee、4G/5G/NB/DTU/GPRS无线模块及无线感知设备、数传电台、工业路由器、串口服务器等通信设备。公司拥有数百项发明和实用新型专利&#xff0c…

[渝粤教育] 上海师范大学 英汉互译 参考 资料

教育 -英汉互译-章节资料考试资料-上海师范大学【】 Quiz 1 1、【判断题】English is an analytic language whereas Chinese is a synthetic language. A、正确 B、错误 参考资料【 】 2、【判断题】English features hypotaxis whereas Chinese features parataxis. A、正确 …

LoRa无线通信模块在运动安全上的物联网运用

5月22日中午1点左右&#xff0c;第四届黄河石林山地马拉松百公里越野赛的高海拔赛段突遇极端天气&#xff0c;多名参赛人员出现身体不适、失温等情况&#xff0c;据统计已有21人不幸遇难&#xff0c;其中超半数为马拉松顶尖高手。相比于城市马拉松&#xff0c;山地越野马拉松具…

jsr 107_如何使用JSR107缓存注释

jsr 107最近&#xff0c;我对JSR107缓存注释以及JSR107的实现是否提供这些注释提出了一些问题。 可以将缓存注释添加到Java类中&#xff0c;并将其作为方法调用缓存操作。 例如&#xff0c;下面是带注释的BlogManager。 CacheDefaults(cacheName "blgMngr") publi…

[渝粤教育] 中南大学 病理生理学 参考 资料

教育 -病理生理学-章节资料考试资料-中南大学【】 第一、二讲 单元测验 1、【单选题】病理生理学是研究 A、正常生命活动规律的科学 B、正常机体形态结构变化的科学 C、患病机体形态结构变化的科学 D、疾病的临床表现的科学 E、患病机体功能代谢变化规律的科学 参考资料【 】 2…

什么是路由器交换机?路由器交换机介绍!

路由器是互联网络的枢纽&#xff0c;目前路由器已经广泛应用于各行各业&#xff0c;各种不同档次的产品已成为实现互联网互联互通业务的主力军。那么&#xff0c;什么是路由器交换机呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 交换机又名交…

亿佰特WiFi无线通信模块在物联网智慧农场应用案例

随着传感器、无线数传设备、应用方案的不断发展和成熟&#xff0c;也在不断推动着工业应用、智慧家居、智慧安防、智慧交通、智慧环保、智慧农业的发展&#xff1b;智慧农业也是近年来发展非常好的方向&#xff0c;尤其温室大棚等越来越智能化、现代化&#xff1b;我们某客户就…

[渝粤教育] 中原工学院 国际贸易理论 参考 资料

教育 -国际贸易理论-章节资料考试资料-中原工学院【】 测验一 1、【单选题】某年世界出口货物贸易额为1.4万亿美元&#xff0c;进口货物贸易额为1.5万亿美元&#xff0c;该年国际货物贸易额为&#xff08; &#xff09;。 A、0.1万亿美元 B、 1.5万亿美元 C、1.4万亿美元 D、2.…

【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案

物联网地震预警项目介绍&#xff1a; 地震&#xff0c;俗称地动。它像平常的刮风下雨一样&#xff0c;是一种常见的自然现象&#xff0c;是地壳运动的一种表现&#xff0c;即地球内部缓慢积累的能量突然释放而引起的地球表层的振动。据统计&#xff0c;5级以上地震就能够造成破…

什么是以太网交换机?以太网交换机的工作原理详解!

以太网交换机是基于以太网传输数据的交换机&#xff0c;以太网采用共享总线型传输媒体方式的局域网。以太网交换机的结构是每个端口都直接与主机相连&#xff0c;并且一般都工作在全双工方式。交换机能同时连通许多对端口&#xff0c;使每一对相互通信的主机都能像独占通信媒体…

有关Drools业务规则引擎的完整教程

与往常一样&#xff0c;我们在配套存储库EmailSchedulingRules中共享本教程中提供的代码。 业务规则很好地表现了某些领域的逻辑。 它们之所以有效&#xff0c;是因为它们可以直观直观地接近许多类型的领域专家的思维方式 。 其原因在于它们允许分解单个组件中的大问题。 这样…

[渝粤教育] 中国人民解放军陆军工程大学 机械基础 参考 资料

教育 -机械基础-章节资料考试资料-中国人民解放军陆军工程大学【】 第1章测试 1、【单选题】机器中&#xff0c;将其他形式的能转化为机械能的部分称为&#xff08; &#xff09;。 A、传动部分 B、动力部分 C、工作部分 D、控制部分 参考资料【 】 2、【单选题】具有确定的相对…