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

分享资源

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

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

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

相关文章

一个好的人力资源管理系统包括哪些部分

阅读本文,您将具体详细了解:一个好的人力资源管理系统应该包括哪些部分。 人事部门是一家公司重要的职能部门之一,为公司的持续性、健康性发展提供人力保障。 然而,目前传统的人事管理方式在应对一些问题时存在着一些挑战。 例…

Shell脚本学习-循环的控制命令

break continue exit对比&#xff1a; 示例1&#xff1a;break命令跳出整个循环。 [rootabc scripts]# cat break1.sh #!/bin/bashfor((i0;i<5;i)) doif [ $i -eq 3 ]thenbreakfiecho $i done echo "ok"[rootabc scripts]# sh break1.sh 0 1 2 ok可以看到i等于3及…

jupyter lab环境配置

1.jupyterlab 使用虚拟环境 conda install ipykernelpython -m ipykernel install --user --name tf --display-name "tf" #例&#xff1a;环境名称tf2. jupyter lab kernel管理 show kernel list jupyter kernelspec listremove kernel jupyter kernelspec re…

微信小程序--原生

1&#xff1a;数据绑定 1&#xff1a;数据绑定的基本原则 2&#xff1a;在data中定义页面的数据 3&#xff1a;Mustache语法 4&#xff1a;Mustache的应用场景 1&#xff1a;常见的几种场景 2&#xff1a;动态绑定内容 3&#xff1a;动态绑定属性 4&#xff1a;三元运算 4&am…

C语言:打开调用堆栈

第一步&#xff1a;打断点 第二步&#xff1a;FnF5 第三步&#xff1a;按如图找到调用堆栈

C 语言高级3--函数指针回调函数,预处理,动态库的封装

目录 1.函数指针和回调函数 1.1 函数指针 1.1.1 函数类型 1.1.2 函数指针(指向函数的指针) 1.1.3 函数指针数组 1.1.4 函数指针做函数参数(回调函数) 2.预处理 2.1 预处理的基本概念 2.2 文件包含指令(#include) 2.2.1 文件包含处理 2.2.2 #incude<>和#include&q…

C++ 线性群体的概念

线性群体中的元素次序与其位置关系是对应的。 在线性群体中&#xff0c;可以按照访问元素的不同方法分为直接访问、顺序访问和索引访问。 &#xff08;1&#xff09;直接访问 对可直接访问的线性群体&#xff0c;我们可以直接访问群体中的任何一个元素&#xff0c;而不必首先访…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…

【小梦C嘎嘎——启航篇】类和对象(中篇)

【小梦C嘎嘎——启航篇】类和对象&#xff08;中篇&#xff09;&#x1f60e; 前言&#x1f64c;类的6个默认成员函数构造函数析构函数拷贝构造函数拷贝构造函数的特性有哪些&#xff1f;既然编译器可以自动生成一个拷贝构造函数&#xff0c;为什么我们还要自己设计实现呢&…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建SpringSecurity权限框架

1.Cloud Studio&#xff08;云端 IDE&#xff09;简介 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Clou…

Spring 知识点

Spring 1.1 Spring 简介 1.1.1 Spring 概念 Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。使现有的技术更加容易使…

Linux下进程的特点与环境变量

目录 进程的特点 进程特点的介绍 进程时如何实现并发性的 进程间如何切换 概念铺设 PC指针 上下文 环境变量 PATH 修改PATH HOME SHELL env 命令行参数 什么是命令行参数&#xff1f; 打印命令行参数 通过函数获得环境变量 getenv 命令行参数 env 修改环境变…

SpringBoot 项目使用 Redis 对用户 IP 进行接口限流

一、思路 使用接口限流的主要目的在于提高系统的稳定性&#xff0c;防止接口被恶意打击&#xff08;短时间内大量请求&#xff09;。 比如要求某接口在1分钟内请求次数不超过1000次&#xff0c;那么应该如何设计代码呢&#xff1f; 下面讲两种思路&#xff0c;如果想看代码可…

MySql用户管理、权限管理

用户管理 1. 查看系统用户&#xff08;查询mysql系统数据库中的user表&#xff09; select * from mysql.user; 2. 创建用户 CREATE USER 用户名主机名 identified by 密码 -- 创建用户zhonghua,只能在当前主句localhost访问,密码为123456 create user zhonghualocalhost i…

springCache-缓存

SpringCache 简介&#xff1a;是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;底层可以切换不同的cache的实现&#xff0c;具体是通过CacheManager接口实现 使用springcache,根据实现的缓存技术&#xff0c;如使用的redis,需要导入redis的依赖包 基于map缓存 …

MySQL 查询语句大全

目录 基础查询 直接查询 AS起别名 去重&#xff08;复&#xff09;查询 条件查询 算术运算符查询 逻辑运算符查询 正则表达式查询⭐ 模糊查询 范围查询 是否非空判断查询 排序查询 限制查询&#xff08;分页查询&#xff09; 随机查询 分组查询 HAVING 高级查询…

EtherCAT转EtherCAT网关FX5U有EtherCAT功能吗两个ETHERCAT设备互联

1.1 产品功能 捷米JM-ECT-ECT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 1.2 技术参数 1.2.1 捷米JM-ECT-ECT技术参数 ● 网关做为ETHERCAT网络的从站&#xff0c;可以连接倍福、…

小型双轮差速底盘机器人实现红外跟随功能

1. 功能说明 本文示例将实现R023样机小型双轮差速底盘跟随人移动的功能。在小型双轮差速底盘前方按下图所示安装3个 近红外传感器&#xff0c;制作一个红外线发射源&#xff0c;实现当红外发射源在机器人的检测范围内任意放置或移动时&#xff0c;机器人能追踪该发射源。 2. 电…