hystrix熔断 简介_Hystrix简介– Hello World
hystrix熔斷 簡介
在以前的博客文章中,我介紹了需要像Netflix Hystrix這樣的庫的動(dòng)機(jī)。 在這里,我將跳入一些非常基本的方法來開始使用Hystrix,并在更復(fù)雜的用例中進(jìn)行跟進(jìn)。
你好,世界
以下是“ Hystrix命令”的一個(gè)簡單的Hello World示例:
import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class HelloWorldCommand extends HystrixCommand<String> {private static final Logger logger = LoggerFactory.getLogger(HelloWorldCommand.class);private final String name;public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name;}@Overrideprotected String run() throws Exception {logger.info("HelloWorld Command Invoked");return "Hello " + name;} }run方法保存了我們要防止的任何依賴活動(dòng),該活動(dòng)最終返回此特定實(shí)例中的參數(shù)化類型– String。 如果您是Netflix Rx-java庫的粉絲,那么創(chuàng)建Hystrix命令的另一種方法如下:
import com.netflix.hystrix.HystrixCommandGroupKey; import com.netflix.hystrix.HystrixObservableCommand; import rx.Observable;public class HelloWorldObservableCommand extends HystrixObservableCommand<String> {private String name;public HelloWorldObservableCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name;}@Overrideprotected Observable<String> resumeWithFallback() {return Observable.just("Returning a Fallback");}@Overrideprotected Observable<String> construct() {return Observable.just("Hello " + this.name);} }這里的“ construct”方法返回Rx-java Observable 。
使用Hystrix命令
現(xiàn)在我們有了一個(gè)Hystrix命令來包裝我們的調(diào)用,它可以用很多不同的方式使用,讓我們從最簡單的同步調(diào)用開始–
HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World"); assertEquals("Hello World", helloWorldCommand.execute());或者,可以使它返回Future:
HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World"); Future future = helloWorldCommand.queue(); assertEquals("Hello World", future.get());或者,甚至可以使它更好,以返回可觀察到的Rx-Java:
HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World");CountDownLatch l = new CountDownLatch(1);Observable<String> obs = helloWorldCommand.observe(); obs.subscribe(s -> logger.info("Received : " + s),t -> logger.error(t.getMessage(), t),() -> l.countDown() ); l.await(5, TimeUnit.SECONDS);該命令的Observable變體也沿相同的線工作,但是我們應(yīng)該對(duì)比一下小的行為差異:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); logger.info("Completed executing HelloWorld Command"); Observable<String> obs = helloWorldCommand.observe();這里有兩種獲取Observable的方法,一種是通過調(diào)用“ .observe()”的方法,另一種是以下方法:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); Observable<String> obs = helloWorldCommand.toObservable();另一個(gè)是以下使用“ .toObservable()”調(diào)用的內(nèi)容:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); Observable<String> obs = helloWorldCommand.toObservable();區(qū)別在于,“。observe()”方法返回的是Hot Observable,可立即開始執(zhí)行“ construct”方法,而“ .toObservable”的變體將返回“ Cold Observable”,除非已訂閱,否則不會(huì)調(diào)用“ construct”方法,請(qǐng)按以下方式說:
CountDownLatch l = new CountDownLatch(1); obs.subscribe(System.out::println, t -> l.countDown(), () -> l.countDown()); l.await();我在這里有更多信息。
請(qǐng)注意,盡管Hystrix Command不是Singleton,但是使用Hystrix Command的典型方法是在需要的地方構(gòu)造它,并在完成后進(jìn)行處置。
后備和命令組密鑰
在HelloWorldCommand的構(gòu)造函數(shù)中,我已經(jīng)調(diào)用了具有以下簽名的超類構(gòu)造函數(shù)方法:
public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name; }該參數(shù)指定一個(gè)Hystrix“命令組”鍵,以及默認(rèn)情況下是類的簡單名稱的Command Key,它控制著Hystrix行為的許多細(xì)節(jié),下面是屬性示例,我將稍后再回到這些細(xì)節(jié):
hystrix.command.HelloWorldCommand.metrics.rollingStats.timeInMilliseconds=10000 hystrix.command.HelloWorldCommand.execution.isolation.strategy=THREAD hystrix.command.HelloWorldCommand.execution.isolation.thread.timeoutInMilliseconds=1000 hystrix.command.HelloWorldCommand.execution.isolation.semaphore.maxConcurrentRequests=10 hystrix.command.HelloWorldCommand.circuitBreaker.errorThresholdPercentage=50 hystrix.command.HelloWorldCommand.circuitBreaker.requestVolumeThreshold=20 hystrix.command.HelloWorldCommand.circuitBreaker.sleepWindowInMilliseconds=5000hystrix.threadpool.default.coreSize=10 hystrix.threadpool.default.queueSizeRejectionThreshold=5我們可能要控制的另一行為是在對(duì)依賴服務(wù)的調(diào)用失敗的情況下的響應(yīng),后備方法提供了此行為,因此請(qǐng)考慮依賴服務(wù)始終失敗的情況:
import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class FallbackCommand extends HystrixCommand<String> {private static final String COMMAND_GROUP="default";private static final Logger logger = LoggerFactory.getLogger(FallbackCommand.class);public FallbackCommand() {super(HystrixCommandGroupKey.Factory.asKey(COMMAND_GROUP));}@Overrideprotected String run() throws Exception {throw new RuntimeException("Always fail");}@Overrideprotected String getFallback() {logger.info("About to fallback");return "Falling back";} }在這里,從屬服務(wù)調(diào)用始終失敗,并且以下測(cè)試中所示的響應(yīng)將始終是fallback方法的響應(yīng):
FallbackCommand fallbackCommand = new FallbackCommand(); assertEquals("Falling back", fallbackCommand.execute());監(jiān)控方式
在總結(jié)基礎(chǔ)之前,最好先演示一下Hystrix在Hystrix流和Hystrix儀表板方面提供的強(qiáng)大功能。 讓我們從Hystrix流開始,如果通常將其作為基于Java的Web應(yīng)用程序中的servlet啟用,它將提供有關(guān)Web應(yīng)用程序中Hystrix命令的行為的實(shí)時(shí)統(tǒng)計(jì)信息的SSE流。
由于我的演示基于基于Karyon2 Rx-Netty的應(yīng)用程序,因此可以在此處查看我的配置。 Hystrix流中的信息有點(diǎn)太原始了,這是很棒的Hystrix儀表板所適合的地方–它使用Hystrix流,并顯示有關(guān)每個(gè)Hystrix命令和不同底層線程池如何執(zhí)行的實(shí)時(shí)匯總信息。 我這里有一個(gè)基于很棒的Spring-Cloud項(xiàng)目的示例Hystrix儀表板項(xiàng)目。 此處是一個(gè)示例儀表板:
結(jié)論
這涵蓋了Hystrix的基礎(chǔ)知識(shí),還有很多工作要做,我將在下一篇博客文章中總結(jié)這些內(nèi)容,其中包含一些高級(jí)Hystrix功能的詳細(xì)信息。
翻譯自: https://www.javacodegeeks.com/2015/10/gentle-introduction-to-hystrix-hello-world.html
hystrix熔斷 簡介
總結(jié)
以上是生活随笔為你收集整理的hystrix熔断 简介_Hystrix简介– Hello World的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果电脑hdmi投影仪设置(苹果电脑hd
- 下一篇: 全球十大催泪感人电影排行榜(10部从头哭