概述

分布式系统面临的问题

  • 有人崩了可咋弄

  • 服务雪崩:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他微服务,这就是所谓的扇出。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即雪崩效用
  • 对于高流量的应用来说,单一的后端依赖可能会导致所有的服务器上的所有资源都在几秒钟内饱和。这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理。以便单个依赖关系的失败,不能取消整个应用程序或系统。

Hystrix是什么

  • 一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,失败,异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。

  • 断路器本身就是一个开关装置,当某个服务单元发生故障时,通过断路器的故障监控,向调用方返回一个符合预期,可处理的备选响应,而不是长时间等待,这样保证服务调用方不会被长时间的占用造成整个系统崩坏

能干啥

  • 降级
  • 熔断
  • 接近实时监控

官网

  • https://github.com/Netflix/hystrix/wiki

Hystrix重要概念

服务降级

  • 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
  • 程序运行异常
  • 超时
  • 服务熔断触发服务降级
  • 线程池/信号量也会导致服务降级

服务熔断

  • 类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
  • 服务的降级->进而熔断->恢复调用链路

服务限流

  • 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

Hystrix案例

构建cloud-provider-hystrix-payment8001

编写pom

<dependencies><!--hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.hsw.cloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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: 8001
spring:application:name: cloud-provider-hystrix-payment
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

主启动


service

@Service
public class PaymentService {/*** 正常访问** @param id* @return*/public String paymentInfo_OK(Integer id) {return "线程池:" + Thread.currentThread().getName() + " paymentInfo_OK,id:" + id + "\t" + "O(∩_∩)O哈哈~";}/*** 超时访问** @param id* @return*/public String paymentInfo_TimeOut(Integer id) {int timeNumber = 3;try {// 暂停3秒钟TimeUnit.SECONDS.sleep(timeNumber);} catch (InterruptedException e) {e.printStackTrace();}return "线程池:" + Thread.currentThread().getName() + " paymentInfo_TimeOut,id:" + id + "\t" +"O(∩_∩)O哈哈~  耗时(秒)" + timeNumber;}
}

controller

@RestController
@Slf4j
public class PaymentController {@Resourceprivate PaymentService paymentService;@Value("${server.port}")private String servicePort;/*** 正常访问** @param id* @return*/@GetMapping("/payment/hystrix/ok/{id}")public String paymentInfo_OK(@PathVariable("id") Integer id) {String result = paymentService.paymentInfo_OK(id);log.info("*****result:" + result);return result;}/*** 超时访问** @param id* @return*/@GetMapping("/payment/hystrix/timeout/{id}")public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {String result = paymentService.paymentInfo_TimeOut(id);log.info("*****result:" + result);return result;}
}

以上述为基础逐步演示降级,熔断,降级

消费者80新建加入
新建cloud-consumer-feign-hystrix-order80
编写pom

<dependencies><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.hsw.cloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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: 80
eureka:client:register-with-eureka: falsefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

主启动

service

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {/*** 正常访问** @param id* @return*/@GetMapping("/payment/hystrix/ok/{id}")String paymentInfo_OK(@PathVariable("id") Integer id);/*** 超时访问** @param id* @return*/@GetMapping("/payment/hystrix/timeout/{id}")String paymentInfo_TimeOut(@PathVariable("id") Integer id);}

controller

如果此时压测8001,正常浏览器访问80时候会发现在转圈圈显示不出来信息。

如何解决

  • 超时导致等待:超时不再等待
  • 出错:出错要有兜底方案
  • 对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)down机了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)ok,调用者(80)自己有故障或有自我要求(自己的等待时间小于服务提供者)

服务降级

  • 8001降级
  • 80降级

8001降级

  • 用配置代替编码
  • 主启动类激活
  • 结果
  • 如果发生异常也会找到兜底方案。

80降级

  • 题外话:我们自己配置过的热部署方式对java代码的改动明显,但对@HystrixCommand内属性的修改建议重启微服务

  • 增加pom

<!--hystrix-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 修改yml
  • 主启动增加注解

  • 修改业务类增加兜底方案


出现的问题

  • 每个业务方法对应一个兜底的方法,代码膨胀
  • 兜底方案和业务逻辑混合在一起

解决方法

  • 使用@DefaultProperties(defaultFallback="")
  • 如果没有特别指定兜底方案就用默认的


业务逻辑混合在一起的解决方案

  • 本案例服务降级的处理是在客户端80实现完成的,与服务端8001没有关系
  • 只需要为Feign客户端定义的接口添加一个服务降级处理的实现类即可实现解耦

  • 添加一个类实现此接口
  • 注解增加新的参数

  • 把以前的降级手段注释掉(就是一些注解)
  • 关闭8001服务
  • 访问一下

服务熔断

  • 熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
  • 当检测到该节点微服务调用响应正常后,恢复调用链路
  • 在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务之间调用状况
  • 当失败调用达到一定阈值,缺省5s内20次调用失败,就会启动熔断机制,熔断机制的注解就是@HystrixCommand
  • 相关论文

修改8001服务

  • requestVolumeThreshold:触发熔断的最小请求次数,默认20

  • errorThresholdPercentage:失败率达到多少后跳闸

  • sleepWindowInMilliseconds:休眠时长,熔断多少次后尝试请求,默认是5000毫秒

  • 增加controller方法

  • 疯狂访问负数id,然后即使恢复访问正数依然是调用兜底降级方法,一会后恢复正常访问

