使用继承的方式来创建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. 暴力破解MD5的实现(MapReduce编程)

    本文主要介绍MapReduce编程模型的原理和基于Hadoop的MD5暴力破解思路. 一.MapReduce的基本原理 Hadoop作为一个分布式架构的实现方案,它的核心思想包括以下几个方面:HDFS ...

  2. centos下利用qemu搭建arm模拟器

    有点繁琐,整理一下,系统环境centos6.6,虚拟机以及实际系统中测试通过. 一.交叉编译器的下载与安装1.下载地址:http://blog.csdn.net/dldw8816/article/de ...

  3. Flex中的FusionCharts 3D柱形图

    1.3D柱形图源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:f ...

  4. TypeError: Error #1006: value 不是函数。

    1.错误原因 TypeError: Error #1006: value 不是函数. at BasicChart/dataFunc()[E:\Flash Builder\Map\src\BasicCh ...

  5. Matlab和C语言混合编程,包含目录的设定

    如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...

  6. 两个map一个reduce(两个输入文件)

    两个map,一个map读取一个hdfs文件,map完之后进入一个reduce进行逻辑处理. package com.zhongxin.mr; import org.apache.commons.lan ...

  7. JAVA中String类的方法(函数)总结--JAVA基础

    1.concat()方法,当参数为两字符串时,可实现字符串的连接: package cn.nxl123.www; public class Test { public static void main ...

  8. RobotFramework自动化测试框架-DatabaseLibrary库的使用(对数据库的操作)

    在自动化过程中,我们经常需要连接不同的数据库,并且对数据库进行很多不同的操作,RobotFramework中,提供了DatabaseLibrary这个库来操作数据库,我们可以按照官网中的说明来安装Da ...

  9. mysql5.7安装教程

    1, 下载mysql5.7的安装包mysql-5.7.17-winx64.zip,直接解压到安装目录 2, 进入mysql目录,在里面新建data目录 3, 修改mysql的my.ini文件,指定ba ...

  10. ThreadPoolExecutor源码分析

    ThreadPoolExecutor是Java自带线程池FixedThreadPool(固定大小). SingleThreadExecutor(单线程).CacheThreadPool (无限大)的具 ...