【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在,所以人们亲手捏出了泥菩萨,却选择坚定的去信仰它。

  • 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使用的。而相关的技术,Hystrix本身早已算不上什么新技术,但它却是最经典的技术体系!。

  • Hystrix以实现熔断降级的设计,从而提高了系统的可用性。

  • Hystrix是一个在调用端上,实现断路器模式,以及隔舱模式,通过避免级联故障,提高系统容错能力,从而实现高可用设计的一个Java服务组件库。

  • *Hystrix实现了资源隔离机制

  • 介绍Hystrix的基本使用方式和基本配置

  • *使用Hystrix实现基本的熔断设计,以保护应用的安全,实现初步的高可用设计。

  • Hystrix的主要目的是保护跨进程调用,避免因为超时等问题,导致的级联故障。

  • *Hystrix的实现方法是封装跨进程调用。具体的使用方式有多种:从编程方式看可分为编程方式和注解方式两种;从调用方式看可分为同步调用方式、异步调用方式和反应式调用方式三种。

我们先来看最常见的同步编程方式:

代码示例


public class AuthService {

  private UserService userService;

  public boolean validateUser(String userId) {
    User user = new GetUserCommand(userId).execute();
    if (user == null) {
      return false;
    } else {
      return user.isValid();
    }
  }

class GetUserCommand extends HystrixCommand {
    private Long userId;
    public GetUserCommand(Long userId) {
      super(Setter.withGroupKey(HystrixCommandGroupKey.

      Factory.asKey("UserService"))
          .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
              .withCoreSize(20)
          )
          .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
              .withExecutionTimeoutInMilliseconds(100)
          )
      );
      this.userId = userId;
    }

    public User run() throws Exception {
      return userService.getUserById(userId);
    }

    public User getFallback() {
      return new InvalidUser();
    }
  }
}
复制代码

代码解释

  • Hystrix常见的使用方法是在一个业务处理类(在本例中是AuthService)新建一个内部类(本例中是GetUserCommand)
  • 这个内部类需要扩展HystrixCommand。之所以使用内部类是因为Hystrix通常用来封装一次远程调用,一般直接调用一个业务方法
    • 这个业务方法通常位于一个业务处理类或这个业务处理类所依赖的类中。而使用内部类的方式可以简化这种调用。
  • 扩展HystrixCommand还需声明一个泛型类型,这个泛型类型表示这个HystrixCommand的执行方法(run、construct等)的返回值。
  • 定义一个HystrixCommand还需定义一个构造函数。这个构造函数十分重要,因为在使用这个 HystrixCommand 时,需要通过构造函数传递参数。 构造函数中,需要调用父构造函数对当前的HystrixCommand进行配置。主要的配置主要有三个: GroupKeyThreadPoolSizeTimeout。 具体的配置方式有多种,较常用的一种方式是通过一个名为Setter的Builder类进行配置。
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("UserService"))
复制代码
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(20))
复制代码
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(100)
复制代码
  • 通过实现run()方法,在其中实现业务逻辑。通常是调用外部类的方法或外部类依赖的方法。通过实现getFallback()方法,实现失败逻辑,可以在其中实现降级等功能。
  • *编写完GetUserCommand之后,使用的时候每次都需要new一个新对象,再调用execute()方法。注意,不要调用run()方法,否则熔断、隔离等功能是不生效的。

基本配置

上面的部分介绍了HystrixCommand的基本使用方法,但只是简单介绍了几个配置。所以,下面将对 HystrixCommand的相关配置的作用做一个较为详细的介绍。

Hystrix的配置有三个维度: 全局默认配置、Instance默认配置、Instance动态配置。除了少部分配置项外,大部分配置都支持动态修改。

接下来介绍一下一些主要参数的Instance默认配置方式。这种配置方式也是使用Hystrix最先接触到的配置方式。

GroupKey是HystrixCommand不可缺少的配置,其它配置均为可选。所以,使用Hystrix可以使用下面的代码:

public class CommandHelloWorld extends HystrixCommand {
  private final String name;

  public CommandHelloWorld(String name) {
    super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
    this.name = name;
  }

  protected String run() {
    return "Hello " + name + "!";
  }
}
复制代码

HystrixCommandGroupKey是一个接口,除了可以HystrixCommandGroupKey.Factory.asKey(“ExampleGroup”) 的方式定义以外,也可以直接实现这个接口。比如使用如下的方式:


public enum Groups implements HystrixCommandGroupKey {
  GROUP_1
}

class EnumGroupCommand extends HystrixCommand {

  EnumGroupCommand() {
    super(Groups.GROUP_1);
  }

  protected String run() throws Exception {
    LOGGER.info("Thread of Command: {}", Thread.currentThread().getName());
    return null;
  }
}
复制代码

