使用继承的方式来创建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. Unity引擎与C#脚本简介

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 由 QQ会员技术团队 发布在云+社区 1. Unity编辑器基础 从原理上讲,游戏开发就是将一系列变动的场景呈现在玩家面前,并根据玩家的输入 ...

  2. find命令 参数

    记一下我遇到过的: 中 !表示否定 -a 表示并且 -o  或者   perm注意权限模式,有无 -,单表含义不同,有-是表示属主.组.其他组权限对应(即某位为0时,表示不指定要匹配的权限,而不是没有 ...

  3. WIN7下PS/2等键盘失灵无法使用的解决办法

    WIN7下PS/2等键盘失灵无法使用的解决办法 装了win7,无意中一天开机,发现键盘不能用了.开始以为键盘坏了,重启看机,一看能进bios,各键正常.然后再重启,进系统,看设备管理器,发现键盘为黄色 ...

  4. Netty的并发编程实践5:不要依赖线程优先级

    当有多个线程同时运行的时候,由线程调度器来决定哪些线程运行.哪些等待以及线程切换的时间点,由于各个操作系统的线程调度器实现大相径庭,因此,依赖JDK自带的线程优先级来设置线程优先级策略的方法是错误和非 ...

  5. 加深try catch Finnly的理解

    上代码 public String twoGetFeeInfoByWithUnit(JSONArray jsonArray,String key1,String key2){ String Debit ...

  6. VBA Excel WideCharToMultiByte Compile error on 64-bit System

    Compile Error: The code in this project must be updated for use on64-bit systems. Please review and ...

  7. SpringMVC源码情操陶冶-RequestMappingHandlerAdapter适配器

    承接前文SpringMVC源码情操陶冶-HandlerAdapter适配器简析.RequestMappingHandlerAdapter适配器组件是专门处理RequestMappingHandlerM ...

  8. Rolling Update - 每天5分钟玩转 Docker 容器技术(140)

    滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用,初始镜 ...

  9. 【BZOJ3670】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  10. [HDU5765]Bonds

    题面 题意 给出一张\(n\)点\(m\)边无向连通图,求每条边出现在多少个割集中. \(n\le20,m\le\frac{n(n-1)}{2}\) sol 所谓割集,就是指把\(n\)个点分成两个集 ...