# 限流熔断技术

好的博文：[https://www.toutiao.com/i6636330299758232078/?tt\_from=weixin\&utm\_campaign=client\_share\&wxshare\_count=1×tamp=1546653284\&app=news\_article\&utm\_source=weixin\&iid=56573490366\&utm\_medium=toutiao\_android\&group\_id=6636330299758232078](https://www.toutiao.com/i6636330299758232078/?tt_from=weixin\&utm_campaign=client_share\&wxshare_count=1\&timestamp=1546653284\&app=news_article\&utm_source=weixin\&iid=56573490366\&utm_medium=toutiao_android\&group_id=6636330299758232078)

Hystrix的原理与使用：<https://segmentfault.com/a/1190000005988895>

Hystrix熔断机制：<https://blog.csdn.net/wugemao/article/details/80760273>

## Hystrix

作为Spring Cloud官方默认的熔断组件，停止开发，Hystrix官方推荐使用Resilience4j；

Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力.

**Hystrix的设计原则**包括:

a.**资源隔离**

Hystrix隔离方式采用线程/信号的方式，通过隔离限制依赖的并发量和阻塞扩散

a)线程隔离

```
        Hystrix在用户请求和服务之间加入了线程池。

        Hystrix为每个依赖调用分配一个小的线程池，如果线程池已满调用将被立即拒绝，默认不采用排队.加速失败判定时间。线程数是可以被设定的。

        原理：用户的请求将不再直接访问服务，而是通过线程池中的空闲线程来访问服务，如果线程池已满，则会进行降级处理，用户的请求不会被阻塞，至少可以看到一个执行结果（例如返回友好的提示信息），而不是无休止的等待或者看到系统崩溃。
```

b）信号隔离：

```
     信号隔离也可以用于限制并发访问，防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程（该线程需要通过信号申请, 如果客户端是可信的且可以快速返回，可以使用信号隔离替换线程隔离,降低开销。信号量的大小可以动态调整, 线程池大小不可以
```

货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个，这种资源隔离减少风险的方式被称为:Bulkheads(舱壁隔离模式).

在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩.

![](https://2663733811-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld4L6S7ar_MexV076MX%2F-Ld4L7xe9wQioYBRrDdX%2F-Ld4LFdsY8KGgpoG_Ne2%2Fafee.png?generation=1555941633616130\&alt=media)

b.**熔断器模式**

![](https://2663733811-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld4L6S7ar_MexV076MX%2F-Ld4L7xe9wQioYBRrDdX%2F-Ld4LFdu9ZfNxMM7gcA8%2Frreee.png?generation=1555941633255699\&alt=media)

**c.命令模式**

Hystrix使用命令模式(继承HystrixCommand类)来包裹具体的服务调用逻辑(run方法), 并在命令模式中添加了服务调用失败后的降级逻辑(getFallback).

![](https://2663733811-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld4L6S7ar_MexV076MX%2F-Ld4L7xe9wQioYBRrDdX%2F-Ld4LFdwqB4qpfuH9Rp9%2F%E5%91%BD%E4%BB%A4.png?generation=1555941633108306\&alt=media)

Hystrix Metrics 的实现：

![](https://2663733811-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld4L6S7ar_MexV076MX%2F-Ld4L7xe9wQioYBRrDdX%2F-Ld4LFdybSb5TC2a41CZ%2F2323232.png?generation=1555941633860691\&alt=media)

## resilience4j

是一个比较轻量的熔断降级库。首先 resilience4j 的模块化做的比较好，将每个功能点（如熔断、限速器、自动重试）都拆成了单独的模块，这样整体结构很清晰，用户也只需要引入相应功能的依赖即可；另外resilience4j 是针对 Java 8 和函数式编程设计的，API 比较简洁优雅。同时与 Hystrix 相比，Resilience4j 增加了简单的限速器和自动重试特性，使用场景更加丰富。Resilience4j 属于一个新兴项目，社区也在蓬勃发展。总的来说，Resilience4j 是比较轻量的库，在较小较新的项目中使用还是比较方便的，但是 Resilience4j 只包含限流降级的基本场景，对于非常复杂的企业级服务架构可能无法很好地 cover 住；同时 Resilience4j 缺乏生产级别的配套设施（如提供规则管理和实时监控能力的控制台）。

## Sentinel

一款面向分布式服务架构的轻量级流量控制组件，主要以流量为切入点，从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障服务的稳定性。

**Sentinel 的核心思想**：根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略。在 Sentinel 中资源定义和规则配置是分离的。用户先通过 Sentinel API 给对应的业务逻辑定义资源，然后可以在需要的时候动态配置规则。

**Sentinel 的优势和特性：**

1. 轻量级，核心库无多余依赖，性能损耗小。
2. 方便接入，开源生态广泛。Sentinel 对 Dubbo、Spring Cloud、Web Servlet、gRPC 等常用框架提供适配模块，只需引入相应依赖并简单配置即可快速接入；同时针对自定义的场景 Sentinel 还提供低侵入性的注解资源定义方式，方便自定义接入。
3. 丰富的流量控制场景。Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景，流控维度包括流控指标、流控效果（塑形）、调用关系、热点、集群等各种维度，针对系统维度也提供自适应的保护机制。
4. 易用的控制台，提供实时监控、机器发现、规则管理等能力。
5. 完善的扩展性设计，提供多样化的 SPI 接口，方便用户根据需求给 Sentinel 添加自定义的逻辑。

![](https://2663733811-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ld4L6S7ar_MexV076MX%2F-Ld4L7xe9wQioYBRrDdX%2F-Ld4LFe-6dZvwxFCZoOd%2Fsentinel.png?generation=1555941633909084\&alt=media)

Sentinel内部如何实现熔断：

Sentinel 内部熔断的实现其实就是熔断器的思想。Sentinel 底层会通过优化的滑动窗口数据结构来实时统计所有资源的调用数据（通过 QPS、限流 QPS、异常数、RT 等）。若资源配置了熔断降级规则，那么调用时就会取出当前时刻的统计数据进行判断。当达到熔断阈值时会将熔断器置为开启状态，切断所有的请求，直到过了降级时间窗口后再重置熔断器，继续允许请求通过。

Sentinel 熔断降级支持以下几种指标：平均响应时间、秒级异常比率、分钟级异常数。在 Sentinel 中，我们一般将熔断降级与并发线程数限流相结合来对不稳定的服务调用进行熔断，防止出现级联错误。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lxdd.gitbook.io/galaxy/knowledge/rpc/xian-liu-rong-duan-ji-zhu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