如上面代码这样,使用自定义的枚举类,实现HystrixCommandGroupKey接口,可以统一Hystrix Command Group的定义,简化配置。

HystrixCommandGroupKey的作用主要有两个:

  • 一是起到分组监控、报警的作用。后面的文章会对监控等方面进行介绍;
  • *二是在不配置HystrixThreadPoolKey的情况下,起到分组线程池的作用。默认使用HystrixCommandGroupKey去命名线程池,使用同一个HystrixCommandGroupKey且没有自定义HystrixThreadPoolKey的HystrixCommand将使用同一个线程池

虽然HystrixCommandGroupKey可以起到隔离线程池的作用,但是无法起到对线程池进行精细配置的作用。

所以这里就需要线程池进行配置:

Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyService"))
    .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("MyThreadPool"))
    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
        .withCoreSize(10)
        .withKeepAliveTimeMinutes(1)
        .withMaxQueueSize(-1)
    )
)
复制代码

andThreadPoolPropertiesDefaults配置中的数值表示的是默认值。

接下来逐项介绍:

  • andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(“MyThreadPool”)) 这是配置 ThreadPoolKey如果需要在同一个GroupKey下面配置不同的ThreadPool就需要这个配置。
  • withCoreSize(10) 用来配置线程池大小。Hystrix对线程池的配置有一些限制,这里只能配置线程数的Core Size,不能配置Max Size。不配置的话使用的默认值是10
  • withKeepAliveTimeMinutes(1) 用来配置核心线程数空闲时keep alive的时长,默认1 mins。这项配置一般不需要修改
  • withMaxQueueSize(-1) 用来配置线程池任务队列的大小,默认值为 -1
    • 当使用-1 时,SynchronousQueue将被使用,即意味着其实这个队列只是一个交换器,任务将被直接交给工作线程处理。如果工作线程不足,那任务将被拒绝; *如果使用任何正整数,LinkedBlockingQueue将被使用。

命令执行直接相关的配置,包括隔离策略、超时时间、Fallback相关配置。

接下来介绍几个主要的配置:

默认的隔离策略是实现线程池隔离,另外一种隔离策略是Semaphore。Instance默认配置可使用如下方法设置:

HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
复制代码

这项配置通常不用配置

默认时间是1000ms,单位是毫秒

Instance默认配置可以使用如下方法设置

.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(100))
复制代码

这项配置比较重要,后文还会详细介绍如何调配这个参数。

在Instance默认配置中是通过如下代码设置的:

super(Setter.withGroupKey(BASIC_USAGE_GROUP)
    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
        .withFallbackIsolationSemaphoreMaxConcurrentRequests(10)
    )
);
复制代码
  • 默认值为 10。因为 getFallback()方法是和run()方法使用同一个线程池执行的,并发过高会影响主逻辑的执行,所有需要控制并发量。
  • *如果getFallback()执行速度很快,那不用修改此值。如果getFallback()中执行一个较为耗时的操作,那就需要考虑修改此值。

分享资源

资源分享
获取以上资源请访问开源项目 点击跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云平台注册及基础使用

首先进入阿里云官网: 阿里云-计算,为了无法计算的价值 点击右上角“登录/注册”,如果没有阿里云账号则需要注册。 注册界面: 注册完成后需要开通物联网平台公共实例: 注册成功后的登录: 同样点击右上角的…

Self-Attention、transformer代码、word2vec理论(skip-gram、CNOW)、近似训练 (第十三次组会)

@[TOC](Self-Attention、transformer代码、word2vec理论(skip-gram、CNOW)、近似训练 (第十三次组会)) Self-Attention相关 Transformer代码

vue2 todoapp案例(静态)

1.创建三个子组件(TodoHeader、TodoMain、TodoFooter)和两个(index.css、base.css)样式&#xff1b; TodoHeader页面 <template><header class"header"><h1>todos</h1><input id"toggle-all" class"toggle-all" typ…

使用gpt对对话数据进行扩增,对话数据扩增,数据增强

我们知道一个问题可以使用很多方式问&#xff0c;但都可以使用完全一样的回答&#xff0c;基于这个思路&#xff0c;我们可以很快的扩增我们的数据集。思路就是使用chatgpt或者gpt4生成类似问题&#xff0c;如下&#xff1a; 然后我们可以工程化这个过程&#xff0c;从而快速扩…

IP核之fifo

