使用继承的方式来创建Hystrix 命令,不是用注解的方式来使用 Hystrix

  • 创建 HelloGetCommand 对象,继承与 HystrixCommand 并实现 run 方法,示例如下:

    public class HelloGetCommand extends HystrixCommand<String> {

    private RestTemplate restTemplate;

    public
    HelloGetCommand(Setter setter, RestTemplate restTemplate) {

    super(setter);

    this.restTemplate= restTemplate;

    }

    @Override

    protected String run() throws Exception {

    ResponseEntity<String> responseEntity=

    restTemplate(getForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/get", String.class);

    return responseEntity.getBody();

    }

    @Override

    protected String getFallback() {

    return
    "error id=" + id + "\tname=" + name;

    }

    }

  • 或者创建 HelloGetObserveableCommand 对象,继承于 HystrixObservableCommand 对象,并实现 construct 方法,如果希望是异步订阅,则在
    new Observable.OnSubscribe<String>()
    创建实例后,调用 subscribeOn 方法来设置,示例如下:

    public class HelloGetObservableCommand extends HystrixObservableCommand<String> {

    private RestTemplate restTemplate;

    public
    HelloGetCommand(Setter setter, RestTemplate restTemplate) {

    super(setter);

    this.restTemplate= restTemplate;

    }

    @Override

    protected Observable<String> construct() {

    return Observable.create(new Observable.OnSubscribe<String>() {

    @Override

    public
    void
    call(Subscriber<? super String> subscriber) {

    try {

    if (subscriber.isUnsubscribed() == false) {

    ResponseEntity<String> responseEntity=

    restTemplate.getForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/get",

    String.class);

    subscriber.onNext(responseEntity.getBody(););

    subscriber.onCompleted();

    }

    } catch (Exception ex) {

    subscriber.onError(ex);

    }

    }

    });

    }

    @Override

    protected Observable<String> resumeWithFallback() {

    return Observable.create(new Observable.OnSubscribe<String>() {

    @Override

    public
    void
    call(Subscriber<? super String> subscriber) {

    subscriber.onNext("error id=" + id + "\tname=" + name);

    subscriber.onCompleted();

    }

    });

    }

    }

  • HystrixCommand 对象实现了两种执行方法,包含了同步执行和异步执行,如下:
    • exeucte():同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常,如果重写了 getFallback 方法,则会调用该方法,execute() 其实是 queue().get() 调用,只有 HystrixCommand 支持
    • queue():异步执行,直接返回一个 Future 对象,其中包含了服务执行结束时要返回的单一结果对象,实际上是通过 toObservable() 来获取一个 Observable 对象,并通过 toBlocking() 转换为 BlockingObservable 对象,把数据以阻塞的方式反射出来,然后调用 toFuture 方法返回一个 Future,并不会阻塞,这使得消费者可以自己决定如何处理异步操作,只有 HystrixCommand 支持
  • HystrixObservableCommand对象实现了两种执行方法,如下:
    • observer():返回 Observable 对象,他能操作多个结果,本质上 toObservable().subscribe(subject),可以有多个 subscriber,这个方法内部会立即订阅底层 Observable
    • toObservable(): 返回 Observable 对象,他能操作多个结果,只能有一个 subscriber,这个方法内部不会订阅底层的 Observable,即除非你去订阅返回的 Observable,否则命令逻辑不会执行
  • 实例化 HelloGetCommand 对象,需要创建 HystrixCommand.Setter 对象,而实例化 HelloGetObservableCommand 对象,需要创建 HystrixObservableCommand.Setter 对象,在创建对象时需要创建 HystrixCommandGroupKey 对象,用于指定命令组Key,通过使用相同命令组 Key,来统一组命令的报表、告警、仪表盘或组/库的所有权和线程池(没有单独指定);在创建对象时需要创建 HystrixThreadPoolKey 对象,用于指定来表示一个 HystrixThreadPool,以实现监控、监控指标上报、缓存和其他用途中线程池的区分。一个 HystrixCommand 与一个通过 HystrixThreadPoolKey 获得的线程池相关联,该线程池会被注入到这个命令中。如果没有指定线程池 Key,命令则默认会和一个通过 HystrixCommandGroupKey 创建的线程池相关联,示例代码如下:

    HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Hello"))

    .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("Hello"))

    // HystrixObservableCommand.Setter 没有 andThreadPoolKey 方法,不能设置线程池的Key

    HystrixObservableCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloObservable"))

  • 设置 CommandProperties 属性和 ThreadPoolProperties 属性,示例代码如下:

    setter .andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000))

    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withMaximumSize(10));

    // HystrixObservableCommand.Setter 没有线程属性设置

    observableSetter.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(3000));

  • execute() 方法调用示例代码如下:

    new
    HelloGetCommand(setter, restTemplate).execute();

  • queue() 方法调用示例代码如下:

    Future<String> future = new
    HelloGetCommand(setter,restTemplate).queue();

    future.get();

  • observer()方法调用示例(可以增加多个订阅)代码如下:

    Observable<String> observable = hystrixObservableCommand.observe();

