hystrix概述:
作为spring cloud体系内实现熔断机制的关键组件,hystrix承担着服务容错保护的重要职责。
它由netflix开源,旨在为分布式系统提供延迟处理和容错kb88凯时官网登录的解决方案。
其核心作用在于引入延迟容忍与容错逻辑,精细管理分布式服务间的交互,确保系统的高可用性和鲁棒性。
在复杂分布式系统环境中,往往涉及数十个应用,这些应用依赖于多个项目。
不可避免地,每个依赖项目都有可能在某个时刻遭遇失败并触发故障。
若未对这些故障实施有效隔离措施,整个分布式系统可能面临崩溃风险。
在分布式系统中,当某个环节出现延迟时,可能会阻塞整个用户请求。
特别是在高流量情况下,后端依赖的延迟可能迅速导致全部服务资源在短短几秒内耗尽,从而无法处理后续请求,使应用发生故障。
更严重的是,这些问题还可能引发服务间延迟累积,占用备份队列、线程等关键资源,触发连锁反应般的级联故障。
为应对这些挑战,hystrix应运而生。
它通过封装每一个依赖项,实现它们之间的相互隔离。
一旦延迟发生,问题被限制在局部资源中,并包含回退逻辑,该逻辑决定在依赖失败时应采取何种措施,确保系统的稳定性。
第一个hystrix程序
步骤1:创建父工程hystrix-1
将搭建的eureka基本应用中的3个子项目都复制到hystrix-1父工程中,并依次添加为maven项目。
步骤2:改造服务提供者
在服务提供者eureka-provider中创建controller包,并在该包下创建hystrixcontroller类,该类定义了一个demo ()方法,用于处理路径为/demo的请求。
hystrixcontroller类的内容如下:
步骤3:改造服务消费者为hystrix客户端
流程:
(1)添加hystrix依赖
(2)添加@enablehystrix注解
(3)创建config配置类
(4)创建service层类
(5)创建controller层类
(1)添加hystrix依赖
在项目eureka-consumer的pom文件中添加hystrix的依赖如下:
org.springframework.cloud spring-cloud-starter-netflix-hystrix
添加后重新加载pom文件。
(2)添加@enablehystrix注解
在启动类eurekaconsumerapplication中添加@enablehystrix注解启动熔断功能。
(3)创建config配置类
在eureka-consumer中创建config包,并在该包下创建类hystrixconfig。在hystrixconfig类中注入resttemplate的bean对象。
(4)新建service包
在service包下新建localitemservice类
被@hystrixcommand注解修饰的demo()方法就启动了hystrix熔断器的功能fallbackmethod属性定义的是处理回退(fallback)逻辑的方法。如果必须在fallback逻辑方法中远程调度其他服务,最好在远程调度其他服务时,也加上熔断器。
注:@autowired注解不能运行时可换成@resource注解,按bean的名称装配。
(5)新建controller包
在controller包下新建localitemcontroller类
步骤4:项目测试
启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=布说,观察浏览器显示的效果。
关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。
在feign中使用hystrix
创建父工程hystrix-2,将上述中的3个子项目都复制到hystrix-2父工程中,并依次添加为maven项目。
步骤1:开启hystrix熔断
feign自带熔断功能,默认情况下,熔断功能是关闭的。如果要开启熔断,只需在配置文件中将hystrix.enabled设置为true即可。
开启hystrix熔断功能。在eureka-consumer项目的配置文件application.yml中添加开启熔断的配置:
注:因为在feign的起步依赖中引入了hystrix依赖,所以在feign中使用hystrix不需要引入任何的依赖,只需要在配置文件中开启即可。
步骤2:开启feign client功能
因为使用feign组件调用,需要在eureka-consumer项目的pom文件中加入feign依赖。
在项目eureka-consumer的pom文件中添加feign的依赖如下:
org.springframework.cloud spring-cloud-starter-openfeign
添加后重新加载pom文件。
在eureka-consumer的启动类中添加@enablefeignclients开启feign client功能。
注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@feignclient注解修饰的接口。
步骤3:修改项目中接口
在service包中新建失败逻辑处理类localbushuoserviceimpl,并实现被@feignclient修饰的localitemservice接口。
进入项目eureka-consumer,删除掉之前的localitemservice类。创建localitemservice接口,并在上方的@feignclient注解中,增加fallback属性配置,指定localitemserviceimpl类为失败逻辑处理类。
注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@feignclient注解修饰的接口。
步骤4:项目测试
启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=www,观察浏览器显示的效果。
关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。
问题
1.hystrix 是怎么实现服务容错的?
hystrix 主要通过以下几点实现服务容错:
断路器模式:当依赖服务频繁失败时,断路器会打开,直接拒绝请求,防止系统因等待响应而耗尽资源。当服务恢复后,断路器会进入半开状态,逐步恢复请求。(上述程序就是)
资源隔离:使用线程池或信号量隔离来限制依赖服务的请求,防止一个服务的问题影响到整个系统。
fallback 机制:当依赖服务不可用时,提供一个备用响应(fallback),确保请求不会完全失败,而是返回一个默认值或备用结果。
超时与重试:设置请求超时时间,超出时间直接返回错误;对于临时故障,可以配置重试机制。
2.什么是hystrix ?
hystrix 是一个由 netflix 开发的开源库,用于提高分布式系统的服务弹性和可靠性。它通过增加延迟容忍和容错逻辑来防止级联故障。
主要功能包括:
断路器:监测依赖服务的故障,当检测到故障时,阻止请求发送到有问题的服务上,避免级联故障。
资源隔离:使用线程池隔离或信号量隔离来限制服务调用的资源消耗,防止系统不稳定。
fallback 回退机制:配置备用响应(fallback),当依赖服务故障时返回备用结果,确保请求不会完全失败。
监控与仪表盘:提供实时监控数据,如延迟和错误率,并通过 hystrix dashboard 展示,帮助监控系统状态。
hystrix 常与 spring cloud 集成,用于构建高可用和高弹性的微服务架构。尽管 netflix 已停止维护 hystrix,但它在许多现有项目中仍然广泛使用。
总结
每个微服务都需要独立部署,管理多个环境和配置,这无疑增加了部署的复杂性。
由于系统由众多微服务构成,一旦发生故障,定位问题的时间会相应增加,监控和故障排查的难度也随之增大。
此外,不同微服务对资源的需求各不相同,需要合理分配以避免资源浪费或不足。