一.FIFO简介 FIFO (First In First Out&#xff0c;即先入先出&#xff09;&#xff0c;是一种数据缓冲器&#xff0c;用来实现数据先入先出的读写方式。 二&#xff0c;FIFO实现原理 FIFO是采用一种先入先出的实现原理 就如图按照D1到D10的顺序输入那么读取的时候也是按照D…

Python(七十二)集合的相关操作(增删改查)

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版

FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版是一个完整的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;。它代表了 25 多年的创新发展&#xff0c;将您创作、编曲、录…

Framework才是Android 开发的热门技术~

相信大家都有感觉到今年的市场竞争的激烈&#xff0c;投出简历并不像往年一样立马就有回应&#xff0c;大多是这种情况&#xff1a;投出简历没有停歇&#xff0c;状态却是70%未读&#xff0c;30%已读。 这种情况并不是说市场落寞了&#xff0c;不招人了&#xff0c;而是经过了…

【Datawhale AI 夏令营第二期】AI 量化模型预测挑战赛

文章目录 赛题分析赛题背景赛事任务赛题数据集评价指标 Baseline实践导入模块EDA特征工程模型训练与验证结果输出 改进 赛题分析 赛题背景 量化金融在国外已经有数十年的历程&#xff0c;而在国内兴起还不到十年。这是一个极具挑战的领域。量化金融结合了数理统计、金融理论、…

Spring Boot如何整合mybatisplus

文章目录 1. 相关配置和代码2. 整合原理2.1 spring boot自动配置2.2 MybatisPlusAutoConfiguration2.3 debug流程2.3.1 MapperScannerRegistrar2.3.2MapperScannerConfigurer2.3.3 创建MybatisPlusAutoConfiguration2.3.4 创建sqlSessionFactory2.3.5 创建SqlSessionTemplate2.…

springboot 集成 mybatis-plus 代码生成器

springboot 集成 mybatis-plus 代码生成器 一、导入坐标依赖二、配置快速代码生成器三、自定义代码生成器模板 一、导入坐标依赖 前置依赖&#xff0c;需要用到 mybatis,mysql驱动,lombok插件以及swapper.(因为后面接口测试文档&#xff0c;所以swapper也配了) <dependenc…

redis原理 5:同舟共济 —— 事务

为了确保连续多个操作的原子性&#xff0c;一个成熟的数据库通常都会有事务支持&#xff0c;Redis 也不例外。Redis 的事务使用非常简单&#xff0c;不同于关系数据库&#xff0c;我们无须理解那么多复杂的事务模型&#xff0c;就可以直接使用。不过也正是因为这种简单性&#…

Java实现Google cloud storage 文件上传,Google oss

storage 控制台位置 创建一个bucket 点进bucket里面&#xff0c;权限配置里&#xff0c;公开访问&#xff0c;在互联网上公开&#xff0c;需要配置角色权限 新增一个访问权限 &#xff0c;账号这里可以模糊搜索&#xff0c; 角色配置 给allUser配置俩角色就可以出现 在互联…

【GPT-3 】创建AI博客写作工具

一、说明 如何使用OpenAI API&#xff0c;GPT-3和Python创建AI博客写作工具。 在本教程中&#xff0c;我们将从 OpenAI API 中断的地方继续&#xff0c;并创建我们自己的 AI 版权工具&#xff0c;我们可以使用它使用 GPT-3 人工智能 &#xff08;AI&#xff09; API 创建独特的…

Crond和sudo

目录 前言 一、Crond &#xff08;一&#xff09;、一次性任务 &#xff08;二&#xff09;、周期性任务 1./etc/crontab中加入 2.使用crontab命令编辑计划任务 二、sudo 1.sudo概念 2.sudo提权 总结 前言 crond是linux下用来周期性的执行某种任务或等待处理某些事件的…

今天小编继续给大家分享五款高效的电脑宝藏软件

目录 1、keytweak 2、ScreenToGif 3、Greenshot截屏工具 4、GIMP 5、HandBrake 1、keytweak keytweak 简单来说就是一个键盘按键修改器&#xff0c;说白了就是一个键盘按键重映射的软件。比如你键盘上的Q不好用了&#xff0c;你可以更换成一个不常见的按键来代替Q键&#x…

STM32 CubeMX USB_(HID 鼠标和键盘)

STM32 CubeMX STM32 CubeMX USB_HID&#xff08;HID 鼠标和键盘&#xff09; STM32 CubeMX前言 《鼠标》一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码鼠标发送给PC的数据解析实验效果 《键盘》STM32 CubeMX 设置&#xff08;同上&#xff09;代码…

探索PostgreSQL的新功能:最新版本更新解析

PostgreSQL作为一种强大而开源的关系型数据库管理系统&#xff0c;不断在不断进化和改进。每一次的版本更新都带来了更多功能和改进&#xff0c;让用户在处理大规模数据和复杂查询时体验更好的性能和功能。在本文中&#xff0c;我们将深入探索PostgreSQL的最新版本更新&#xf…

系统架构设计高级技能 · 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…