当前位置 博文首页 > 蜗牛为梦想而生H:09-熔断器Hystrix
在微服务的架构中,服务间通常会形成相互依赖的关系.
场景一: 比如现在有三个微服务节点:A,B和C,B为A的消费者,C为B的消费者。假如由于网络波动或者A服务自身故障,导致B调用A服务的线程被挂起进入长时间的等待。在高并发的情况下可能导致B的资源被耗竭随之崩溃,从而导致C服务也不可用。这种情况下 就是雪崩效应
场景二: 比如现在有三个微服务节点:A,B和C, A是消费者 B和C是A的提供者,A如果想要完成一个功能 必须同时成功调用B和C 如果B和C 有一个出现问题 则A也会导致挂起,高并发的情况下 A的资源也会耗尽 最终崩溃
1: 服务提供者不可用 1.1: 硬件故障,硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问. 1.2: 程序Bug,程序出现bug,一直无法响应 1.3: 缓存击穿,缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端,造成服务提供者超负荷运行,引起服务不可用 1.4: 用户大量请求 在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用. ? 2: 重试加大流量 2.1: 用户重试在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单 2.2: 代码逻辑重试服务消费端的会存在大量服务异常后的重试逻辑。这些重试都会进一步加大请求流量。 ? 3: 服务调用者不可用 3.1: 同步等待造成的资源耗尽,当服务消费者使用同步调用时,会产生大量的等待线程占用系统资源。一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态,于是服务雪崩效应产生了。 ?
1.3. 报错演示
?
2. 服务降级
服务降级:表示一组服务,优先保证核心服务,或者正常的服务调用的同时,对不可用或者弱可用的服务,直接返回一个结果,不让线程进行等待 ? 服务降级可以在消费者 也可以在提供者
2.1. 消费者端添加依赖
?<dependency> ? ? ? ? ? ?<groupId>org.springframework.cloud</groupId> ? ? ? ? ? ?<artifactId>spring-cloud-starter-netflix-hystrix</artifactId> ? ? ? ?</dependency>
2.2. 消费者端开启熔断
2.3. 控制器添加
?
2.4. 测试
?
2.5. 整个控制器配置
2.6. 测试
?
2.7. 开发中的配置
1:由于熔断可以写在消费者端,也可以写在提供者端,也可以两端都写,那么由于消费者访问提供者是有返回值类型的,那么我们的callback方法 也应该有对应的返回类型要求,否则将会二次报错 (ResponseEntity统一返回值类型的好处) ? ? 2:我们一个服务有可能又是提供者又是消费者,所以能不能做到很灵活 比如想让谁处理 谁处理
2.8. Feign接口工程中添加类
?
2.9. 接口中添加
?
2.10. 处理端开启hystrix
因为我们把熔断这个事,放到了OpenFeign的接口中,所以如果是提供者处理 就在提供者的配置文件中开启 如果是消费者处理,就在消费者配置文件中开启
?
2.11. 控制器中的内容可以去掉
?
3. 超时问题
3.1. 问题演示
?
?
3.2. 问题说明
因为我们设置了OpenFeign的超时时间是5秒,也就是说这5秒内返回数据都是正常的,但是当我们延时的时间在OpenFeign的范围内,也访问不到数据,触发了Hystrix,因为Hystrix的默认超时时间是1秒 如果1秒没有返回数据 默认熔断器打开 ?
3.3. 设置熔断器时间
hystrix: ? command: ? ? default: ? ? ? execution: ? ? ? ? isolation: ? ? ? ? ? thread: ? ? ? ? ? ? timeoutInMilliseconds: 6000 ## 一般设置的时间 大于等于OpenFeign的超时时间
3.4. 测试
?
4. 服务熔断
服务熔断:比如整个宿舍楼 所有的人都在看片,看到高潮的时候,此时由于功率过高,保险丝断了,这就是熔断 而Hystrix的熔断和保险丝还不一样,保险丝的熔断需要人为接上,而hystrix的熔断会自动再恢复
4.1. 熔断器状态
Closed ? ?? ?关闭状态(熔断器关闭) 所有请求正常访问 Open? ?? ?打开状态(熔断器打开) 所有请求都会被降级 Hystrix会对请求情况进行统计 如果当一定时间内失败请求达到默认值(默认是百分之50并且访问数不低于20次)时 触发熔断 此时熔断器会打开 此时请求直接超时 不会再等待 HalfOpen? ?? ?半打开状态 ? 当熔断器打开之后5秒(默认值) 会进入半打开状态 释放部分请求通过 如果释放的这些请求是还是有不正常的 ?那么进入打开状态 然后再5秒进去半打开状态 然后请求的情况 是否再次进入打开状态(一直循环)?? ?
4.2. 熔断器的配置
?
4.3. 遗憾的事情
?
cs下一篇:没有了
最新 更多<<
蜗牛为梦想而生H:09-熔断器Hystrix ASP.NET Core 实现基本认证的示例代码 深入解读ASP.NET Core身份认证过程实现 Asp.Net Core 企业微信静默授权的实现 手把手教你AspNetCore WebApi认证与授权的方法 手把手教你AspNetCore WebApi数据验证的实现 .NET Core使用FluentEmail发送邮件的示例代码 .Net Core中使用Grpc的方法 UrlRewrite概念原理及使用方法解析 蜗牛为梦想而生H:流量防卫兵sentinel Docker结合.Net Core的初步使用教程 蜗牛为梦想而生H:JAVA8 之 Stream sorted() 示例,排序 .Net Core3.0 配置Configuration的实现 .NET Core3.0创建Worker Services的实现 蜗牛为梦想而生H:SQL加减乘除 .NET Core3.0 日志 logging的实现 蜗牛为梦想而生H:过滤器无法取值RedisTemplate , 为Null解决方 详解ASP.NET Core 反向代理部署知多少 蜗牛为梦想而生H:RedisTemplate.keys() 替换为Scan 扫描指定Key net core webapi多版本控制与swagger(nswag)配置教程 蜗牛为梦想而生H:RedisAtomicInteger原子自增 .NET Core使用Topshelf方式创建Windows服务的全过程记录 ASP.NET Core使用JWT认证授权的方法 蜗牛为梦想而生H:RedisTmaple Java操作 .NET Core如何进行请求转发的实现 蜗牛为梦想而生H:定时任务-简单使用 .NET或.NET Core Web APi基于tus协议实现断点续传的示例 蜗牛为梦想而生H:定时任务/线程排队 .NET Core Web APi大文件分片上传研究实现 蜗牛为梦想而生H:Springboot过滤器拦截器配置