精华内容
下载资源
问答
  • hystrix服务熔断机制

    千次阅读 2018-09-24 22:32:47
    为了防止雪崩,hystrix提供了基于断路器的服务熔断机制,下面我们看一张编程模型图 可以看到当请求发生错误的比例超过一定比例时histrix将打开断路器进入closed状态,这个状态下我们所有针对该服务的请求(以依赖...

    为了防止雪崩,hystrix提供了基于断路器的服务熔断机制,下面我们看一张编程模型图
    circuit breaker

    可以看到当请求发生错误的比例超过一定比例时histrix将打开断路器进入closed状态,这个状态下我们所有针对该服务的请求(以依赖隔离的线程池为隔断单位,同一线程池中的所有hiystrix command都会被熔断)都会默认使用降级策略进行处理。结果一段时间(通常称为睡眠窗口)后,断路器将被置为半打开(half open)状态,这个状态下将对一定数量的请求进行正常处理,同时统计请求成功的数量。这个数量如果能达到指定的比例断路器将自动关闭重新进入打开open状态。这就是hystrix基于断路器的熔断器机制。

    下面看hystrix command中几个关于熔断器的关键参数
    服务熔断关键参数
    sleepWindowInMillseconds: 服务熔断后(closed)恢复到半打开(halfopen)状态的时间窗口,以毫秒为单位。

    requestVolumeThreshold: 熔断状态下尝试进入半打开状态这个时间里允许使用正常逻辑处理的并发请求数

    errorThresholdPercentage:服务进入熔断状态的错误比例。

    展开全文
  • Hystrix的服务熔断机制

    2020-08-04 08:15:15
    在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制熔断机制的注解是@HystrixCommand 熔断类型: 熔断打开 ...

    机制概述:

    熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
    当检测到该节点微服务调用响应正常后,恢复调用链路。

    在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand

    熔断类型:

    • 熔断打开
      请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态
    • 熔断关闭
      熔断关闭不会对服务进行调用
    • 熔断半开
      部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

     

    Hystrix的设计原则是什么?

     

    • 资源隔离(线程池隔离和信号量隔离)机制:限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其它服务调用。
    • 限流机制:限流机制主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。
    • 熔断机制:当失败率达到阀值自动触发降级(如因网络故障、超时造成的失败率真高),熔断器触发的快速失败会进行快速恢复。
    • 降级机制:超时降级、资源不足时(线程或信号量)降级 、运行异常降级等,降级后可以配合降级接口返回托底数据。
    • 缓存支持:提供了请求缓存、请求合并实现
    • 通过近实时的统计/监控/报警功能,来提高故障发现的速度
    • 通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度

     

    展开全文
  • Hystrix服务熔断机制

    2021-02-23 09:17:28
    目录Hystrix服务熔断前言——理论服务雪崩断路器服务熔断服务熔断的实现服务熔断阈值的全部配置 Hystrix服务熔断 前言——理论 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和...

    Hystrix服务熔断

    前言——理论

    服务雪崩

    多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C有调用其他的微服务,这就是所谓的”扇出”,如扇出的链路上某个微服务的调用响应式过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统雪崩,所谓的”雪崩效应

    断路器

    “断路器”本身是一种开关装置,当某个服务单元发生故障监控(类似熔断保险丝),向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延。乃至雪崩。

    服务熔断

    熔断机制是应对雪崩效应的一种微服务链路保护机制,

    当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后恢复调用链路,在SpringCloud框架机制通过Hystrix实现,Hystrix会监控微服务见调用的状况,当失败的调用到一个阈值,缺省是5秒内20次调用失败就会启动熔断机制,熔断机制的注解是@HystrixCommand

    服务熔断的实现

    1. pom
    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
    
    1. 启动类增加注解@EnableCircuitBreaker对Hystrix的支持

    2. 具体实现(类似于服务降级)

     @HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallBack",commandProperties = {
                @HystrixProperty(name="circuitBreaker.enabled",value = "true"),//是否开启熔断器
                @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),//请求次数
                @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
                @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60"),//失败率达到多少后跳闸
        })
        public String paymentCircuitBreaker(@PathVariable(value = "id") Integer id){
            if (id<0){
                throw new RuntimeException("********id不能为负数");
            }
            String serialNumber = IdUtil.simpleUUID();
            return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
        }
        public String paymentCircuitBreakerFallBack(@PathVariable(value = "id") Integer id){
            return "服务熔断:id不能为负数,请重试,id:"+id;
        }
    

    服务熔断阈值的全部配置

    @HystrixCommand(fallbackMethod="str_fallbacklethod",
    		groupKey="strGroupCommand",
    		commandKey="strCommand",
    		threadPoolKey="strThreadPool",
    		conmmandProperties={
    		//设置隔高策略,THREAD表示线程池 SEMAPHORE;信号燃隔离
    		@Hystrixproperty(name="execution.isolation.strategy",value="THREAD"),
    		//当离策略选择信号池俩离的时候,用来设登信号池的大小(最大并发数)Hystrixproperty(name="execution.isolation.semaphore.maxConcurrentRequests",value=“18"),
    		//配置命令执行的超时时间
    		@Hystrixproperty(name ="execution.isolation.thread.timeoutinMilliseconds",value=18"),
    		//是否启用超时时间
    		@HystrixProperty(name="execution.timeout.enabled",value="true"),
    		//我行超时的时候是否中断
    		@Hystrixproperty(name="execution.isolation.thread.interruptonTimeout",value="true"),
    		//我行被段消的时保是否中断
    		@HystrixProperty(name="execution.isolation.thread.interruptonCancel",value="true"),
    		//充许回漂方法执行的最木并发觉
    		@HystrixProperty(name ="fallback.isolation.semaphore.maxConcurrentRequests",value=1e"),
    		//服务摩级是否启用,是否行回谢函数
    		@HystrixProperty(name="fallback.enabled",value="true"),
    		//当俩高策选择信号触俩离的时候,用来设置信号池的大小(最大并发数)@Hystrixproperty(name="execution.isolation.semaphore.maxConcurrentRequests",value=“10"),
    		//愿置命令教行的超时时间
    		@Hystrixproperty(name="execution.isolation.thread.timeoutinMilliseconds",value=10"),
    		//是否启用超时时间
    		@HystrixProperty(name="execution.timeout.enabled",value="true"),
    		//执行超时的时贷是否中所
    		@Hystrixproperty(name="execution.isolation.thread.interruptonTimeout",value="true"),
    		//我行被消的时烷是否中断
    		@HystrixProperty(name="execution.isolation.thread.interruptonCance1",value="true"),
    		//充许回调方法教行的最大并发数
    		@Hystrixproperty(name="fallback.isolation.semaphore.maxconcurrentRequests",value=1e"),
    		//服务摩级是否启用,是否执行回阅函效
    		@HystrixProperty(name="fallback.enabled",value="true"),
    		//是否启用新路器
    		@Hystrixproperty(name="circuitBreaker.enabled",value="true"),
    		//该属性用来设置在龄动时间窗中,新路器培断的最小请求数。例如,默(该值为20的时候,
    		//如果滚动时间窗(段议10秒)内仅妆到了19个请来,即使这19个请来部关败了,断路翻出不会打开。
    		@Hystrixproperty(name="circuitBreaker.requestVolumeThreshold",value=2e"),
    		//该属性用来设置在旋动时闹窗中,表示在滚动时间窗中,在诗求数量超过
    		//circuitBreaker.requestVolumeThreshold 的信况下,如果错误消求数的百分比超过5e,
    		//就把断路器设置为“打开”状态,否则藏设置为“关闭”状态。
    		//该属性用来设置当断路器打开之后的能时间亩。放熊时间应结纯之后,
    		//会种新路器置为“半开”优态,尝试熔断的请求命令,如果然然关股就将新路都继续设置为“打开”次态,
    		//如果成功激设置为“关闭”状态。
    		@Hystrixproperty(name="circuitBreaker.sleepwindowinMilliseconds",value=5eee"),
    		//新路品强制打开
    		@Hystrixproperty(name="circuitBreaker.forceOpen",value="false"),
    		//新路部端制光闭
    		@HystrixProperty(name="circuitBreaker.forceclosed",value="false"),
    		//旋动时间窗设置,该时间用于断路器州新越院度时需要收集信息的持续时间
    		CHystrixproperty(name="metrics.rollingstats.timeinMilliseconds",value="18000"),
    		//该离性用来设置缩动时间定统计指标常起时划分“”的觉益,断路品查收集营标信息的时须会根薪
    		//设置的时间康长度拆分成多个“树”来累计各度益值,每个””记录了一最时间内的来集指标。
    		//比如10秒内获分成10个“”炎乘这荐,所以timeinlilLiseconds 必须能被 numBuckets整除。否则会越异常lystrixproperty(name="metrics.rollingStats.numBuckets",value="10"),
    		//该属性用来设置对命令执行的还迟是否使用百分位数来跟除和计章,如界设置为false,那么所有的留要统计部牌返回-1。
    		@Hystrixproperty(name="metrics.rollingPercentile.enabled",value="false"),
    		//该属性用来设复百分位统计的装动窗口的荐续时间,单位为客砂。
    		@Hystrixproperty(name="metrics.rollingPercentile.timeInMilliseconds",value="60000"),
    		//该属性用来设置百分位统计装动窗口中使用“俯”的最品。
    		@HystrixProperty(name="metrics.rollingPercentile.numBuckets",value=6e808"),
    		//流属性用来设置在执行过程中每个“闹”中保岛的最大执行次数。如架产模动时间缩内发生超过该设定值的执行流藏,
    		//就从最初的位置开烯蛋写。例如,种该信设置为为00,旅动窗口为10秒,若在10秒内一个“篇”中发生了500次执行,
    		@Hystrixproperty(name ="metrics.rollingPercentile.bucketSize",value="180"),
    		//该属性用来设置采集影响新路部优杏的然原快照(请求的成功、错课百分比)的间隔等待时间。
    		@Hystrixproperty(name="metrics.healthSnapshot.intervalinMilliseconds",value="500"),
    		//是否开启请来餐存
    		@Hystrixproperty(name="requestCache.enabled",value="true"),
    		//Hystrixcommand的执行和票件是否打印日志到 HystrixRequestLog 中
    		@Hystrixproperty(name="requestLog.enabled",value="true"),
    		},threadPoolProperties={
    		//该参教用来设置执行命令就程池的候心就程载,该值也就是命令执行的展大并发量
    		@Hystrixproperty(name="coreSize",value=18"),
    		//该参数用来设置线程触的最大风列大小。当营为-1时,绝程触将使用SynchronousQueue 实现的队列,
    		//否则将使用 LinkedBlLockingQueue 实现的队列。
    		@Hystrixproperty(name="maxQueuesize",value=-1"),
    		//该参数用来为风列设置拒给岗值。这过该参数,即使队列淀有达到最大金也能拒缩请来。
    		//该参数主要是对LinkedBLockingQueue 队列的补充,圆为LinkedBlockingQueue
    		/∥风列不能动态修改它的对象大小,而速过该属性就可以调整柜细请来的队大小了。
    		@Hystrixproperty(name="queueSizeRejectionThreshold",value="5"),
    		}
    }
    
    展开全文
  • 服务熔断机制hystrix

    千次阅读 2018-07-03 20:13:58
    服务雪崩效应:是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程。1) A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐...
    一、Hystrix说明
    1.服务雪崩效应:是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程。
    1) A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了

    2.雪崩原因:
    1) 服务提供者不可用
    a.硬件故障
    a1.硬件损坏造成的服务器主机宕机
    a2.网络硬件故障造成的服务提供者的不可访问
    b.程序Bug
    c.缓存击穿:缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用
    d.用户大量请求:在秒杀和大促开始前,如果准备不充分,用户发起大量请求造成服务提供者的不可用
    2) 重试加大流量
    a.用户重试:用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单
    b.代码逻辑重试:服务调用端的会存在大量服务异常后的重试逻辑
    3) 服务调用者不可用
    a.同步等待造成的资源耗尽:使用 同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 造成服务雪崩效应产生

    3.雪崩应对策略:
    1) 流量控制
    a.网关限流
    因为Nginx的高性能, 目前一线互联网公司大量采用Nginx+Lua的网关进行流量控制, 由此而来的OpenResty也越来越热门.
    b.用户交互限流
    具体措施:
    a21. 采用加载动画,提高用户的忍耐等待时间.
    a22. 提交按钮添加强制等待时间机制.
    c.关闭重试
    2) 改进缓存模式
    a.缓存预加载
    b.同步改为异步刷新
    3) 服务自动扩容
    a.AWS的auto scaling
    4) 服务调用者降级服务
    a.资源隔离:主要是对调用服务的线程池进行隔离.
    b.对依赖服务进行分类
    依赖服务分为: 强依赖和若依赖. 强依赖服务不可用会导致当前业务中止,而弱依赖服务的不可用不会导致当前业务的中止. 
    c.不可用服务的调用快速失败
    一般通过 超时机制熔断器 和熔断后的 降级方法 来实现
    4.解决方案:
    1)使用Hystrix预防服务雪崩
    2)Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力
    3)Hystrix的设计原则包括:资源隔离、熔断器、命令模式

    二、Hystrix解决方式
    Hystrix:通过服务熔断(也可以称为断路)、降级、限流(隔离)、异步RPC等手段控制依赖服务的延迟与失败
    1.Circuit Breaker :熔断器,熔断只是作用在服务调用这一端,只需改consumer端
    1)熔断器开关相互转换的逻辑
    a.服务的健康状况 = 请求失败数 / 请求总数. 
    b.熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的
    b1.关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态
    b2.打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过
    c.保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待
    d.在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能
    2)参数设
    a.circuitBreaker.requestVolumeThreshold //滑动窗口的大小,默认为20
    b.circuitBreaker.sleepWindowInMilliseconds //过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟
    c.circuitBreaker.errorThresholdPercentage //错误率,默认50%
    每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开

    2.downgrade:降级,fallback
    1)当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值

    3.Isolation:限流(隔离)
    1)可在服务端做这个限流逻辑,也可在客户端做
    2)采用线程/信号的方式,通过隔离限制依赖的并发量和阻塞扩散
    a.线程隔离:
    a1.即将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩
    a2.线上建议线程池不要设置过大,否则大量堵塞线程有可能会拖慢服务器
    a3.优点:
    a31.使用线程可以完全隔离第三方代码,请求线程可以快速放回
    a32.当一个失败的依赖再次变成可用时,线程池将清理,并立即恢复可用,而不是一个长时间的恢复
    a33.可以完全模拟异步调用,方便异步编程
    a4.缺点:
    a41.线程池的主要缺点是它增加了cpu,因为每个命令的执行涉及到排队(默认使用SynchronousQueue避免排队),调度和上下文切换
    a42.对使用ThreadLocal等依赖线程状态的代码增加复杂性,需要手动传递和清理线程状态
    注:Netflix公司内部认为线程隔离开销足够小,不会造成重大的成本或性能的影响
    b.信号隔离:
    b1.用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请)
    b2.如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销
    b3.信号量的大小可以动态调整, 线程池大小不可以
    缺点:不能设置超时和实现异步访问,所以,只有在依赖服务是足够可靠的情况下才使用信号量
    3)除了HystrixBadRequestException异常之外,所有从run()方法抛出的异常都算作失败,并触发降级getFallback()和断路器逻辑
    4)HystrixBadRequestException用在非法参数或非系统故障异常等不应触发回退逻辑的场景
    5)参数解释
    a.CommandKey:依赖命名
    a1.每个CommandKey代表一个依赖抽象,相同的依赖要使用相同的CommandKey名称
    a2.依赖隔离的根本就是对相同CommandKey的依赖做隔离.
    b.CommandGroupKey:依赖分组
    b1.命令分组用于对依赖操作分组,便于统计,汇总
    b2.CommandGroup是每个命令最少配置的必选参数,在不指定ThreadPoolKey的情况下,字面值用于对不同依赖的线程池/信号区分
    c.ThreadPoolKey:线程池/信号
    c1.当对同一业务依赖做隔离时使用CommandGroup做区分,但是对同一依赖的不同远程调用如(一个是Redis一个是http),可以使用HystrixThreadPoolKey做隔离区分
    c2.在业务上都是相同的组,但是需要在资源上做隔离时,可以使用HystrixThreadPoolKey区分
    d.Request-Cache:请求缓存
    d1.重写getCacheKey方法,实现区分不同请求的逻辑
    d2.请求缓存可以让(CommandKey/CommandGroup)相同的情况下,直接共享结果,降低依赖调用次数,在高并发和CacheKey碰撞率高场景下可以提升性能
    e.SEMAPHORE信号量隔离
    e1.隔离本地代码或可快速返回远程调用(如memcached,redis)可以直接使用信号量隔离,降低线程隔离开销

    4.asynchronous:异步RPC

    三、Hystrix metrics:容错计数
    1.Metrics:
    1)Hystrix的Metrics中保存了当前服务的健康状况, 包括服务调用总次数和服务调用失败次数等
    2)根据Metrics的计数, 熔断器从而能计算出当前服务的调用失败率, 用来和设定的阈值比较从而决定熔断器的状态切换逻辑
    2.1.5之后的滑动窗口实现
    1)使用RxJava的Observable.window()实现滑动窗口

    四、配置参数说明
    1.HystrixCommandPropertiesHystrixProperty类型
    1)Metrics
    a.metricsRollingStatisticalWindowInMilliseconds:统计滚动的时间窗口,默认:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds)
    b.metricsRollingStatisticalWindowBuckets:统计窗口的Buckets的数量,默认:10个,每秒一个Buckets统计
    c.metrics.rollingPercentile.enabled:是否开启监控统计功能,默认:true
    d.metrics.rollingStats.timeInMilliseconds:
    e.metrics.rollingStats.numBuckets:
    f.metrics.rollingPercentile.timeInMilliseconds:
    h.metrics.rollingPercentile.numBuckets:
    i.metrics.rollingPercentile.bucketSize:
    g.metrics.healthSnapshot.intervalInMilliseconds
    h.circuitBreaker.requestVolumeThreshold:断路器请求阈值,熔断器在整个统计时间内是否开启的阀值,默认20。也就是在metricsRollingStatisticalWindowInMilliseconds(默认10s)内至少请求20次,熔断器才发挥起作用
    2)Circuit Breaker
    a.circuitBreaker.sleepWindowInMilliseconds:断路器休眠时间,熔断时间窗口,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口
    b.circuitBreaker.enabled:断路器开关,是否启用熔断器,默认true. 启动
    c.circuitBreaker.errorThresholdPercentage:断路器错误请求百分比,默认:50%。当出错率超过50%后熔断器启动
    d.circuitBreaker.forceOpen:断路器强制开启,是否强制开启熔断器阻断所有请求,默认:false,不开启。置为true时,所有请求都将被拒绝,直接到fallback
    e.circuitBreaker.forceClosed:断路器强制关闭,是否允许熔断器忽略错误,默认false, 不开启
    3)Execution
    a.execution.isolation.semaphore.maxConcurrentRequests:使用信号量隔离时,命令调用最大的并发数,默认:10
    b.execution.isolation.strategy:使用命令调用隔离方式,默认:采用线程隔离,ExecutionIsolationStrategy.THREAD
    c.execution.isolation.thread.timeoutInMilliseconds:使用线程隔离时,调用超时时间,默认:1秒
    d.executionIsolationThreadPoolKeyOverride:线程池的key,用于决定命令在哪个线程池执行
    e.execution.isolation.thread.interruptOnTimeout:使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作.默认:true
    f.execution.timeout.enabled
    4)Fallback
    a.fallback.isolation.semaphore.maxConcurrentRequests:使用信号量隔离时,命令fallback(降级)调用最大的并发数,默认:10
    b.fallback.enabled:是否开启fallback降级策略 默认:true
    5)Request Context
    a.requestLogEnabled:是否开启请求日志,默认:true
    b.requestCacheEnabled:是否开启请求缓存,默认:true

    2.HystrixCollapserProperties:HystrixProperty类型
    1)maxRequestsInBatch:请求合并是允许的最大请求数,默认: Integer.MAX_VALUE
    2)timerDelayInMilliseconds:批处理过程中每个命令延迟的时间,默认:10毫秒
    3)requestCache.enabled:批处理过程中是否开启请求缓存,默认:开启

    3.HystrixThreadPoolProperties:
    1)corePoolSize:配置线程池大小,默认值10个. 建议值:请求高峰时99.5%的平均响应时间 + 向上预留一些即可
    2)maxQueueSize:配置线程值等待队列长度,默认值:-1,建议值:-1,表示不等待直接拒绝,测试表明线程池使用直接决绝策略+ 合适大小的非回缩线程池效率最高.所以不建议修改此值。当使用非回缩线程池时,queueSizeRejectionThreshold,keepAliveTimeMinutes 参数无效
    3)queueSizeRejectionThreshold:队列大小拒绝阈值
    4)keepAliveTimeMinutes
    5)metrics.rollingStats.timeInMilliseconds
    6)metrics.rollingStats.numBuckets

    五、Spring cloud hystrix示例
    1.熔断:只是作用在服务调用这一端,因此只需要改动consumer项目相关代码
    1)pom.xml:Feign中已经依赖了Hystrix,所以在maven配置上不用做任何改动
    2)application.properties
    # Hystrix配置:Feign中已经依赖了Hystrix,所以在maven配置上不用做任何改动
    	feign:
      	  hystrix:
        	    enabled: true
    
    3)**Appliaction.java启动类:
    @EnableFeignClients //开启feigin注解
    @EnableCircuitBreaker //开启Hystrix
    @EnableDiscoveryClient //开启注册中心
    @SpringBootApplication //spring-boot启动
    注:还可用@SpringCloudApplication代替,@SpringCloudApplication包括以下注解: @Target({ElementType.TYPE}
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    @Bean
    	@LoadBalanced
    	public RestTemplate restTemplate() {
        		//用于调用"提供者"的方法
        		return new RestTemplate();
    	}	

    4)controller层:
    	@GetMapping("/order/{userId}/{orderNo}")
    	public String findOrder(@PathVariable Long userId, @PathVariable String orderNo) throws InterruptedException {
        		return userConsumerService.findOrder(userId,orderNo);
    	}
    
    5)service层:添加fallback属性
        String findOrder(Long userId,String orderNo) throws InterruptedException;
    

    6)service impl层:创建回调类
    	@HystrixCommand(fallbackMethod = "findOrderFallback", commandProperties = {
            	//timeoutInMilliseconds 使用线程隔离时,调用超时时间
            	@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
    	})
    	public String findOrder(Long userId,String orderNo) throws InterruptedException {
        		Random random = new Random();
        		sleepRandom = random.nextInt(2000);
        		System.out.println("sleepRandom="+sleepRandom);
        		Thread.sleep(sleepRandom);
        		ConsumerBeehiveUser user = findById(userId);
        		if (user != null) {
            		return user.getUsername() + " 的订单" + orderNo + " 找到啦!sleepRandom="+sleepRandom;
        		}
        		return "用户不存在!sleepRandom="+sleepRandom;
    	}
    
    	public String findOrderFallback(Long userId, String orderNo) {
        		return "订单查找失败!sleepRandom="+sleepRandom;
    	}
    

    7)查看hystrix状态:
    a.查看hystrix基本情况:http://localhost:8002/health
    b.查看hystrix详情:http://localhost:8002/hystrix.stream
    8)参数说明:
    a.快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
    b.请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
    c.错误百分比下限:当请求总数在快照时间窗内超过了下限,比如发生了30次调用,如果在这30次调用中,有16次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。
    注:fallback是降级处理

    2.隔离:
    1)*Application:
        @SpringBootApplication
    	@EnableDiscoveryClient //开启eureka服务
    	@EnableFeignClients //开启feigin注解
    	@EnableCircuitBreaker //开启Hystrix  @EnableCircuitBreaker或@EnableHystrix
    	@EnableHystrixDashboard //开启dashboard图形监控
    	public class ConsumerBeehiveApplication {
        		@Bean
        		@LoadBalanced
        		public RestTemplate restTemplate() {
            		//用于调用"提供者"的方法
            		return new RestTemplate();
        		}
    
        		public static void main(String[] args) {
            		SpringApplication.run(ConsumerBeehiveApplication.class, args);
        		}
    	}
    

    2)controller层:
    	@GetMapping("/testCircuitBreaker/{id}")
    	public String testCircuitBreaker(@PathVariable int id) {
        		StringBuilder sb = new StringBuilder();
        		for(int i = 0; i < 50; i++) {
            		String result = userConsumerService.testCircuitBreaker(i);
            		System.out.println("testCircuitBreaker controller:"+result);
            		sb.append(result).append("\n");
        		}
        		return sb.toString();
    	}
    

    3)service层:
    	String testCircuitBreaker(int id);
    

    4)service impl层:
    	@HystrixCommand(fallbackMethod = "testCircuitBreakerFallback", commandProperties = {
            	//errorThresholdPercentage 断路器错误请求百分比
            	@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
    	})
    	public String testCircuitBreaker(int id) {
        		if(id % 2 == 0 && id < 10) {   // 直接返回
            		return "consumer testCircuitBreaker "+id;
        		} else {   // 无限循环模拟超时
            		int j = 0;
            		while (true) {
              			j++;
            		}
        		}
    	}
    
    	public String testCircuitBreakerFallback(int id) {
        		String template = restTemplate.getForObject("http://provider-user/user/testCircuitBreaker/"+id, String.class);
        		return "fallback:"+template;
    	}

    展开全文
  • Eureka 服务注册与发现 springcloud 采用netflix公司研发的eureka 实现注册与发现
  • 熔断机制

    千次阅读 2021-01-08 19:37:12
    “雪崩效应"就是单个服务节点出现问题会造成大面积的服务节点出现异常,为了解决这种问题出现了"熔断机制”。 如果服务A访问量增加,导致线程堵塞。此时服务B和C可能需要A的某些信息才能进行运行,这样其他服务...
  • 这里我们有几个问题: 1、什么是服务的熔断机制熔断机制是对系统的防护,比如受到一些...服务熔断就是对该服务的调用执行熔断,对应后续请求,不在继续调用该目标服务,而是直接返回,从而可以快速释放资源,...
  • Hystrix-熔断机制

    2019-09-03 21:00:27
    2.如果当服务的请求失败几率大于50%的时候则会自动熔断机制,并且开启循环请求。 3.极润熔断机制触发fallback方法,返回托底数据 4.如果请求依然失败依然是熔断开启,返回托底数据,并继续发起5秒的访问,成功则关闭...
  • go-hystrix熔断机制

    2019-09-28 00:06:44
    因此为了防止此现象的发生,决定了解下服务熔断机制,根据自身业务的需求,将其应用到服务中。 什么是熔断:可以联想到我们家里的电表的保险丝,当电压负载过高后,保险丝熔断,确保家里的电器等其他安全。 在我...
  • 微服务熔断机制 Hystrix1、服务熔断2、熔断与降级2.1 熔断和降级相同点2.2 熔断与降级的区别3、关于 Hystrix3.1 Hystrix 的设计原则3.2 Hystrix 的工作机制3.3 如何集成 Hystrix3.4 使用 Turbine 聚合监控 1、服务...
  • 照例附上项目github链接。 本项目实现的是将一个简单的天气预报系统一步一步改造成一个SpringCloud微服务系统的过程。...熔断机制 : 当服务过载了,或者是流量激增,超过了服务的负荷,使用熔断机制,将服务掐断,...
  • Hystrix 熔断机制

    千次阅读 2018-05-31 16:39:45
    1、概念:Hystrix 熔断机制2、具体内容所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢?当现在服务的提供方出现了问题...
  • 熔断机制HYSTRIX

    2020-03-16 20:59:54
    熔断机制HYSTRIX 一、问题产生 雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程 正常情况下的服务: 某一服务出现异常,拖垮整个服务链路,消耗整个线程队列,造成服务...
  • Hystrix熔断机制

    2018-08-03 17:56:53
    转自: 熔断机制HYSTRIX &nbsp; 一、问题产生 雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程 &nbsp;&nbsp;正常情况下的服务: 某一服务出现异常,拖垮...
  • springcloud熔断机制

    2019-09-25 03:36:27
    熔断机制,就是下游服务出现问题后,为保证整个系统正常运行下去,而提供一种降级服务的机制,通过返回缓存数据或者既定数据,避免出现系统整体雪崩效应。在springcloud中,该功能可通过配置的方式加入到项目中。 ...
  • 熔断机制hystrix

    万次阅读 2018-06-12 09:13:56
    熔断机制hystrix一、问题产生雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程 正常情况下的服务:某一服务出现异常,拖垮整个服务链路,消耗整个线程队列,造成服务不可用,...
  • Hystrix熔断机制服务降级

    千次阅读 2019-08-11 22:08:07
    一、服务熔断简介 中文网站https://springcloud.cc/ github:https://github.com/Netflix/hystrix 什么是Hystrix 【翻译】在分布式环境中,许多服务依赖中的一些服务发生失败是不可避免的。Hystrix是一个库...
  • 什么是springcoud的熔断机制熔断机制是对分布式架构项目的一种起到保护作用的手段或者机制,就像继电器...springcloud的熔断机制触发一般是因为某个服务的故障所引起,及时的进行熔断,避免了雪崩效应的出现。 ...
  • 微服务熔断服务降级方案
  • 服务消费端开启hystrix熔断机制(基于Feign) 博文概述 本篇博文通过feign实现服务消费者,并开启了hystrix熔断机制确保服务提供者在服务异常的情况下,可以将服务请求转发至相应的服务异常处理方法中,以确保整个...
  • Spring Cloud Hystrix 熔断机制

    千次阅读 2019-08-29 16:12:41
    Spring Cloud Hystrix 熔断机制 Spring Cloud Hystrix,该框架的使用目标在于通过控制那些访问远程系统、服务和 第三方库的节点,从而对延迟和故障提供更强大的容错能力。 Hystrix具有服务降级、服务熔断、线程和...
  • Sentinel熔断机制

    千次阅读 2019-12-25 10:59:19
    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。本项目为sentinel与dubbo结合的改造...
  • 服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时(通过设置超时时间,超时百分比,从整体上判断是否需要熔断 ),为了防止整个系统出现雪崩,暂时停止对该服务的调用。 熔断的三个相互...
  • 熔断机制 类似保险丝 为了解决高并发请求,一旦达到规定请求,熔断,报错。----服务降级3.隔离机制--各个服务接口隔离开4.限流机制--nignx 使用网关 限流模式主要是提前对各个类型的请求设置最高的QPS阈值,...
  • SpringBoot -- 熔断机制 Circuit Breaker

    千次阅读 2018-07-13 10:32:43
    Circuit Breaker熔断机制在微服务中必不可少,比如故障发生时怎么处理熔断:半熔断、熔断打开、熔断关闭 熔断关闭: 熔断关闭不会对服务进行熔断,当请求服务失败次数符合设定的规则则进入熔断机制 半熔断: 部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,079
精华内容 431
热门标签
关键字:

服务熔断机制