springcloud:Hystrix,思想学习,场景业务解决,服务监控(2)

简介: springcloud:Hystrix,思想学习,场景业务解决,服务监控(2)

服务熔断 : 实力模块编写

其实,服务熔断就是一种调用机制,


他来判断什么时候触发服务熔断,达到触发雕件,就暂停服务的使用,调用服务降级,和并且在一定时间或者是其他条件的完成尝试重启服务


马丁福勒提出的理论:https://martinfowler.com/bliki/CircuitBreaker.html


修改业务类cloud-provider-hystrix-payment8001


//服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",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("id") Integer id){
    if (id < 0){
        throw new RuntimeException("*****id 不能负数");//抛出异常
    }
    String serialNumber = IdUtil.simpleUUID();
    return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
    return "id 不能负数,请稍候再试,(┬_┬)/~~     id: " +id;
}


CONTROLLER编写

//===服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
    String result = paymentService.paymentCircuitBreaker(id);
    log.info("*******result:"+result);
    return result;
}

之后我们测试

一直用参数为-1的错误请求访问

之后访问正确的请求(参数为正数)会发现

服务暂时调用不了正确的业务代码

多次错误,然后慢慢正确,发现刚开始不满足条件,就算是正确的访问地址也不能进行访问,等待片刻之后就可以访问到了

原理(小总结)


熔断类型


熔断打开:

请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入熔断状态


熔断关闭:

熔断关闭不会对服务进行熔断,而是暂时关闭服务,等待片刻就会进入半开状态


熔断半开:

部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断


官网的流程步骤:

1.png


什么时候会触发熔断呢?

1.png

涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。


快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。

错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。

断路器开启或者关闭的条件


当满足一定阀值的时候(默认10秒内超过20个请求次数)

当失败率达到一定的时候(默认10秒内超过50%请求失败)

到达以上阀值,断路器将会开启

当开启的时候,所有请求都不会进行转发

一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5

断路器打开之后


再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

原来的主逻辑要如何恢复呢?

对于这一问题,hystrix也为我们实现了自动恢复功能。

当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回

那么断路器将继续闭合,

主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。


下面是触发条件全部配置解读

:@HystrixCommand(fallbackMethod = "str_fa1lbackMethod",
groupKey = "strGroupCommand",
commandKey = "strCommarld" ,
threadPoolKey = "strThreadPoo1",commandProperties = {
//设置隔离策略,THREAD表示线程池SEMAPHORE:信号池隔离
@HystrixProperty(name = "execution.isolation.strategy" , value = "THREAD"),
//当隔离策略选择信号地隔离的时候,用来没置信号地的大小(最大并发数)
@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests" , value="10"),
//配置命令执行的超时时间
@HystrixProperty(name = "execution.isolation.thread.timeoutinNilliseconds",value = "10"),
//是否启用超时时间
@HystrixProperty(name = "execution.timeout.enabled" , value = "true"),
//执行超时的时候是否中断
@HystrixProperty(name ="execution.isolation.thread.interruptOnTimeout", value = "true"),
    //执行被取消的时候是否中断
CHystrixProperty(name = "execution.isolation.thread.interruptOnCance1",value = "true"),
//允许回调方法执行的最大并发数
@HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "10"),
//服务降级是否启用,是否执行回调函数
@HystrixProperty(name = "fallback.enabled", value = "true"),
//断路器是否启用
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
//该属性用来没置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20 的时候,
//如果滚动时间窗(默认10秒)内仅收到了19个请求,即使这19个请求都失败了,断路器也不会打开。
    @HystrixProperty(name = "circuitBreaker.requestVo1umeThreshold", value = "20"),
//该属性用来设置在滚动时间窗中,表示在滚动时间窗中,在请求数量超过
// circuitBreaker.requestVolumeThreshold 的情况下,如果错误请求数的百分比超过50,/就把断路器没置为“打开”状态,否则就没置为“关闭”状态。
CHystrixProperty(name ="circuitBreaker.errorThresholdPercentage", value = "50"),
//该属性用来没置当断路器打开之后的休眠时间窗。休眠时间窗结京之后,
//会将断路器置为“半开”状态,尝式熔断的请求命令,如果依然失败就将断路器继续设置为“打开”状态,//如果成功就没置为“关闭”状态。
@HystrixProperty(name = "circuitBreaker.sleepWindowinMilliseconds", value = "5000"),
//断路器强制打开
CHystrixProperty(name = "circuitBreaker.forceOpen", value = "fa1se"),
//断路器强制关闭
CHystrixProperty(name = "circuitBreaker.forceclosed" , value = "false"),
    //滚动时间窗没置,该时间用于断路器判断健康度时需要收集信息的持续时间
CHystrixProperty(name = "metrics.rollingStats.timeinMilliseconds",value = "10000"),
//该属性用来设置滚动时间窗统计指标信息时划分"桶""的数量,断路器在收集指标信息的时候会根据/设置的时间窗长度拆分成多个“桶”来累计各度量值,每个”桶"记录了一段时间内的采集指标。
//比如10秒内拆分成10个"桶"收集这样,所以 timeinMilliseconds必须能被numBuckets整除。否则会抛异常
    @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10""),
