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

news2024/11/27 21:08:18

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

  • 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使用的。而相关的技术,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()中执行一个较为耗时的操作,那就需要考虑修改此值。

分享资源

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wordpress日主题Ripro9.0最新二开修正源码下载+美化包和插件

日主题Ripro9.0最新二开升级修正源码美化包和插件,RiPro9.0的二开版本新模板,包含2个美化包和全屏水印以及防复制插件。 模板和美化包路径:\wp-content\themes 插件路径:\wp-content\plugins,有兴趣的自行去体验吧

AOP-AspectJ 切面技术及使用MethodInterceptor实现切面

目录 一、简介 二、什么是AspectJ AOP 思想概述 AOP 实现方式 AOP 特性概念 切点指示器 通知类型 三、实现AOP的方式 四、配置说明 自定义注解作为切点 NeedCut MyAop GirlController 继承MethodInterceptor实现切面 MyMethodInterceptor AopConfig NeedCut 注解…

如何将安卓 Gradle 模块打包发布到本地 Maven 仓库

文章目录 具体流程 笔者的运行环境: Android Studio Flamingo | 2022.2.1 Android SDK 33 Gradle 8.0.1 JDK 17 Android 的 Gradle 项目与一般的 Gradle 项目是不同的,因此对将 Gradle 模块打包发布到本地 Maven 仓库来说,对普通 Gradle …

Python 模块 locust 性能测试

简介 locust 是 Python 的一个开源的负载测试工具,用于测试网络应用程序的性能和可伸缩性。它使用Python编写,并提供了一个简单易用的语法来定义和执行负载测试。locust模块允许用户模拟大量并发用户并观察系统在高负载下的响应情况。 目录 1. 基本用法…

vue中transition动画的使用

1.vue文件 说明&#xff1a;加name属性 <transition name"sort"><div class"sort" v-show"show"><div class"all-sort-list2" click"goSearch"><div class"item bo" v-for"(item1, in…

图像膨胀+滤波达到边缘外扩模糊效果

有一个扯淡需求, 根据某些格网值渲染对应的颜色, 我们做的实现方案是按照色代码渐变做颜色映射, 但是某些厂家不顾结果正确性与否, 应是为了好看做的好看, 将边界膨胀模糊, 一个非风场,力场类似场数据做了一个类似场的渲染效果, 也不知道说啥好, 例如原始图渲染如下 经过一系列…

初识http协议,简单实现浏览器和服务器通信

文章目录 认识urlhttp协议格式通信代码验证细节Util.hppprotocol.hppServer.hppServer.cc 结果分析 认识url 平时俗称的 “网址” 其实就是说的 URL&#xff0c;例如在百度上搜索一个C 可以看到这段网址前面有个 https 那么这个就代表着使用的是https协议&#xff0c;现在都是…

0807hw

1. 2. (1)a100,b10; a10,b100;//值传递 (2)*a100,*b10; a100,b10;//地址传递 (3)*a100,*b10; a10,b100;

深入探索 Splashtop Enterprise 的潜力

在当今高度技术化的环境中&#xff0c;远程访问解决方案已成为无数组织的支柱。远程访问解决方案缩短了员工与工作之间的地理差距&#xff0c;提高了工作的效率和灵活性&#xff0c;促进形成了无缝的工作体验。在众多远程访问解决方案中&#xff0c;Splashtop Enterprise 作为远…

FFmpeg中AVIOContext的使用

通过FFmpeg对视频进行编解码时&#xff0c;如果输入文件存在本机或通过USB摄像头、笔记本内置摄像头获取数据时&#xff0c;可通过avformat_open_input接口中的第二个参数直接指定即可。但如果待处理的视频数据存在于内存块中时&#xff0c;该如何指定&#xff0c;可通过FFmpeg…

Linux初识网络基础

目录 网络发展 认识“协议 ” 网络协议 OSI七层模型&#xff1a; TCP/IP五层&#xff08;或四层&#xff09;模型 网络传输基本流程 网络传输流程图&#xff1a; 数据包封装和封用 网络中的地址 认识IP地址&#xff1a; 认识MAC地址&#xff1a; 网络发展 1.独立…

JAVA实用工具: 改良版雪花算法-分布式唯一ID神器

Seata内置了一个分布式UUID生成器,用于辅助生成全局事务ID和分支事务ID。具体如下特点: 高性能全局唯一趋势递增这个分布式UUID生成器是基于雪花算法进行改良的,本文针对改良的方法、目的等进行总结 改良点 改良版雪花算法的实现原理参考如下: Seata基于改良版雪花算法的…

redis安装(Windows+Linux)

redis安装 文章目录 redis安装一. windows下安装二.Linux环境下安装 一. windows下安装 下载地址(github): https://github.com/tporadowski/redis/releases (强烈推荐) https://github.com/MicrosoftArchive/redis/releases 选择安装包 下载完成后根据提示进行安装即可(这…

电源控制--品质因素Q值全解

什么是品质因素Q值&#xff1f; 在电源控制中&#xff0c;品质因素 Q 值通常用于描述电源滤波器的性能。电源滤波器用于减小电源中的噪声和干扰&#xff0c;以提供干净稳定的电源供应给电子设备。 品质因素 Q 值在电源滤波器中表示滤波器的带宽和中心频率之比&#xff0c;用于…

VS Code无法跳转,搜索也搜不到

1. 公司安装的加密软件&#xff0c;天锐绿盾&#xff08;绿盾&#xff09;导致VS Code无法使用 如果的绿盾的策略里面没有VS Code的话&#xff0c;就会导致VScode 无法使用&#xff0c;其它软件也是一样&#xff0c;出问题极有可能就是绿盾拦截了&#xff0c;像我的电脑使用wi…

springboot 集成 mybatis-plus 代码生成器

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

Python编程从入门到实践练习第七章:input输入和while循环

目录 一、input输入函数实例 二、while循环2.1 while结构练习题 2.2 使用while循环处理列表和字典2.2.1 在列表之间移动元素2.2.2 删除为特定值的多个列表元素2.2.3 使用用户输入来填充字典练习题 一、input输入函数 input( ) 方法&#xff1a;获取用户的输入信息&#xff0c;使…

【2.2】Java微服务:nacos的使用

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 深度学习 ✨特色专栏&#xff1a; 知识分享 &…

排序八卦炉之归并、计数

文章目录 1.归并排序1.1初识代码1.2代码分析1.3复杂度1.4非递归版本1.01.初识代码2.代码分析 1.5非递归版本2.01.初识代码2.代码分析 2.计数排序2.1初始代码2.2代码分析 1.归并排序 1.1初识代码 //归并排序 时间复杂度&#xff1a;O(N*logN) 空间复杂度&#xff1a;O(N) vo…

Kaggle First Place Winner Solution Study——多变量回归问题

本期分享一个Kaggle上playground系列多变量回归问题的第一名解决方案。试着分析、复现、学习一下金牌选手的数据分析思路。 赛题链接&#xff1a; Prediction of Wild Blueberry Yield | Kagglehttps://www.kaggle.com/competitions/playground-series-s3e14第一名解决方案链…