首页 > 其他 > 详细

Hystrix实现断路器

时间:2021-06-14 22:54:19      阅读:19      评论:0      收藏:0      [点我收藏+]

Hystrix实现断路器

核心依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
		<!-- hystrix-javanica 在starter-hystrix中默认会包含一个,可以不引入 -->
        <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-javanica</artifactId>
            <version>1.5.9</version>
        </dependency>		

使用

  • 在服务的启动类中添加注解

    @SpringBootApplication
    @EnableCircuitBreaker
    public class Application
    {
        ......
    }
    

    如果不使用注解@EnableCircuitBreaker,断路器不会启用.

  • 在需要调用服务的地方添加注解

    @HystrixCommand
    public List<Object> getSomeInfo(String infoId)
    {
        .......
    }
    

    只要添加了注解@HystrixCommand,在调用方法的时候,如果调用超时,断路器将会中断对此方法的调用.

HystrixCommand注解的参数

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
    String groupKey() default "";

    String commandKey() default "";

    String threadPoolKey() default "";

    String fallbackMethod() default "";

    HystrixProperty[] commandProperties() default {};

    HystrixProperty[] threadPoolProperties() default {};

    Class<? extends Throwable>[] ignoreExceptions() default {};

    ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;

    HystrixException[] raiseHystrixExceptions() default {};
}

  • groupKey

    一组 Hystrix 命令的集合, 用来统计、报告,默认取类名.

  • commandKey

    HystrixCommand 命令的key值,默认值为注解方法的名称*

  • fallbackMethod

    如果远程调用失败,会调用此方法.

    回调方法必须和@HystrixCommand在同一个类中,并且此属性值与调用类有相同的方法签名.

    如果值不存在,会抛出异常.

  • threadPoolKey

    让@HystrixCommand拥有一个唯一的名称,并且创建一个独立于默认线程池的线程池.

    如果没有定义任何值,则使用默认线程.

  • threadPoolProperties

    用于配置线程池的行为

  • coreSize

    设置线程池的大小.

    默认10.

  • maxQueueSize

    设置线程池最大队列大小.

    如果值为-1,不适用队列.Hystrix会阻塞请求,直到有一个线程可用来处理.

    默认-1.

  • circuitBreaker.requestVolumeThreshold

    设置Hystrix开始检查断路器是否跳闸前,必须处理的最小请求数.

    只能够在commandPoolProperties属性中设置.

    默认20.

  • circuitBreaker.errorThresholdPercentage

    断路器跳闸前,必须达到的故障率百分比.

    只能够在commandPoolProperties中设置.

    默认50.

  • circuitBreaker.sleepWindowInMilliseconds

    断路器跳闸后,Hystrix尝试进行服务调用之前需要等待的时间.时间单位:毫秒.

    只能够在commandPoolProperties中设置.

    默认5000.

  • metricsRollingStats.timeInMilliseconds

    Hystrix收集和监控服务调用的统计信息滚动窗口.时间单位:毫秒.

    默认值1000.

  • metricsRollingStats.numBuckets

    Hystrix在监控窗口中维护的度量桶的数量.

    监视窗口内桶数量越多,Hystrix在窗口内监控故障的时间越低.

    ”metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0"必须为true,否则会抛出异常。

    默认10.

  • execution.isolation.thread.timeoutInMilliseconds

    指定Hystrix在超时调用之前等待的时间.

关于所有的HystrixProperty,可以在相关jar包的以下路径中查看:

hystrix-javanica-1.5.9.jar!\com\netflix\hystrix\contrib\javanica\conf\HystrixPropertiesManager.class

后备模式

根据上面的注解,后备模式只需要在注解中声明后备方法,并且在当前类中定义好后备方法即可.

舱壁模式

为什么使用舱壁模式

如果在使用多个微服务协同完成多个任务,这些服务调用都使用同一批线程.

但是这个线程时为了处理整个Java容器而预留的.

所以如果存在大量请求的情况下,如果某些服务器出现了问题,会导致线程池满并且其它请求会等待处理,阻塞新请求.

技术分享图片

使用舱壁模式能够让远程资源调用被隔离到一个新的线程池中.如果一个服务.调用出现了鼓掌,也不会影响其它的服务调用.

技术分享图片

如何配置

  • 配置独立的线程池
  • 设置线程池中的线程数量
  • 设置线程繁忙时的队列大小

举例:

@HystrixCommand(
	fallbackMethod = "fallbackMethod"
    threadPoolKey = "newThreadPool"
    threadPollProperties = {
        @HystrixProperty(name = "coreSize", value = "15")
        @HystrixProperty(name = "maxQueueSize", value = "12")
    }
)
public Object getValue()
{
    ......
}

对于线程池大小的设置,Netflix给出公式:

(requests per second at peak when the service is healthy * 99th percentile latency in
seconds) + small amount of extra threads for overhead
每秒最大支撑的请求数 × 99%的请求的平均响应时间 + 缓存值

maxQueueSize只能够在线程池首次初始化时设置.

但是也可以使用queueSizeRejectionThreshold属性动态调整队列大小.

不过只有首次初始化的 maxQueueSize >0 的时候有效.

Hystrix实现断路器

原文:https://www.cnblogs.com/reclusiveone/p/14882930.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!