浅析Hystrix(一)

Hystrix 是什么?

Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障容错机制。通过将依赖服务进行资源隔离,进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延。同时 Hystrix 还提供故障时的 fallback 降级机制,提升分布式系统的可用性和稳定性。

比如:

服务 A 依赖于服务 B,服务 B 依赖于服务 C和D。

一旦服务 C 故障了(延迟、宕机)原本请求全部被卡住,而且还有新的请求不断涌入,调用服务 C的服务B同样也会被卡住。这样导致服务 B 的线程资源被耗尽,无法接收新的请求,甚至可能因为大量线程不断的运转,导致自己宕机。这种影响势必会蔓延至服务 A,导致服务 A 也跟着挂掉。

Hystrix 可以对其进行资源隔离,比如限制服务 B 只有 40 个线程调用服务 C。当此 40 个线程被 hang 住时,其它 60 个线程依然能正常调用工作。从而确保整个系统不会被拖垮。

Hystrix 的设计原则

  • 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护
  • 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延。比如某一个服务故障了,导致其它服务也跟着故障。
  • 提供 fail-fast(快速失败)和快速恢复的支持。
  • 提供 fallback 优雅降级的支持。
  • 支持近实时的监控、报警以及运维操作。

Hystrix 更加细节的设计原则

  • 阻止任何一个依赖服务耗尽所有的资源,比如 tomcat 中的所有线程资源。
  • 避免请求排队和积压,采用限流和 fail fast 来控制故障。
  • 提供 fallback 降级机制来应对故障。
  • 使用资源隔离技术,比如 bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)来限制任何一个依赖服务的故障的影响。
  • 通过近实时的统计/监控/报警功能,来提高故障发现的速度。
  • 通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度。
  • 保护依赖服务调用的所有故障情况,而不仅仅只是网络故障情况。
### Hystrix Circuit Breaker Java Library Usage Examples Hystrix 是 Netflix 开源的个延迟和容错库,用于隔离远程服务之间的访问点,防止级联失败并提高系统的弹性。以下是关于如何使用 Hystrix些核心概念以及示例代码。 #### 1. 基本原理 Hystrix 使用断路器模式来保护系统免受外部依赖的影响。当某个请求超过设定的时间阈值或者错误率过高时,断路器会自动跳闸,阻止后续请求流向该依赖[^4]。 #### 2. 添加依赖项 为了在项目中集成 Hystrix,需先引入 Maven 或 Gradle 中的相应依赖: 对于 Maven 用户: ```xml <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version> </dependency> ``` 对于 Gradle 用户: ```gradle implementation 'com.netflix.hystrix:hystrix-core:1.5.18' ``` #### 3. 创建 Command 类 通过继承 `HystrixCommand` 并实现其逻辑可以定义个简单的熔断操作。 ```java public class ExampleCommand extends HystrixCommand<String> { private final String name; protected ExampleCommand(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Override protected String run() throws Exception { // 实际业务调用逻辑 (可能涉及网络请求或其他耗时操作) return "Hello " + name; } @Override protected String getFallback() { // 当发生异常或超时时返回回退逻辑 return "fallback"; } } ``` #### 4. 调用 Command 执行任务 创建实例并通过 `.execute()` 方法触发实际运行流程;如果需要异步支持,则可改用 `.queue().get()` 来获取 Future 对象的结果。 ```java public static void main(String[] args) throws InterruptedException, ExecutionException { ExampleCommand command = new ExampleCommand("World"); try { System.out.println(command.execute()); // 同步执行方式 } catch (Exception e) { e.printStackTrace(); } Future<String> futureResult = command.queue(); // 异步执行方式 System.out.println(futureResult.get()); } ``` #### 5. 配置参数调整行为 可以通过设置不同的属性来自定义 Hystrix 的工作特性,比如超时时间、线程池大小等。这些配置通常放在 application.properties 文件里完成指定。 ```properties hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000 hystrix.threadpool.default.coreSize=10 ``` 以上展示了基本的 Hystrix 应用场景及其简单实现过程[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值