摘要:主要介紹各接口和注解的使用方法。創(chuàng)建請求命令命令就是我們之前所說的,他用來封裝具體的依賴服務(wù)調(diào)用邏輯。通過調(diào)用和可以返回對象,如下前者返回的是一個,該命令會在調(diào)用的時候立即執(zhí)行,當(dāng)每次被訂閱的時候都會重放它的行為。表示使用執(zhí)行方式。
主要介紹Hystrix各接口和注解的使用方法。
創(chuàng)建請求命令Hystrix命令就是我們之前所說的HystrixCommand,他用來封裝具體的依賴服務(wù)調(diào)用邏輯。
繼承方式實現(xiàn)HystrixCommand首先通過代碼實現(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); } }
通過上面實現(xiàn)的UserCommand,我們即可以實現(xiàn)請求的同步執(zhí)行也可以實現(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; } }
通過HystrixCommand注解可以更優(yōu)雅的實現(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; /** * 通過注解方式獲取User * @param id * @return */ @HystrixCommand public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); } }
上述代碼雖然可以優(yōu)雅的實現(xiàn)Hystrix命令,但是上述獲取User的方式只是同步執(zhí)行的實現(xiàn),如果需要實現(xiàn)異步執(zhí)行則需要進行如下改造:
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; /** * 通過注解方式異步執(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通過Observable來實現(xiàn)響應(yīng)式執(zhí)行方式。通過調(diào)用observe()和toObservable()可以返回Observable對象, 如下:
Observableobserve = userCommand.observe(); Observable observe = userCommand.toObservable();
前者返回的是一個Hot Observable,該命令會在observe調(diào)用的時候立即執(zhí)行,當(dāng)Observable每次被訂閱的時候都會重放它的行為。
后者返回的是一個Cold Observable,toObservable()執(zhí)行之后,命令不會被立即執(zhí)行,只有當(dāng)所有訂閱者都訂閱他之后才會執(zhí)行。
HystrixCommand具備了observe()和toObservable()的功能,但是它的實現(xiàn)有一定的局限性,它返回的Observable只能發(fā)射一次數(shù)據(jù),所以Hystrix提供了另外的一個特殊命令封裝HysrtixObservableCommand,通過命令可以發(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; /** * 使用注解實現(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注解實現(xiàn)響應(yīng)式命令,可以通過observableExecutionMode參數(shù)來控制是使用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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76981.html
摘要:系統(tǒng)需要支持命令的撤銷。第步計算斷路器的健康度會將成功失敗拒絕超時等信息報告給斷路器,斷路器會維護一組計數(shù)器來統(tǒng)計這些數(shù)據(jù)。第步,當(dāng)前命令的線程池請求隊列或者信號量被占滿的時候。 斷路由器模式 在分布式架構(gòu)中,當(dāng)某個服務(wù)單元發(fā)生故障之后,通過斷路由器的故障監(jiān)控(類似熔斷保險絲),向調(diào)用方返回一個錯誤響應(yīng),而不是長時間的等待。這樣就不會使得線程因調(diào)用故障服務(wù)被長時間占用不釋放,避免了故障...
摘要:斷路器本身是一種開關(guān)裝置,用于在電路上保護線路過載,當(dāng)線路中有電器發(fā)生短路時,斷路器能夠及時的切斷故障電路,防止發(fā)生過載發(fā)熱甚至起火等嚴(yán)重后果。具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。 轉(zhuǎn)載請注明出處 http://www.paraller.com 代碼機制:熔斷 & Fallback & 資源隔離 熔斷 概念: 在微服務(wù)架構(gòu)中,我們將系...
摘要:開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
1. Hystrix是誰? Hystrix源于Netflix API團隊在2011年啟動的彈性工程工作,而目前它在Netflix每天處理著數(shù)百億的隔離線程以及數(shù)千億的隔離信號調(diào)用。該庫旨在通過控制那些訪問遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫的節(jié)點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監(jiān)控和配置等功能。目前托管在github上...
閱讀 2509·2021-11-15 11:38
閱讀 1958·2021-11-05 09:37
閱讀 2280·2021-10-08 10:12
閱讀 2816·2019-08-30 15:55
閱讀 2117·2019-08-30 15:52
閱讀 1230·2019-08-29 13:24
閱讀 469·2019-08-26 18:27
閱讀 1480·2019-08-26 18:27