SpringCloud(3)——Hystrix

本文详细介绍了服务雪崩的概念及其危害,重点解析了SpringCloud中的Hystrix框架如何实现服务隔离,包括信号量和线程池策略。同时,探讨了Hystrix的服务降级机制,如何定义降级方法以提供友好的异常处理。最后,展示了如何配置和使用Hystrix Dashboard进行数据监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、服务雪崩

整个微服务系统中,有一个节点的某个接口功能出现异常情况,就有可能在高并发的情况下导致调用它的上游系统出现响应延迟,直到 tomcat 连接池耗尽,导致调用该服务节点其他正常接口都失败的现象,这就是服务雪崩现象

二、服务隔离

就是只允许这个接口最多能接受多少的并发,做了这样的限制后,该接口的主机就会空余线程出来接收其他请求,不会被哪个坏了的接口占用满

三、Hystrix

一个不错的服务隔离框架

3.1 使用

1)导包

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2)项目启动类上开启对应功能

//开启断路器功能
@EnableCircuitBreaker

3)对应方法上使用注解配置

@Service
public class TicketServiceImpl implements TicketService {

    @HystrixCommand
    @Override
    public String queryTicket() {
        return "queryTicket";
    }
}

即可使用Hystrix 服务隔离功能

3.2 Hystrix 的服务隔离策略

有信号量策略、线程池策略两种

可以在@HystrixCommand注解属性中进行配置

@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"

除此之外,@HystrixCommand注解还有以下属性

    /**
     * Command属性
     * execution.isolation.strategy  执行的隔离策略
     * THREAD 线程池隔离策略  独立线程接收请求
     * SEMAPHORE 信号量隔离策略 在调用线程上执行
     * <p>
     * execution.isolation.thread.timeoutInMilliseconds  设置HystrixCommand执行的超时时间,单位毫秒
     * execution.timeout.enabled  是否启动超时时间,true,false
     * execution.isolation.semaphore.maxConcurrentRequests  隔离策略为信号量的时候,该属性来配置信号量的大小,最大并发达到信号量时,后续请求被拒绝
     * <p>
     * circuitBreaker.enabled   是否开启断路器功能
     * circuitBreaker.requestVolumeThreshold  该属性设置在滚动时间窗口中,断路器的最小请求数。默认20,如果在窗口时间内请求次数19,即使19个全部失败,断路器也不会打开
     * circuitBreaker.sleepWindowInMilliseconds    改属性用来设置当断路器打开之后的休眠时间,休眠时间结束后断路器为半开状态,断路器能接受请求,如果请求失败又重新回到打开状态,如果请求成功又回到关闭状态
     * circuitBreaker.errorThresholdPercentage  该属性设置断路器打开的错误百分比。在滚动时间内,在请求数量超过circuitBreaker.requestVolumeThreshold,如果错误请求数的百分比超过这个比例,断路器就为打开状态
     * circuitBreaker.forceOpen   true表示强制打开断路器,拒绝所有请求
     * circuitBreaker.forceClosed  true表示强制进入关闭状态,接收所有请求
     * <p>
     * metrics.rollingStats.timeInMilliseconds   设置滚动时间窗的长度,单位毫秒。这个时间窗口就是断路器收集信息的持续时间。断路器在收集指标信息的时会根据这个时间窗口把这个窗口拆分成多个桶,每个桶代表一段时间的指标,默认10000
     * metrics.rollingStats.numBuckets   滚动时间窗统计指标信息划分的桶的数量,但是滚动时间必须能够整除这个桶的个数,要不然抛异常
     * <p>
     * requestCache.enabled   是否开启请求缓存,默认为true
     * requestLog.enabled 是否打印日志到HystrixRequestLog中,默认true
     *
     * @HystrixCollapser 请求合并
     * maxRequestsInBatch  设置一次请求合并批处理中允许的最大请求数
     * timerDelayInMilliseconds  设置批处理过程中每个命令延迟时间
     * requestCache.enabled   批处理过程中是否开启请求缓存,默认true
     * <p>
     * threadPoolProperties
     * threadPoolProperties 属性
     * coreSize   执行命令线程池的最大线程数,也就是命令执行的最大并发数,默认10
     */

四、Hystrix的服务降级

服务降级是对服务调用过程的出现的异常的友好封装,当出现异常时,我们不希望直接把异常原样返回,所以当出现异常时我们需要对异常信息进行包装,抛一个友好的信息给前端

在@HystrixCommand注解中指定降级方法

@HystrixCommand(fallbackMethod = "queryContentsFallback",

自定义降级方法queryContentsFallback即可,注意该方法返回类型要和业务方法一致

五、Hystrix的数据监控

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

1)导包

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

2)项目启动类开启监控功能

@EnableHystrixDashboard

3)配置文件指定监控地址

server.port=9990
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

eureka.server.enable-self-preservation=false

management.endpoints.web.exposure.include=*

4)访问

监控界面:http://localhost:9990/hystrix

需要监控的端点(使用了hystrix组件的端点):http://localhost:8083/actuator/hystrix.stream

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值