首页 > 其他分享 >【Hystrix技术指南】(1)基本使用和配置说明

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

时间:2023-08-08 11:57:26浏览次数:45  
标签:指南 Hystrix HystrixCommandGroupKey 配置 线程 HystrixCommand Setter

推荐超值课程:点击获取

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

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

分享资源

资源分享
扫码关注发送:资源 获取以上资源
字节技术

标签:指南,Hystrix,HystrixCommandGroupKey,配置,线程,HystrixCommand,Setter
From: https://www.cnblogs.com/3shu/p/17613778.html

相关文章

  • RocketMQ Linux单机测试:简易快速部署指南及Dashboard控制台部署
    目录简介开始下载增加环境变量修改启动文件jvm大小修改rocketmq配置文件启动快速测试关闭Dashboard下载Dashboard已编译jar包网盘下载启动命令可能遇到的问题写在最后简介请注意,本博客仅供初期测试时快速部署之用,以节省时间避免不必要的问题。如需在生产环境部署,请参考其他可靠......
  • 百度ueditor富文本--配置图片上传
    我们在之前的文章中已经学习了如何初始化百度ueditor富文本编辑器:百度ueditor富文本--PC端单个,PC端多个,mobile单个,mobile多个官网对编辑器的初始化和使用文档是比较详细的,这里就不多说了。本小节主要记录一下在初始化完编辑器之后 配置启用编辑器中的图片上传插件。项目路......
  • 2023-8-8新版本数据录入指南
    人工费对应明细列入材料费对应明细列入机械费对应明细列入专业分包费用对应明细列入措施费对应明细列入间接费对应明细列入(注意其他费用不用录入这里)其他费用录入规费税金录入税金(不用录取税率)将税额填入基本信息如果含税金额差异不大(小数点后的区别)就完成了......
  • nuxt3如何配置语言包切换
    记录nuxt-i18n 配置:安装#npmnpminstall@nuxtjs/i18n#yarnyarnadd@nuxtjs/i18n#pnpmpnpmadd@nuxtjs/i18n 设置//nuxt.config.js根据后端接口返回的字段值 新建语言包文件  用common.lang作为测试,继续配置   页面切换 到此配置......
  • Django博客开发教程:基础配置
    创建项目之后,我们需要对项目进行最基础的配置。这些配置是我们做项目的时候必须要配置的,所以我们先提前配置好。我们打开myblog目录下的settings.py文件。一、设置域名访问权限myblog/settings.pyALLOWED_HOSTS = []      #修改前ALLOWED_HOSTS = ['*']   #修改......
  • centos安装php php-fpm 以及 配置nginx
    下载php源码包http://www.php.net/downloads.php安装phptar-xvfphp-5.5.13.tar.bz2cdphp-5.5.13./configure--prefix=/usr/local/php--with-config-file-path=/etc--enable-inline-optimization--disable-debug--disable-rpath--enable-shared--enable-opcache--......
  • ERROR:'ipconfig'不是内部或外部命令,也不是可运行的程序 && 解决配置环境变量时只显示
     解决方法: 输入cdc:\windows\system32进入该路径后输入ipconfig,即可得出ip地址。 拓:发现两个进入高级系统设置的方法。1.桌面.此电脑→右键.属性→高级系统设置2.桌面.控制面板→搜索.高级系统设置 拓:编辑环境变量的时候,解决配置环境变量时只显示一行的问题变量值......
  • ubuntu18.04 使用netplan配置静态IP
    1.cd/etc/netplan2.sudovim/etc/netplan/*.yamlnetwork:ethernets:enp0s3:dhcp4:falseaddresses:[192.168.10.45/24]#静态IPv4gateway4:192.168.10.255#网关nameservers:addresses:[119.29.29.29]#DNS地......
  • FinClip 支持小程序维度域名配置;桌面端体验活动进行中
    FinClip的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。产品方面的相关动向......
  • 遇到的问题-----win7配置wifi时设置网络后无线连接不出现
    关于设置wifi的步骤详见:win7系统笔记本作为wifi热点提供无线连接win7配置wifi时设置网络后无线连接不出现有两种情况:一:以前是正常的突然就没有了这种情况把机子重启一次就可以了 出现无线连接后就可以按照步骤设置二:第一次设置就没有,这种情况要在官网下最新的无线网卡驱动.......