SpringCloud-技术专区-Hystrix-使用指南
Maven依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
导入配置:
server:
port: 11111
#default可替换
hystrix:
command:
default:
execution:
isolation:
#线程池隔离还是信号量隔离 默认是THREAD 信号量是SEMAPHORE
strategy: THREAD
semaphore:
#使用信号量隔离时,支持的最大并发数 默认10
maxConcurrentRequests: 10
thread:
#command的执行的超时时间 默认是1000
timeoutInMilliseconds: 1000
#HystrixCommand.run()执行超时时是否被打断 默认true
interruptOnTimeout: true
#HystrixCommand.run()被取消时是否被打断 默认false
interruptOnCancel: false
timeout:
#command执行时间超时是否抛异常 默认是true
enabled: true
fallback:
#当执行失败或者请求被拒绝,是否会尝试调用hystrixCommand.getFallback()
enabled: true
isolation:
semaphore:
#如果并发数达到该设置值,请求会被拒绝和抛出异常并且fallback不会被调用 默认10
maxConcurrentRequests: 10
circuitBreaker:
#用来跟踪熔断器的健康性,如果未达标则让request短路 默认true
enabled: true
#一个rolling window内最小的请求数。如果设为20,那么当一个rolling window的时间内
#(比如说1个rolling window是10秒)收到19个请求,即使19个请求都失败,也不会触发circuit break。默认20
requestVolumeThreshold: 5
# 触发短路的时间值,当该值设为5000时,则当触发circuit break后的5000毫秒内
#都会拒绝request,也就是5000毫秒后才会关闭circuit,放部分请求过去。默认5000
sleepWindowInMilliseconds: 5000
#错误比率阀值,如果错误率>=该值,circuit会被打开,并短路所有请求触发fallback。默认50
errorThresholdPercentage: 50
#强制打开熔断器,如果打开这个开关,那么拒绝所有request,默认false
forceOpen: false
#强制关闭熔断器 如果这个开关打开,circuit将一直关闭且忽略
forceClosed: false
metrics:
rollingStats:
#设置统计的时间窗口值的,毫秒值,circuit break 的打开会根据1个rolling window的统计来计算。若rolling window被设为10000毫秒,
#则rolling window会被分成n个buckets,每个bucket包含success,failure,timeout,rejection的次数的统计信息。默认10000
timeInMilliseconds: 10000
#设置一个rolling window被划分的数量,若numBuckets=10,rolling window=10000,
#那么一个bucket的时间即1秒。必须符合rolling window % numberBuckets == 0。默认10
numBuckets: 10
rollingPercentile:
#执行时是否enable指标的计算和跟踪,默认true
enabled: true
#设置rolling percentile window的时间,默认60000
timeInMilliseconds: 60000
#设置rolling percentile window的numberBuckets。逻辑同上。默认6
numBuckets: 6
#如果bucket size=100,window=10s,若这10s里有500次执行,
#只有最后100次执行会被统计到bucket里去。增加该值会增加内存开销以及排序的开销。默认100
bucketSize: 100
healthSnapshot:
#记录health 快照(用来统计成功和错误绿)的间隔,默认500ms
intervalInMilliseconds: 500
requestCache:
#默认true,需要重载getCacheKey(),返回null时不缓存
enabled: true
requestLog:
#记录日志到HystrixRequestLog,默认true
enabled: true
collapser:
default:
#单次批处理的最大请求数,达到该数量触发批处理,默认Integer.MAX_VALUE
maxRequestsInBatch: 2147483647
#触发批处理的延迟,也可以为创建批处理的时间+该值,默认10
timerDelayInMilliseconds: 10
requestCache:
#是否对HystrixCollapser.execute() and HystrixCollapser.queue()的cache,默认true
enabled: true
threadpool:
default:
#并发执行的最大线程数,默认10
coreSize: 10
#Since 1.5.9 能正常运行command的最大支付并发数
maximumSize: 10
#BlockingQueue的最大队列数,当设为-1,会使用SynchronousQueue,值为正时使用LinkedBlcokingQueue。
#该设置只会在初始化时有效,之后不能修改threadpool的queue size,除非reinitialising thread executor。
#默认-1。
maxQueueSize: -1
#即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝。
#因为maxQueueSize不能被动态修改,这个参数将允许我们动态设置该值。if maxQueueSize == -1,该字段将不起作用
queueSizeRejectionThreshold: 5
#Since 1.5.9 该属性使maximumSize生效,值须大于等于coreSize,当设置coreSize小于maximumSize
allowMaximumSizeToDivergeFromCoreSize: false
#如果corePoolSize和maxPoolSize设成一样(默认实现)该设置无效。
#如果通过plugin(https://github.com/Netflix/Hystrix/wiki/Plugins)使用自定义实现,该设置才有用,默认1.
keepAliveTimeMinutes: 1
metrics:
rollingStats:
#线程池统计指标的时间,默认10000
timeInMilliseconds: 10000
#将rolling window划分为n个buckets,默认10
numBuckets: 10
其中execution:isolation:strategy有些区别:
资源隔离
就是多个依赖服务的调用分别隔离到各自自己的资源池内。避免说对一个依赖服务的调用,因为依赖服务接口调用的失败或者延迟,导致所有的线程资源都全部耗费在这个接口上。一旦某个服务的线程资源全部耗尽可能导致服务的崩溃,甚至故障蔓延。
资源隔离的方法
信号量semaphore,最多能容纳10个请求。一旦超过10个信号量最大容量,那么就会拒绝其他请求。
信号量与线程池资源隔离的区别:
线程池隔离技术并非控制tomcat等web容器的线程。更准确的说就是控制tomcat线程的执行。tomcat接到请求之后会调用hystrix线程池的线程去执行。当线程池满了之后会调用fallback降级。
tomcat其他的线程不会卡死,快速返回,然后可以支撑其他事情。同时hystrix处理timeout超时问题。
信号量隔离只是一个关卡,通过我的关卡的线程是固定的。容量满了之后。fallback降级。
区别:线程池隔离技术是用自己的线程去执行调用。信号量是直接让tomcat线程去执行依赖服务。
上图是默认的配置,我们可以对自己的配置进行分组:
针对不同的组在配置文件里面加上不同的配置就好了,在@MyCommand注解里面指定group为abc就行;其他的配置也是这个规则,还有默认的配置是default;这样可以把一个组的配置独立出来,便于配置,而且开发者也会方便很多,代码简洁;
下面是代码:
package cn.chinotan.controller; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: test
* @description: hystrix控制器
* @author: xingcheng
* @create: 2018-11-03 19:27
**/
@RestController
@RequestMapping("/hystrix")
public class HystrixController { @HystrixCommand(fallbackMethod = "helloFallback")
@RequestMapping("/sayHello")
public String sayHello(String name, Integer time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, " + name;
} @HystrixCommand(fallbackMethod = "hiFallback")
@RequestMapping("/sayHi")
public String sayHi(String name) {
if (StringUtils.isBlank(name)) {
throw new RuntimeException("name不能为空");
}
return "Good morning, " + name;
} /**
* fallback
*/
public String helloFallback(String name, Integer time) {
System.out.println("helloFallback: " + name);
return "helloFallback" + name;
} /**
* fallback
*/
public String hiFallback(String name) {
System.out.println("hiFallback: " + name);
return "hiFallback" + name;
}
}package cn.chinotan.config; import com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @program: test
* @description: HystrixConfig
* @author: xingcheng
**/
@Configuration
public class HystrixConfig { /**
* 用来拦截处理HystrixCommand注解
* @return
*/
@Bean
public HystrixCommandAspect hystrixAspect() {
return new HystrixCommandAspect();
} /**
* 用来像监控中心Dashboard发送stream信息
* @return
*/
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registration.addUrlMappings("/hystrix.stream");
return registration;
} }
总结
- 雪崩效应原因:硬件故障、硬件故障、程序Bug、重试加大流量、用户大量请求。
- 雪崩的对策:限流、改进缓存模式(缓存预加载、同步调用改异步)、自动扩容、降级。
- Hystrix设计原则:
- 资源隔离:Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩。
- 熔断开关:服务的健康状况 = 请求失败数 / 请求总数,通过阈值设定和滑动窗口控制开关。
- 命令模式:通过继承 HystrixCommand 来包装服务调用逻辑。
SpringCloud-技术专区-Hystrix-使用指南的更多相关文章
- Springcloud技术分享
Springcloud技术分享 Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来 ...
- SpringCloud学习之Hystrix
一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...
- 【SpringCloud技术专题】「Gateway网关系列」(3)微服务网关服务的Gateway全流程开发实践指南(2.2.X)
开发指南须知 本次实践主要在版本:2.2.0.BUILD-SNAPSHOT上进行构建,这个项目提供了构建在Spring生态系统之上API网关. Spring Cloud Gateway的介绍 Spri ...
- SpringCloud系列-整合Hystrix的两种方式
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...
- SpringCloud学习之Hystrix请求熔断与服务降级(六)
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- SpringCloud技术涵盖简介
SpringCloud是微服务架构的集大成者,云计算最佳业务实践. 我们平常使用的Spring和他们的关系,对Spring,springboot , SpringCloud 的 概念区分,上图: Sp ...
- SpringCloud中使用Hystrix
1. 引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...
- springcloud 入门 11 (Hystrix Dashboard)
hystrix: 断路器我在前面已经介绍,不了解的可以参考 :springcloud 入门 6 (断路器hystrix) 关于搭建,测试我都在这里面进行说明了,这章介绍的是 Hystrix Das ...
- 二、springcloud之熔断器hystrix
一.背景 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服 ...
- 微服务之springcloud技术栈
一.微服务架构图: 二.技术介绍:(技术选型随着代码的编写会完成) 关于技术选型,我盗了一张微服务技术栈的图,如下:原文:http://www.jianshu.com/p/2da6becfb019 我 ...
随机推荐
- javaIO流(一)--File类的基本使用
一.File文件操作类 在java语言中提供有对于文件操作系统的支持,这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包中File类是唯一一个与文件本身操作有关的类(创 ...
- Logstash配置文件详情
logstash 配置文件编写详解 说明 它一个有jruby语言编写的运行在java虚拟机上的具有收集分析转发数据流功能的工具能集中处理各种类型的数据能标准化不通模式和格式的数据能快速的扩展自定义日志 ...
- 一、python基础之字符串的处理
最近开始重新回过头来巩固一下python的基础知识,并在此做一些记录以便未来更好的回顾 一.字符串的大小写转换 title() 使用title()方法可以将字符串中每个单词的首字母大写 name = ...
- 【算法】快速数论变换(NTT)初探
[简介] 快速傅里叶变换(FFT)运用了单位复根的性质减少了运算,但是每个复数系数的实部和虚部是一个余弦和正弦函数,因此系数都是浮点数,而浮点数的运算速度较慢且可能产生误差等精度问题,因此提出了以数论 ...
- windows10图形化连接CentOS7
前提:CentOS已经安装图形化,安装教程可以百度 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release (Core) 安装 ...
- Droppable(放置组件)
一.class加载方式 <div id="pop" class="easyui-droppable" style="width: 400px;h ...
- js中的script标签属性
HTML <script> 元素用于嵌入或引用可执行脚本. 在html中插入一个script标签 <script src="index.js" sync cros ...
- Linux学习笔记0-CentOS7关闭防火墙
关闭防火墙 systemctl stop firewalld.service //停止firewall systemctl disable firewalld.service //禁止firewall ...
- 【记录】Redis 基础
Redis可以存放五种类型 1:String(字符串) 2:List(列表) 3:Hash(字典) 4:Set(集合) 5:ZSet(有序集合) String (字符串) redis 127.0.0. ...
- 中州韵输入法(rime)导入搜狗词库
rime是一个非常优秀的输入法,linux平台下的反应速度远超搜狗,也没有隐私风险.2012年开始接触它,到后来抛弃了它,因为rime自带的词库真的太弱了,也懒得折腾.最近发现一个词库转换软件叫ime ...