本文共 3173 字,大约阅读时间需要 10 分钟。
Hystrix是一款开源的延迟和容错库,专注于处理分布式系统中的依赖故障。它通过熔断机制,防止单点故障对整个系统造成连锁崩溃,提升系统的弹性和容错能力。
在复杂的分布式体系中,多个服务之间存在数十个依赖关系。这些依赖关系在某些时候不可避免地会失败,例如超时、异常等。这种情况会导致服务链路的“雪崩效应”,即多个微服务同时出现故障,导致系统资源被迅速占满,最终引发系统崩溃。
雪崩效应的典型表现是:
Hystrix通过以下方式解决分布式系统的依赖问题:
服务降级是Hystrix的核心功能之一。当调用目标服务出现问题时,Hystrix会自动触发降级逻辑,返回一个预定义的友好响应。
降级触发条件:
降级优点:
熔断机制是Hystrix防雪崩效应的关键功能。当依赖服务在一定时间内出现多次失败或超时时,Hystrix会开启熔断机制,停止向该服务发起请求,切换到降级逻辑。
熔断参数:
circuitBreaker.requestVolumeThreshold:请求总数阀值,默认为20次circuitBreaker.sleepWindowInMilliseconds:熔断后暂停的时间,默认为10秒circuitBreaker.errorThresholdPercentage:错误率阀值,默认为50%Hystrix也支持服务限流功能,通过限制请求数量,防止高并发下系统资源被过度占用。常用于秒杀等高并发场景。
org.springframework.cloud spring-cloud-starter-netflix-hystrix
eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://eureka7001.com:7001/eureka
@SpringBootApplication@EnableEurekaClientpublic class PaymentHystrixMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentHystrixMain8001.class, args); }} @Servicepublic class PaymentService { @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback") 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 不能为负数,请稍后再试, o(╥﹏╥)o id: " + id; }} 在高并发场景下,单一依赖可能导致系统资源被迅速占满。通过Hystrix的熔断和降级功能,可以避免级联故障。
使用JMeter进行压力测试,发送20000个并发请求:
http://localhost:8001/payment/hystrix/timeout/31
当服务端8001出现故障时,消费者80会自动触发服务降级,返回友好的提示,而不是长时间等待或报错。
在高并发下,单一依赖可能导致:
在服务提供者配置中,设置Hystrix命令属性:
@HystrixCommand( fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000") })public String paymentCircuitBreaker(@PathVariable("id") Integer id) { int timeNumber = 5; try { TimeUnit.SECONDS.sleep(timeNumber); } catch (InterruptedException e) { e.printStackTrace(); } return "线程池:" + Thread.currentThread().getName() + " paymentCircuitBreaker,id:" + id + " 耗时(秒):" + timeNumber;}public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) { return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";} 通过Hystrix Dashboard,监控服务的依赖状态和性能指标。配置如下:
server: port: 9001feign: hystrix: enabled: true
Hystrix通过服务降级、熔断和监控等功能,有效防止分布式系统中的依赖故障对整体系统造成连锁崩溃。在高并发场景下,Hystrix能够帮助系统快速恢复弹性,避免雪崩效应。
转载地址:http://lntkz.baihongyu.com/