springCloud-服务隔离Hystrix

服务隔离Hystrix

Hystrix可以提供服务隔离(限流),服务熔断等功能

服务隔离,可以将不同的请求的使用资源做限制,比如服务中有AB两个接口,如果A接口背大量并发调用,占用了资源,导致B接口的调用由于各种原因(比如连接被用完,线程池被用完,阻塞等问题)会变得不可用,这时就可以使用服务隔离,来避免A接口对其他服务的影响,防止服务雪崩

<!-- maven依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

功能开启注解

//开启断路器功能
@EnableCircuitBreaker

功能使用

@HystrixCommand //在提供出来的接口上添加注解
@Override
public String queryTicket() {
	return "queryTicket";
}

配置参考:Hystrix完整配置列表 - throwable - 博客园 (cnblogs.com)

Hystrix服务隔离策略

Hystrix提供两种服务隔离策略execution.isolation.strategy

1-THREAD 线程池隔离策略 独立线程接收请求

2-SEMAPHORE 信号量隔离策略 在调用线程上执行

一般来说,使用线程池更快一点点,并发有一定锁竞争;使用信号量的资源开销更小,毕竟减少了线程池

//信号量注解配置方式
@HystrixCommand(
    commandKey = "queryDemo",
    groupKey = "querygroup-one",
    //降级方法
    fallbackMethod = "queryDemoFallback",
    commandProperties = {
        //最大并发数
        @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"),
        //隔离策略
        @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
        //超时时间
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
    }
)

//线程池
@HystrixCommand(
    commandKey = "queryDemo",
    groupKey = "querygroup-one",
    fallbackMethod = "queryDemoFallback",
    commandProperties = {
            @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
    },
    threadPoolKey = "my-hystrix-pool",
    threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "10")}
)

其中 fallbackMethod 参数配置的是服务降级方法

Hystrix 数据监控 dashboard

Hystrix 进行服务熔断时会对调用结果进行统计,比如超时数、bad 请求数、降级数、异常数等等都会有统计,那么统计的数据就需要有一个界面来展示,hystrix-dashboard 就是这么一个展示 hystrix 统计结果的服务。

<!-- maven依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

启动类注解 @EnableHystrixDashboard

然后默认打开 http://监控服务的主机端口/hystrix 在界面中默认输入 http://{被监控服务的主机端口}/actuator/hystrix.stream 就可以得到以commonKey为单元的接口监控

如果无法得到监控数据,检查配置中访问控制,暴露服务

management.endpoints.web.exposure.include=*

Hystrix 熔断

服务熔断会在某些情况下,不在接受新的请求;就像电路短路时保险丝熔断;

熔断发生的三个必要条件:
1、有一个统计的时间周期,滚动窗口
相应的配置属性 metrics.rollingStats.timeInMilliseconds
默认 10000 毫秒
2、请求次数必须达到一定数量
相应的配置属性 circuitBreaker.requestVolumeThreshold
默认 20 次
3、失败率达到默认失败率
相应的配置属性 circuitBreaker.errorThresholdPercentage
默认 50%

上述 3 个条件必须全部满足才能开启 hystrix 的熔断功能

如果配置了服务降级方法,则会进入降级方法

熔断器的三个状态:
1、关闭状态 circuit: open
关闭状态时用户请求是可以到达服务提供方的
2、开启状态 circuit: closed
开启状态时用户请求是不能到达服务提供方的,直接会走降级方法
3、半开状态
当 hystrix 熔断器开启时,过一段时间后,熔断器就会由开启状态变成半开状态。半开状态的熔断器是可以接受用户请求并把请求传递给服务提供方的,这时候如果远程调用返回成功,那么熔断器就会有半开状态变成关闭状态,反之,如果调用失败,熔断器就会有半开状态变成开启状态。

Hystrix 功能建议在并发比较高的方法上使用,并不是所有方法都得使用的。部分情况可以用于防网络抖动(也可以用其他方式ribbon或者retry)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值