当前位置: 首页 > news >正文

【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()中执行一个较为耗时的操作,那就需要考虑修改此值。

分享资源

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

相关文章:

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

这世间许多事物皆因相信而存在,所以人们亲手捏出了泥菩萨,却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被…...

Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)

业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...

【leetcode】394. 字符串解码

题目链接:力扣 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没…...

系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】

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

魅族Pandaer手机壳

Pandaer的设计真是非常好看啊!像是手机壳的花样就特别多,还分出来很多系列,我比较喜欢它的亮面设计,入手了一款iPhone的,花色叫做“失控街头”,壳内部也是亮的,看起来特别浮夸,潮里潮…...

F5洞察2023年网络威胁,助力网络安全防护

2023已经过半,关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说,应当对相关的前瞻分析有所了解。前段时间,我阅读了F5 安全运营中心工程师对威胁网络安全的预测,深受启发,故此选取了几则…...

从零构建深度学习推理框架-4 框架中的算子注册机制

今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式,所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构,维护了一组键值对,key是对应的OpType,用来查找对应的value,…...

使用vscode+ssh免密远程Linux

使用vscodessh免密远程Linux 使用 SSH 密钥对:使用 SSH Agent:ssh-agent的使用场景 使用 SSH 密钥对: 确保你的本地机器上已经生成了 SSH 密钥对。如果没有,请使用以下命令生成密钥对: ssh-keygen -t rsa这将在 ~/.ssh…...

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的:除非它们运行起来,否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时,它会尝试把…...

【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常

azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行,连接邮箱服务器IP限制,也就是黑名单,释放时间不确定,但至少一天及以上。 解决办法,换一个IP,或者新注册一个office365邮箱再重试。 以下是…...

重新登录成功和登录失败处理器

<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…...

【Spring】(三)Spring 使用注解存储和读取 Bean对象

文章目录 前言一、使用注解储存 Bean 对象1.1 配置扫描路径1.2 类注解储存 Bean 对象1.2.1 Controller&#xff08;控制器存储&#xff09;1.2.2 Service&#xff08;服务储存&#xff09;1.2.3 Repository&#xff08;仓库存储&#xff09;1.2.4 Component&#xff08;组件储存…...

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中&#xff0c;具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…...

---------------- 部署 Zookeeper 集群 ----------------

部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…...

SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁

&#x1f600;前言 本篇博文是关于SpringBoot 依赖管理和自动配置&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…...

c语言每日一练(2)

前言&#xff1a; 每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…...

代码随想录第三十七天

代码随想录第三十七天 Leetcode 738. 单调递增的数字 Leetcode 738. 单调递增的数字 题目链接: 单调递增的数字 自己的思路:完全想不到&#xff01;&#xff01; 正确思路:大致思路是从后向前遍历&#xff0c;不可以从前向后&#xff0c;如果从前向后没有保证单调递增的顺序&…...

Linux进程间通信--ftok

在C语言中&#xff0c;ftok函数用于生成一个唯一的键值&#xff0c;该键值通常用于创建共享内存&#xff0c;消息队列和信号量等系统资源的标识符。 ftok函数原型入下&#xff1a; key_t ftok(const char *pathname, int proj_id); 参数说明&#xff1a; pathname&#xff1a…...

Spring Boot集成Mybatis-Plus

Spring Boot集成Mybatis-Plus 1. pom.xml导包 <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql<…...

梳理日常开发涉及的负载均衡

负载均衡是当前分布式微服务时代最能提及的词之一&#xff0c;出于对分层、解耦、弱依赖、可配置、可靠性等概念的解读&#xff0c;一对一的模式变得不再可信赖&#xff0c;千变万化的网络环境中&#xff0c;冗余和备份显得格外重要&#xff0c;稍大型的系统就会存在大量微服务…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...