StringBuilder stringBuilder = new
StringBuilder();

observable.subscribe(s -> System.out.println("action1 s=" + s));

observable.subscribe(new Observer<String>() {

@Override

public
void
onCompleted() {

System.out.println("onCompleted");

}

@Override

public
void
onError(Throwable e) {

e.printStackTrace();

}

@Override

public
void
onNext(String s) {

System.out.println("onNext Thread " + Thread.currentThread().getId());

System.out.println("onNext value=" + s);

stringBuilder.append(s);

}

});

return stringBuilder.toString();

  • toObservable()方法调用(只能有一个订阅)示例如下:

    Observable<String> observable = hystrixObservableCommand.toObservable();

StringBuilder stringBuilder = new
StringBuilder();

observable.subscribe(new Observer<String>() {

@Override

public
void
onCompleted() {

System.out.println("onCompleted");

}

@Override

public
void
onError(Throwable e) {

e.printStackTrace();

}

@Override

public
void
onNext(String s) {

System.out.println("onNext Thread " + Thread.currentThread().getId());

System.out.println("onNext value=" + s);

stringBuilder.append(s);

}

});

return stringBuilder.toString();

笔记:Spring Cloud Hystrix 封装命令的更多相关文章

  1. 笔记:Spring Cloud Hystrix 异常处理、缓存和请求合并

    异常处理 在 HystrixCommand 实现的run方法中抛出异常,除了 HystrixBadRequestException之外,其他异常均会被Hystrix 认为命令执行失败并触发服务降级处理 ...

  2. 笔记:Spring Cloud Hystrix 服务容错保护

    由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加 ...

  3. Spring Cloud 微服务笔记(六)Spring Cloud Hystrix

    Spring Cloud Hystrix Hystrix是一个延迟和容错库,旨在隔离远程系统.服务和第三方库,阻止链接故障,在复杂的分布式系统中实现恢复能力. 一.快速入门 1)依赖: <dep ...

  4. 第五章 服务容错保护:Spring Cloud Hystrix

    在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...

  5. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群

    前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...

  6. Spring Cloud学习 之 Spring Cloud Hystrix(基础知识铺垫)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 前述: 快速入门: 命令模式: RxJava: 前述: ​ 在微服务架构中, ...

  7. Spring Cloud Hystrix

    接上篇: Spring Cloud Eureka 使用命令开启两个服务提供者 java -jar .\hello--SNAPSHOT.jar --server.port= java -jar .\he ...

  8. 容错保护机制:Spring Cloud Hystrix

    最近在学习Spring Cloud的知识,现将容错保护机制Spring Cloud Hystrix 的相关知识笔记整理如下.[采用 oneNote格式排版]

  9. 试水Spring Cloud Hystrix

    Spring Cloud Hystrix是一个容错库,它实现了断路器模式,使得当服务发生异常时,会自动切断连接,并将请求引导至预设的回调方法. 服务端 在Spring Tool Suite的文件菜单中 ...

随机推荐

  1. Android开发Toast Notifications

    Android开发Toast Notifications 关键类 Toast toast通知是一种在窗口表面弹出的消息.它只占用信息显示所需的空间,用户当前的activity仍保持可见并可交互.该通知 ...

  2. ORACLE中修改表的Schema的总结

    前阵子遇到一个案例,需要将数据库中的几个表从USER A 移动到USER B下面,在ORACLE中,这个叫做更改表的所有者或者修改表的Schema.其实遇到这种案例,有好几种解决方法.下面我们通过实验 ...

  3. 5.1 TLP的格式

    当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去.TLP的基本格式如图5?1所示. 一个完整的TLP ...

  4. 决策树之ID3、C4.5、C5.0等五大算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- C5.0决策树之ID3.C4.5.C5.0算法 ...

  5. Java获取某年某月的第一天

    Java获取某年某月的第一天 1.设计源码 FisrtDayOfMonth.java: /** * @Title:FisrtDayOfMonth.java * @Package:com.you.fre ...

  6. Tomcat中的Context.xml的<Loader delegate="true"/>

    Tomcat中的Context.xml的<Loader delegate="true"/> 1.<Loader delegate="true" ...

  7. javaWeb学习之页面js树

    常用方法add(parameters):添加节点信息 Index Name Type Discription 1 id Number 当前节点的ID 2 preId Number 当前节点的父节点ID ...

  8. .Net Core 1.0升级2.0(xproj项目迁移到.csproj )

    vs2015的创建的项目是以*.xproj的项目文件,迁移到vs2017需要如下准备: 1.安装好vs2017(废话) 2.下载最新的SDK和 .NET Core 2.0 Preview 1 Runt ...

  9. Web开发工具——Jupyter notebook

    jupyter-notebook 安装及远程访问 Introduction Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程 ...

  10. 彻底禁用Chrome的“请停用以开发者模式运行的扩展程序”提示

    前言 作为一个前端程序员,难免会有一些专属自己的小扩展,没必要每一个都发到Chrome应用商店去,虽然可以勾选"开发者模式"来运行本地插件,但是每次启动都会有一个烦人的" ...