Hystrix简介– Hello World
在先前的博客文章中,我談到了需要像Netflix Hystrix這樣的庫的動機。 在這里,我將跳入一些非常基本的方法來開始使用Hystrix,并在更復雜的用例中進行后續介紹。
你好,世界
以下是“ Hystrix命令”的一個簡單的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方法保存了我們要保護的所有依賴活動,該活動最終返回此特定實例中的參數化類型– String。 如果您是Netflix Rx-java庫的粉絲,那么創建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命令
現在我們有了一個Hystrix命令來包裝我們的調用,它可以用很多不同的方式使用,讓我們從最簡單的同步調用開始–
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變體也沿相同的方向工作,但是我們應該對比一下小的行為差異:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); logger.info("Completed executing HelloWorld Command"); Observable<String> obs = helloWorldCommand.observe();這里有兩種獲取Observable的方法,一種是通過調用“ .observe()”的方法,另一種是以下方法:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); Observable<String> obs = helloWorldCommand.toObservable();另一個是以下使用“ .toObservable()”調用的內容:
HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World"); Observable<String> obs = helloWorldCommand.toObservable();區別在于,“。observe()”方法返回的是Hot Observable,可立即開始執行“ construct”方法,而“ .toObservable”的變體將返回“ Cold Observable”,除非已預訂,否則不會調用“ construct”方法,請按以下方式說:
CountDownLatch l = new CountDownLatch(1); obs.subscribe(System.out::println, t -> l.countDown(), () -> l.countDown()); l.await();我在這里有更多信息。
請注意,盡管Hystrix Command不是Singleton,但使用Hystrix Command的典型方法是在需要的地方構造它,并在完成后將其處置。
后備和命令組密鑰
在HelloWorldCommand的構造函數中,我調用了具有以下簽名的超類構造函數方法:
public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name; }該參數指定一個Hystrix“命令組”鍵,以及默認情況下是類的簡單名稱的Command Key,它控制著Hystrix行為的許多細節,下面是屬性示例,我將稍后再回到這些細節:
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我們可能要控制的另一種行為是在對依賴服務的調用失敗的情況下的響應,后備方法提供了這種行為,因此請考慮依賴服務始終失敗的情況:
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";} }在這里,從屬服務調用始終失敗,并且以下測試中所示的響應將始終是fallback方法的響應:
FallbackCommand fallbackCommand = new FallbackCommand(); assertEquals("Falling back", fallbackCommand.execute());監控方式
在總結基礎之前,最好先演示一下Hystrix在Hystrix流和Hystrix儀表板方面的出色功能。 讓我們從Hystrix流開始,如果通常在基于Java的Web應用程序中將其作為servlet啟用,它會提供SSE實時統計流,有關Web應用程序中存在的Hystrix命令的行為。
由于我的演示基于基于Karyon2 Rx-Netty的應用程序,因此可以在此處查看我的配置。 Hystrix流中的信息有點太原始了,這是很棒的Hystrix儀表板所適合的地方–它使用Hystrix流,并顯示有關每個Hystrix命令和不同底層線程池如何執行的實時匯總信息。 我這里有一個基于很棒的Spring-Cloud項目的示例Hystrix儀表板項目。 此處是一個示例儀表板:
結論
這涵蓋了Hystrix的基礎知識,還有很多工作要做,我將在下一篇博客文章中總結這些內容,其中包含一些高級Hystrix功能的詳細信息。
翻譯自: https://www.javacodegeeks.com/2015/10/gentle-introduction-to-hystrix-hello-world.html
總結
以上是生活随笔為你收集整理的Hystrix简介– Hello World的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴担保交易是什么意思?
- 下一篇: maven 构建依赖树_Maven构建依