摘要:主要介紹各接口和注解的使用方法。創(chuàng)建請(qǐng)求命令命令就是我們之前所說(shuō)的,他用來(lái)封裝具體的依賴服務(wù)調(diào)用邏輯。通過(guò)調(diào)用和可以返回對(duì)象,如下前者返回的是一個(gè),該命令會(huì)在調(diào)用的時(shí)候立即執(zhí)行,當(dāng)每次被訂閱的時(shí)候都會(huì)重放它的行為。表示使用執(zhí)行方式。
主要介紹Hystrix各接口和注解的使用方法。
創(chuàng)建請(qǐng)求命令Hystrix命令就是我們之前所說(shuō)的HystrixCommand,他用來(lái)封裝具體的依賴服務(wù)調(diào)用邏輯。
繼承方式實(shí)現(xiàn)HystrixCommand首先通過(guò)代碼實(shí)現(xiàn)HystrixCommand
package cn.sh.ribbon.command; import cn.sh.common.entity.User; import com.netflix.hystrix.HystrixCommand; import org.springframework.web.client.RestTemplate; /** * @author sh */ public class UserCommand extends HystrixCommand{ private RestTemplate restTemplate; private Long id; public UserCommand(Setter setter, RestTemplate restTemplate, Long id) { super(setter); this.restTemplate = restTemplate; this.id = id; } @Override protected User run() throws Exception { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); } }
通過(guò)上面實(shí)現(xiàn)的UserCommand,我們即可以實(shí)現(xiàn)請(qǐng)求的同步執(zhí)行也可以實(shí)現(xiàn)異步執(zhí)行,相關(guān)代碼如下:
package cn.sh.ribbon.service; import cn.sh.common.entity.User; import cn.sh.ribbon.command.UserCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** * @author sh */ @Service public class HelloService { private static final Logger logger = LoggerFactory.getLogger(HelloService.class); @Autowired private RestTemplate restTemplate; /** * 第一種使用命令的方式 * @param id * @return */ public User getUserById(Long id) { HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("userKey"); com.netflix.hystrix.HystrixCommand.Setter setter = com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(groupKey); UserCommand userCommand = new UserCommand(setter, restTemplate, id); // 同步執(zhí)行獲取結(jié)果 // return userCommand.execute(); // 異步執(zhí)行獲取結(jié)果 Future注解方式使用HystrixCommandfuture = userCommand.queue(); try { return future.get(); } catch (Exception e) { logger.info("獲取結(jié)果發(fā)生異常", e); } return null; } }
通過(guò)HystrixCommand注解可以更優(yōu)雅的實(shí)現(xiàn)Hystrix命令的定義,如下:
package cn.sh.ribbon.service; import cn.sh.common.entity.User; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; /** * @author sh */ @Service public class HelloService { private static final Logger logger = LoggerFactory.getLogger(HelloService.class); @Autowired private RestTemplate restTemplate; /** * 通過(guò)注解方式獲取User * @param id * @return */ @HystrixCommand public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); } }
上述代碼雖然可以優(yōu)雅的實(shí)現(xiàn)Hystrix命令,但是上述獲取User的方式只是同步執(zhí)行的實(shí)現(xiàn),如果需要實(shí)現(xiàn)異步執(zhí)行則需要進(jìn)行如下改造:
package cn.sh.ribbon.service; import cn.sh.common.entity.User; import cn.sh.ribbon.command.UserCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.command.AsyncResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import rx.Observable; import rx.Subscription; import rx.functions.Action1; import java.util.concurrent.Future; /** * @author sh */ @Service public class HelloService { private static final Logger logger = LoggerFactory.getLogger(HelloService.class); @Autowired private RestTemplate restTemplate; /** * 通過(guò)注解方式異步執(zhí)行獲取User * @param id * @return */ @HystrixCommand public Future響應(yīng)執(zhí)行asyncFindUserFutureById(Long id) { return new AsyncResult () { @Override public User invoke() { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); } }; } }
除了傳統(tǒng)的同步執(zhí)行與異步執(zhí)行之外,我們還可以將HystrixCommand通過(guò)Observable來(lái)實(shí)現(xiàn)響應(yīng)式執(zhí)行方式。通過(guò)調(diào)用observe()和toObservable()可以返回Observable對(duì)象, 如下:
Observableobserve = userCommand.observe(); Observable observe = userCommand.toObservable();
前者返回的是一個(gè)Hot Observable,該命令會(huì)在observe調(diào)用的時(shí)候立即執(zhí)行,當(dāng)Observable每次被訂閱的時(shí)候都會(huì)重放它的行為。
后者返回的是一個(gè)Cold Observable,toObservable()執(zhí)行之后,命令不會(huì)被立即執(zhí)行,只有當(dāng)所有訂閱者都訂閱他之后才會(huì)執(zhí)行。
HystrixCommand具備了observe()和toObservable()的功能,但是它的實(shí)現(xiàn)有一定的局限性,它返回的Observable只能發(fā)射一次數(shù)據(jù),所以Hystrix提供了另外的一個(gè)特殊命令封裝HysrtixObservableCommand,通過(guò)命令可以發(fā)射多次的Observable
響應(yīng)執(zhí)行自定義命令相關(guān)代碼如下:
package cn.sh.ribbon.command; import cn.sh.common.entity.User; import com.netflix.hystrix.HystrixObservableCommand; import org.springframework.web.client.RestTemplate; import rx.Observable; /** * @author sh */ public class UserObservableCommand extends HystrixObservableCommand響應(yīng)執(zhí)行使用注解@HystrixCommand{ private RestTemplate restTemplate; private Long id; public UserObservableCommand (Setter setter, RestTemplate restTemplate, Long id) { super(setter); this.restTemplate = restTemplate; this.id = id; } @Override protected Observable construct() { return Observable.create(subscriber -> { if (!subscriber.isUnsubscribed()) { User user = restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); subscriber.onNext(user); subscriber.onCompleted(); } }); } }
相關(guān)代碼如下:
package cn.sh.ribbon.service; import cn.sh.common.entity.User; import cn.sh.ribbon.command.UserCommand; import cn.sh.ribbon.command.UserObservableCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.command.AsyncResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import rx.Observable; import rx.Observer; import rx.Subscriber; import rx.Subscription; /** * @author sh */ @Service public class HelloService { private static final Logger logger = LoggerFactory.getLogger(HelloService.class); @Autowired private RestTemplate restTemplate; /** * 使用注解實(shí)現(xiàn)響應(yīng)式命令 * @param id * @return */ @HystrixCommand public ObservableobservableGetUserId(Long id) { return Observable.create(subscriber -> { if (!subscriber.isUnsubscribed()) { User user = restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); subscriber.onNext(user); subscriber.onCompleted(); } }); } }
使用@HystrixCommand注解實(shí)現(xiàn)響應(yīng)式命令,可以通過(guò)observableExecutionMode參數(shù)來(lái)控制是使用observe()還是toObservable()的執(zhí)行方式。該參數(shù)有下面兩種設(shè)置方式:
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER): EAGER是該參數(shù)的模式值,表示使用observe()執(zhí)行方式。
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY): 表示使用toObservable()執(zhí)行方式。
代碼地址spring-cloud-example
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76981.html
摘要:系統(tǒng)需要支持命令的撤銷。第步計(jì)算斷路器的健康度會(huì)將成功失敗拒絕超時(shí)等信息報(bào)告給斷路器,斷路器會(huì)維護(hù)一組計(jì)數(shù)器來(lái)統(tǒng)計(jì)這些數(shù)據(jù)。第步,當(dāng)前命令的線程池請(qǐng)求隊(duì)列或者信號(hào)量被占滿的時(shí)候。 斷路由器模式 在分布式架構(gòu)中,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路由器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的等待。這樣就不會(huì)使得線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放,避免了故障...
摘要:斷路器本身是一種開(kāi)關(guān)裝置,用于在電路上保護(hù)線路過(guò)載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)的切斷故障電路,防止發(fā)生過(guò)載發(fā)熱甚至起火等嚴(yán)重后果。具備擁有回退機(jī)制和斷路器功能的線程和信號(hào)隔離,請(qǐng)求緩存和請(qǐng)求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請(qǐng)注明出處 http://www.paraller.com 代碼機(jī)制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務(wù)架構(gòu)中,我們將系...
摘要:開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問(wèn)題前后端分離二使用完美處理權(quán)限問(wèn)題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...
1. Hystrix是誰(shuí)? Hystrix源于Netflix API團(tuán)隊(duì)在2011年啟動(dòng)的彈性工程工作,而目前它在Netflix每天處理著數(shù)百億的隔離線程以及數(shù)千億的隔離信號(hào)調(diào)用。該庫(kù)旨在通過(guò)控制那些訪問(wèn)遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix具備擁有回退機(jī)制和斷路器功能的線程和信號(hào)隔離,請(qǐng)求緩存和請(qǐng)求打包,以及監(jiān)控和配置等功能。目前托管在github上...
閱讀 2504·2021-11-15 11:38
閱讀 1948·2021-11-05 09:37
閱讀 2257·2021-10-08 10:12
閱讀 2807·2019-08-30 15:55
閱讀 2112·2019-08-30 15:52
閱讀 1221·2019-08-29 13:24
閱讀 463·2019-08-26 18:27
閱讀 1472·2019-08-26 18:27