一、hystrix基本介绍

Hystrix(https://github.com/Netflix/Hystrix)是Netflix(https://www.netflix.com/global)的一个开源项目,主要作用是通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 其可以看做是Netflix团队对分布式系统运维的各种理念和实践的总结。

二、基本用法

①pom.xml加上以下依赖

<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.8</version>
</dependency>

②基本使用

如果某程序或class要使用Hystrix,只需简单继承HystrixCommand/HystrixObservableCommand并重写run()/construct()
然后调用程序实例化此class并执行execute()/queue()/observe()/toObservable()
例如:
public class HelloWorldHystrixCommand extends HystrixCommand<String>{
private final String name;
public HelloWorldHystrixCommand(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
} @Override
protected String run() throws Exception {
//Thread.sleep(100);
return "hello"+name;
}
}
public static void main(String[] args){
String result = new HelloWorldHystrixCommand("test").execute();
System.out.println(result);
}

或者

public class HelloWorldHystrixObservableCommand extends HystrixObservableCommand<String>{

	private final String name;

	protected HelloWorldHystrixObservableCommand(String  name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
} @Override
protected Observable<String> construct() {
System.out.println("in construct! thread:" + Thread.currentThread().getName());
     return (Observable<String>) Observable.create(new Observable.OnSubscribe<String>() {
// @Override
public void call(Subscriber<? super String> observer) {
try {
System.out.println("in call of construct! thread:" + Thread.currentThread().getName());
if (!observer.isUnsubscribed()) {
// observer.onError(getExecutionException()); // 直接抛异常退出,不会往下执行
observer.onNext("Hello1" + " thread:" + Thread.currentThread().getName());
observer.onNext("Hello2" + " thread:" + Thread.currentThread().getName());
observer.onNext(name + " thread:" + Thread.currentThread().getName());
System.out.println("complete before------" + " thread:" + Thread.currentThread().getName());
observer.onCompleted(); // 不会往下执行observer的任何方法
System.out.println("complete after------" + " thread:" + Thread.currentThread().getName());
observer.onCompleted(); // 不会执行到
observer.onNext("abc"); // 不会执行到
}
} catch (Exception e) {
observer.onError(e);
}
}
});
}
}
public static void main(String[] args) {
    Observable<String> observable = new HelloWorldHystrixObservableCommand("test").observe();
    observable.subscribe(new Subscriber<String>() {
public void onCompleted() {
   System.out.println("completed");
}
public void onError(Throwable throwable) {
System.out.println("error-----------"+throwable);
}
public void onNext(String v) {
System.out.println("next------------" + v);
}
  });
}

③HystrixCommand 与 HystrixObservableCommand对比

要想使用hystrix,只需要继承HystrixCommandHystrixObservableCommand,简单用法见上面例子。

两者主要区别是:

(1)前者的命令逻辑写在run();后者的命令逻辑写在construct()

(2)前者的run()是由新创建的线程执行;后者的construct()是由调用程序线程执行

(3)前者一个实例只能向调用程序发送(emit)单条数据,比如上面例子中run()只能返回一个String结果;后者一个实例可以顺序发送多条数据,比如demo中顺序调用多个onNext(),便实现了向调用程序发送多条数据;

④4个命令的执行方法对比

execute()queue()observe()toObservable()这4个方法用来触发执行run()/construct(),一个实例只能执行一次这4个方法,特别说明的是HystrixObservableCommand没有execute()queue()
4个方法的主要区别是:

(1)execute():以同步堵塞方式执行run()。调用execute()后,hystrix先创建一个新线程运行run(),接着调用程序要在execute()调用处一直堵塞着,直到run()运行完成(2)queue():以异步非堵塞方式执行run()。一调用queue()就直接返回一个Future对象,同时hystrix创建一个新线程运行run(),调用程序通过Future.get()拿到run()的返回结果,而Future.get()是堵塞执行的。

测试代码如下:

@Test
public void testQueue() throws Exception {
// queue()是异步非堵塞性执行:直接返回,同时创建一个线程运行HelloWorldHystrixCommand.run()
// 一个对象只能queue()一次
// queue()事实上是toObservable().toBlocking().toFuture()
Future<String> future = new HelloWorldHystrixCommand("Hlx").queue(); // 使用future时会堵塞,必须等待HelloWorldHystrixCommand.run()执行完返回
String queueResult = future.get(10000, TimeUnit.MILLISECONDS);
// String queueResult = future.get();
System.out.println("queue异步结果:" + queueResult);
assertEquals("hello", queueResult.substring(0, 5));
}

(3)observe():事件注册前执行run()/construct()。第一步是事件注册前,先调用observe()自动触发执行run()/construct()(如果继承的是HystrixCommand,hystrix将创建新线程非堵塞执行run();如果继承的是HystrixObservableCommand,将以调用程序线程堵塞执行construct()),第二步是从observe()返回后调用程序调用subscribe()完成事件注册,如果run()/construct()执行成功则触发onNext()onCompleted(),如果执行异常则触发onError()

测试代码如下:

@Test
public void testObservable() throws Exception { // observe()是异步非堵塞性执行,同queue
Observable<String> hotObservable = new HelloWorldHystrixCommand("Hlx").observe(); // single()是堵塞的
//System.out.println("hotObservable single结果:" + hotObservable.toBlocking().single());
//System.out.println("------------------single");
// 注册观察者事件
// subscribe()是非堵塞的
hotObservable.subscribe(new Observer<String>() { // 先执行onNext再执行onCompleted
// @Override
public void onCompleted() {
System.out.println("hotObservable completed");
}
// @Override
public void onError(Throwable e) {
e.printStackTrace();
}
// @Override
public void onNext(String v) {
System.out.println("hotObservable onNext: " + v);
}
});
// 非堵塞
// - also verbose anonymous inner-class
// - ignore errors and onCompleted signal
hotObservable.subscribe(new Action1<String>() { // 相当于上面的onNext()
// @Override
public void call(String v) {
System.out.println("hotObservable call: " + v);
}
});
// 主线程不直接退出,在此一直等待其他线程执行
System.in.read();
}

(4)toObservable():事件注册后执行run()/construct()。第一步是事件注册前,一调用toObservable()就直接返回一个Observable<String>对象,第二步调用subscribe()完成事件注册后自动触发执行run()/construct()(如果继承的是HystrixCommand,hystrix将创建新线程非堵塞执行run(),调用程序不必等待run();如果继承的是HystrixObservableCommand,将以调用程序线程堵塞执行construct(),调用程序等待construct()执行完才能继续往下走),如果run()/construct()执行成功则触发onNext()onCompleted(),如果执行异常则触发onError()

测试代码如下:

@Test
public void testToObservable() throws Exception { // toObservable()是异步非堵塞性执行,同queue
Observable<String> coldObservable = new HelloWorldHystrixCommand("Hlx").toObservable(); // single()是堵塞的
//System.out.println("coldObservable single结果:" + coldObservable.toBlocking().single()); // 注册观察者事件
// subscribe()是非堵塞的
// - this is a verbose anonymous inner-class approach and doesn't do assertions
coldObservable.subscribe(new Observer<String>() { // 先执行onNext再执行onCompleted
// @Override
public void onCompleted() {
System.out.println("coldObservable completed");
}
// @Override
public void onError(Throwable e) {
System.out.println("coldObservable error");
e.printStackTrace();
}
// @Override
public void onNext(String v) {
System.out.println("coldObservable onNext: " + v);
}
});
// 非堵塞
// - also verbose anonymous inner-class
// - ignore errors and onCompleted signal
/*coldObservable.subscribe(new Action1<String>() { public void call(String v) {
// 相当于上面的onNext()
// @Override
System.out.println("coldObservable call: " + v);
}
});*/
// 主线程不直接退出,在此一直等待其他线程执行
System.in.read(); }

参考文献:

http://www.jianshu.com/p/b9af028efebb

hystrix基本介绍和使用(1)的更多相关文章

  1. hystrix应用介绍(一)

    声明:本文仅做个人的一次接口重构过程记录,期间参考了一些写的不错的博客,如果存在抄袭,请留言. hystrix基本介绍 hystrix 是一个开源的容灾框架,目的是为了解决当依赖服务出现故障或者接口响 ...

  2. Hystrix的介绍和简单使用

    这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下. 一.什么是Hystrix Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微 ...

  3. Hystrix简单介绍

    Netflix的Hystrix是一个帮助解决分布式系统交互超时处理和容错的类库,同样拥有保护系统的能力. 服务隔离 服务降级 1.服务隔离 在一个系统中,一个业务通常会依赖多个服务,且这若干个服务的调 ...

  4. hystrix应用介绍(四)

    前几章已经讲了hystrix的应用场景,以及如何使用,本章我们针对如何进行hystrix参数配置做一些分析 //异步的执行 @HystrixCommand(groupKey = "testK ...

  5. hystrix应用介绍(三)

    hystrix提供了两种隔离策略:线程池隔离和信号量隔离.hystrix默认采用线程池隔离. 1.线程池隔离 不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果. 例如: 我们可以通过andT ...

  6. hystrix应用介绍(二)

    上篇博客中讲了hystrix在公司中的一些应用场景,由于保密的原因没办法贴出优化的代码,这里专门写一篇hystrix代码的demo,供大家在使用的过程中快速上手 Hystrix有两个请求命令 Hyst ...

  7. Hystrix的介绍(断路、降级)

    在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:     在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...

  8. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  9. 【第十九章】 springboot + hystrix(1)

    hystrix是微服务中用于做熔断.降级的工具. 作用:防止因为一个服务的调用失败.调用延时导致多个请求的阻塞以及多个请求的调用失败. 1.pom.xml(引入hystrix-core包) 1 < ...

随机推荐

  1. JeeSite中Excel导入导出

    在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel.CSV格式居多.如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好.近期一直使用 ...

  2. java中split分割"."的问题

    今天使用split分割"."的时候居然失败了,经过百度发现原来要加转义字符才行. 正确的写法: String test="1.2.3"; String[] s1 ...

  3. JDK AtomicInteger 源码分析

    @(JDK)[AtomicInteger] JDK AtomicInteger 源码分析 Unsafe 实例化 Unsafe在创建实例的时候,不能仅仅通过new Unsafe()或者Unsafe.ge ...

  4. Java并发-对象共享

    我们不仅希望防止某个线程正在使用对象状态而其他的线程正在修改该状态,而且希望当一个线程修改了对象状态后,其他的线程能够看到发生的状态变化. 可见性:当读操作和写操作在不同的线程中进行时,他们的动作是共 ...

  5. Coursera-AndrewNg(吴恩达)机器学习笔记——第一周

    一.初识机器学习 何为机器学习?A computer program is said to learn from experience E with respect to some task T an ...

  6. maxSubArray

    Description: Find the contiguous subarray within an array (containing at least one number) which has ...

  7. CSS的浮动和定位

    一.CSS中的浮动 1.定义和用法 float 属性定义元素在哪个方向浮动.在 CSS 中,任何元素都可以浮动.浮动会使原元素变成一个行级元素,而不论它本身是何种元素.如果浮动非替换元素,则要指定一个 ...

  8. 微信授权、获取用户openid-纯前端实现——jsonp跨域访问返回json数据会报错的纯前端解决办法

    近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活. 首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url https ...

  9. mysql导入数据中文乱码_ubuntu

    1.在ubuntu中mysql的部分编码格式不是utf-8,故在导文件的时候会出现中文乱码,Windows中编码格式为gbk,因此要修改mysql的编码方式为utf-8. 2.查看MySQL编码格式: ...

  10. 接口调用(发送http请求)

    // 向对应的url地址发送http请求, 并获取响应的json字符串    public String getHttpResponse(String url) {        // result用 ...