//滚动时间窗没置,该时间用于断路器判断健康度时需要收集信息的持续时间
@HystrixProperty(name = "metrics.rollingStats.timeinMilliseconds",value = "10000"),
//该属性用来没置滚动时间窗统计指标信息时划分"捅"的数量,断路器在收集指标信息的时候会根据
//没置的时间窗长度拆分成多个“桶”来累计各度量值,每个”桶"记录了一段时间内的采集指标。
//比如10秒内拆分成10个"糖""收集这样,所以timeinWilliseconds必须能被numBuckets整除。否则会抛异常
   @HystrixProperty(name = "metrics.rollingStats.numBuckets",value = "10"),
//该属性用来设置对命令执行的延迟是否使用百分位数来跟踪和计算。如果没置为false,那么所有的概要统计都将返回-1。
  @HystrixProperty(name = "metrics.rollingPercentile.enabled",value = "false"),
//该属性用来没置百分位统计的滚动窗口的持续时间,单位为毫秒。
@HystrixProperty(name ="metrics.rollingPercenti1le.timeInNilliseconds" , value = "60000"),
 //该属性用来设置百分位统计滚动窗口中使用A捅”的数量。
@HystrixProperty(name ="metrics.rollingPercentile.numBuckets" , value = "60000"),
//该属性用来设置在执行过程中每个“桶”中保留的最大执行次数。如果在滚动时间窗内发生超过该没定值的执行次数,
//就从最初的位置开始重写。例如,将该值没置为100,滚动窗口为10秒,若在10秒内一个“桶”中发生了500次执行,
//那么该“桶”中只保留最后的190-次执行的统计。另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。
  @HystrixProperty(name = "metrics.rollingPercentile.bucketSize", value = "100"),
//该属性用来没置采集影响断路器状态的健康快照(请求的成功、错误百分比)的间隔等待时间。
                                                                                  @HystrixProperty(name = “metrics.healthSnapshot.intervalinMilliseconds", value = "500"),
                                                                                                   //是否开启请求缓存
@HystrixProperty(name = "requestCache.enabled" , value = "true"),
//HystrixCommand的执行和喜件是否打印日志到 HystrixRequestLog中
@HystrixProperty(name = "requestLog.enabled", value = "true" ),
//设置时间百分比                                                                @HystrixProperty(name = "metrics.rollingPercentile.bucketSize",value = "100"),
/该属性用来没置采集影响断路器状态的健康快照(请求的成功、错误百分比)的间隔等待时间。CHystrixProperty(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 = "10"),
//该参数用来没置线程地的最大队列大小。当没置为-1时,线程她将使用SynchronousQueue 实现的队列,
//否则将使用LinkedBLockingQueue实现的队列。
@HystrixProperty(name = "maxQueueSize", value = "-1"),
//该参数用来为队列没置拒绝阈值。通过该参数,即使队列没有达到最大值也能拒绝请求。
//该参数主要是对LinkedBLockingQueue 队列的补充,因为LinkedBLockingQueue
//队列不能动态修改它的对象大小,而通过该属性就可以调整拒绝请求的队列大小了。
@HystrixProperty(name = "queueSizeRejectionThreshold" , value = "5"),
})

工作流程

github连接:https://github.com/Netflix/Hystrix/wiki/How-it-Works


hystrix工作流程


工作流程图:

1.png



步骤说明:

1.png



服务监控hystrixDashboard

除了隔离依赖服务的调用以外,Hystri还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过

hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。


搭建一个简单的模块


cloud-consumer-hystrix-dashboard9001


导入依赖


 

    <dependencies>
        <!--新增hystrix dashboard-->
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

配置yml(就一个端口号)


server:

 port: 9001


主启动类


@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardMain9001.class,args);
    }
}

我们需要:HystrixDashboardMain9001+新注解@EnableHystrixDashboard


我们要是要监控那一定要是倒入这个

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

断路器演示(服务监控HystrixDashboard)

修改:cloud-provider-hystrix-payment8001


PS: 注意:新版本Hystrix需要在主启动类MainAppHystrix8001中指定监控路径

1.png

@Bean
public ServletRegistrationBean getServlet(){
    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
    registrationBean.setLoadOnStartup(1);
    registrationBean.addUrlMappings("/hystrix.stream");
    registrationBean.setName("HystrixMetricsStreamServlet");
    return registrationBean;
}

到这里简单的服务监控就搞定了,启动测试 !


首先是填写监控地址

2.png



我们可以这样测试:


一直刷新错误的请求

查看监控,显示内容

之后访问正确查看显示内容

资源监控显示的


相关文章
|
1月前
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
106 1
|
13天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
46 3
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
消息中间件 存储 Java
SpringCloud基础9——服务异步通信-高级篇
消息可靠性、死信交换机、惰性队列、MQ集群
SpringCloud基础9——服务异步通信-高级篇
|
2月前
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
173 23
|
2月前
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
55 3
|
2月前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
58 1
|
3月前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
128 1
下一篇
无影云桌面