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-使用指南的更多相关文章

  1. Springcloud技术分享

    Springcloud技术分享 Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来 ...

  2. SpringCloud学习之Hystrix

    一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...

  3. 【SpringCloud技术专题】「Gateway网关系列」(3)微服务网关服务的Gateway全流程开发实践指南(2.2.X)

    开发指南须知 本次实践主要在版本:2.2.0.BUILD-SNAPSHOT上进行构建,这个项目提供了构建在Spring生态系统之上API网关. Spring Cloud Gateway的介绍 Spri ...

  4. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  5. SpringCloud学习之Hystrix请求熔断与服务降级(六)

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  6. SpringCloud技术涵盖简介

    SpringCloud是微服务架构的集大成者,云计算最佳业务实践. 我们平常使用的Spring和他们的关系,对Spring,springboot , SpringCloud 的 概念区分,上图: Sp ...

  7. SpringCloud中使用Hystrix

    1.  引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...

  8. springcloud 入门 11 (Hystrix Dashboard)

    hystrix: 断路器我在前面已经介绍,不了解的可以参考 :springcloud 入门 6 (断路器hystrix)  关于搭建,测试我都在这里面进行说明了,这章介绍的是  Hystrix Das ...

  9. 二、springcloud之熔断器hystrix

    一.背景 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服 ...

  10. 微服务之springcloud技术栈

    一.微服务架构图: 二.技术介绍:(技术选型随着代码的编写会完成) 关于技术选型,我盗了一张微服务技术栈的图,如下:原文:http://www.jianshu.com/p/2da6becfb019 我 ...

随机推荐

  1. Linux下安装git本地库与服务器端远程库

    1.    git是一个分布式版本管理系统,关于该工具的详细介绍,我认为廖雪峰老师介绍的非常全面:https://www.liaoxuefeng.com/wiki/896043488029600. 不 ...

  2. Golang 读书

    var a map[string] int  类似Key\Value var( 多个变量,避免多次声明var ) 声明变量 多重赋值 i,j=j,i 匿名变量 _ literal 字面常量   con ...

  3. redux和react-redux

    redux和react-redux的关系: redux是react的状态管理工具,却不仅仅只是为了react而生的,所以在使用中会存在痛点.而react-redux是专门为了react定制,目的是为了 ...

  4. Docker两个问题的讨论

    docker中的container到底可不可以理解为一个操作系统? 先表明态度,我的理解是,NO. 主机级虚拟化 容器级虚拟化 容器通过Docker的守护进程(Docker daemon)来进行创建, ...

  5. js实现的简单遮罩层

    超级简单的一个实现,可能会有局限性,贵在简单易懂,使用的时候执行前loading,执行成功后loaded /* * 显示loading遮罩层 */ function loading() { var m ...

  6. Python3.5-20190519-廖老师-自我笔记-获取对象信息

    总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”. 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象 ...

  7. 如何快速使用YOLO3进行目标检测

    本文目的:介绍一篇YOLO3的Keras实现项目,便于快速了解如何使用预训练的YOLOv3,来对新图像进行目标检测. 本文使用的是Github上一位大神训练的YOLO3开源的项目.这个项目提供了很多使 ...

  8. 07.interrupt

    /** *isInterrupted */ public class InterruptDemo { public static void main(String[] args) throws Int ...

  9. 用idea将本地项目提交到gitlab上

    提交的前提是你必须有gitlab的地址 以下是将本地代码提交到gitlab上 在idea的菜单项选择 VCS>Import into Version Control>Create Git ...

  10. Android中可以做的两件坏事---破解锁屏密码和获取Wifi密码

    之前的文章一直在介绍OC,最近也是在找急忙慌的学习IOS,所以Android方面的知识分享就有点中断了,但是我现在还是要靠Android吃饭,所以不能Android的工作不能停呀,今天咋们来看一下我在 ...