总结
熔断类型

  • 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断的状态
  • 熔断关闭:熔断关闭不会对服务进行熔断
  • 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

官网断路器流程图

限流先不说alibaba的Sentinel说明

服务监控hystrixDashboard

  • 除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(HystrixDashboard),Hystrix会持续地记录所有通过Hystrix发起的请求执行信息,并以统计报表和图型的形式展示给用户,包括每秒执行多少请求,多少成功,多少失败等,Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合。对监控内容转化成可视化界面

新建模块cloud-consumer-hystrix-dashboard9001
编写pom

<description>hystrix监控</description><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

编写主类,注意添加注解,开启dashboard


所有微服务提供这都需要监控依赖

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

以监控hystrix8001为例

  • 8001主类中增加如下,不然监控不到

  • http://localhost:9001/hystrix

  • 七色

  • 一圈
    共有两种含义,通过颜色变化代表了实例的健康程度,它的健康从绿色<黄色<橙色<红色递减
    大小会根据请求的流量发生变化,流量越大实心圆越大。所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例

  • 一线
    记录2分钟内流量相对变化,通过它来观察到流量的上升和下降趋势



SpringCloud-Hystrix断路器相关推荐

  1. SpringCloud中 Feign结合Hystrix断路器开发。

    Feign结合Hystrix断路器开发: 转载于:https://www.cnblogs.com/longdb/p/10468371.html

  2. 深入了解SpringCloud Hystrix

    雪崩效应即在多个服务节点当中,如果有一个服务不可用而这个不可用的服务导致整个应用资源都耗在这里,进而影响整个系统的崩溃.在分布式环境中,不可避免地会出现雪崩效应.Hystrix是一个netflix实现 ...

  3. springcloud Feign断路器实战和问题总结

    springcloud Feign断路器实战和问题总结 断路由是防止该服务调用其他外服务时,外服务宕机或者出差时,影响到本服务的宕机,引起大面积的瘫痪,所以才有了断路由的由来. springcloud ...

  4. springcloud gateway断路器抛的错default failed and fallback disabled

    有没有springcloud的大神碰到这个问题? 这是springcloud gateway断路器抛的错 default failed and fallback disabled., httpStat ...

  5. SpringCloud Hystrix熔断器

    SpringCloud Hystrix熔断器 15.Hystrix熔断器:简介及作用 目标:理解Hystrix的作用 介绍:Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制. ...

  6. 五、Hystrix断路器

    Hystrix断路器 概述 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每一个依赖关系在某些时候将不可避免的失败. 服务雪崩 多个微服务之间调用的时候,假如微服务A调用微服务 ...

  7. Hystrix断路器原理及实现(服务降级、熔断、限流)

    Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...

  8. 微服务——Hystrix断路器(豪猪哥)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 概述 分布式系统面临的问题 是什么 能干嘛 Hystrix重要概念 服务降级(fallback) 哪些情况会触发降级 服务熔 ...

  9. SpringCloud07 - Hystrix 断路器

    扯淡: 服务与服务之间有业务关联就需要调用,当被调用的服务发生故障(上线后多半是由于网路原因导致连接超时),必然会波及到服务调用者.通俗讲,断路器就是在低层级的服务发生故障时将服务间的连接断开. 个人 ...

  10. SpringClound——Hystrix断路器

    SpringCloud学习资料汇总超级棒的 如上是我在看文章时忽然看到的一个很好的学习SpringCloud的网站 SpringClound--微服务概述--史上最烂 SpringClound--Sp ...

最新文章

  1. 008_Redis的ZSet数据类型
  2. jquery插件的写法
  3. wifi的基础知识及原理1
  4. mfc获取别的计算机是否在线,VC获取并修改计算机屏幕分辨率(MFC)
  5. 如何编写提供了IDisposable接口的类.
  6. html作业本,小鹅通作业本使用教程
  7. labview和python混编_将数据从LabView发送到Python并取回
  8. python中0o10_Python中最常见的10个问题(列表)
  9. 解决在使用pip进行安装时的Could not install packages due to an EnvironmentError的问题
  10. mysql 支持嵌套查询吗_【转】MySql 嵌套查询
  11. elementui el-dialog 离顶部的位置_人眼距离屏幕合适位置该怎么算?
  12. 【基础】格林尼治时间转化
  13. MUI-grid(栅格),超小屏xs和小屏幕sm
  14. android用户界面组件都是放置在,Android开发工程师第十章 节 用户界面高级组件.ppt...
  15. 每个机器学习工程师都应该知道的机器学习算法
  16. UWB室内定位技术有什么风险呢?
  17. lqc_shell批量操作linux主机
  18. 蘑菇街财报:曾经电商第四极的直播末路
  19. gear s3刷android wear,三星gear s3怎么刷机教程 三星gear s3刷机方法流程
  20. 哪里能买到华强北真正洛达的airpods?

热门文章

  1. 从RDA平台屏驱动分析platform_driver_register、platform_device_register
  2. ar模型matlab fpe,基于Matlab的AR模型参数估计.pdf
  3. 手机桌面提醒工具 S60V5
  4. IDES ABAP/4破解及client copy [转]
  5. 网页性能优化实战之CPU拉满问题处理
  6. 文字无限无缝滚动效果——和派孔明
  7. python办公自动化代码_[Python] 自动化办公 邮件操作基础知识及代码(下)
  8. MCU-MBD单元测试流程
  9. 利用微信公众号搭建天气查询
  10. AI与全民开发:挑战和机会并存