<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hystrix on 小蜜蜂</title>
        <link>https://xumf.net/tags/hystrix/</link>
        <description>Recent content in Hystrix on 小蜜蜂</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 22 May 2019 15:49:23 +0800</lastBuildDate><atom:link href="https://xumf.net/tags/hystrix/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Hystrix</title>
            <link>https://xumf.net/blog/hystrix/</link>
            <pubDate>Wed, 22 May 2019 15:49:23 +0800</pubDate>
            <guid>https://xumf.net/blog/hystrix/</guid>
            <description>&lt;h3 id=&#34;功能&#34;&gt;功能&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;服务熔断&lt;/li&gt;&#xA;&lt;li&gt;服务降级&lt;/li&gt;&#xA;&lt;li&gt;资源隔离&lt;/li&gt;&#xA;&lt;li&gt;请求缓存&lt;/li&gt;&#xA;&lt;li&gt;请求合并&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;核心思想&#34;&gt;核心思想&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;防止服务雪崩&#xA;当一个服务发生故障时，避免故障扩散到整个系统&lt;/li&gt;&#xA;&lt;li&gt;快速失败&#xA;通过熔断机制快速失败。避免资源耗尽。&lt;/li&gt;&#xA;&lt;li&gt;优雅降级&#xA;在服务不可用的时候，提供备用方案（Fallback）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;熔断器circuit-breaker&#34;&gt;熔断器（Circuit Breaker）&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;原理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;当服务的容错率超过阈值时，熔断器会被打开，后续请求会直接失败，不再调用目标服务&lt;/li&gt;&#xA;&lt;li&gt;熔断器打开一段时间后，会进入半打开状态，尝试恢复服务&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;关键参数&#xA;&lt;ul&gt;&#xA;&lt;li&gt;circuitBreaker.requestVolumeThreshold：触发熔断器需要最小请求数&lt;/li&gt;&#xA;&lt;li&gt;circuitBreaker.errorThresholdPercentage：错误率阈值（默认为50%）&lt;/li&gt;&#xA;&lt;li&gt;circuitBreaker.sleepWindowInMilliseconds：熔断器打开后的休眠时间（默认为5秒）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;资源隔离&#34;&gt;资源隔离&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;线程池隔离&#xA;&lt;ul&gt;&#xA;&lt;li&gt;每个服务调用使用独立的线程池，避免资源竞争&lt;/li&gt;&#xA;&lt;li&gt;通过 HystrixThreadPoolKey 配置线程池&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;信号量隔离&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用信号量限制并发数，适用于轻量级调用（执行时间短的任务）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;服务降级&#34;&gt;服务降级&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;原理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;当服务调用失败或者熔断器打开时，执行降级逻辑&lt;/li&gt;&#xA;&lt;li&gt;降级逻辑可以是返回默认值、调用备用服务等&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实现&#xA;&lt;ul&gt;&#xA;&lt;li&gt;通过 HystrixCommand(fallbackMethod = &amp;ldquo;fallbackMethod&amp;rdquo;) 指定降级方法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;请求缓存&#34;&gt;请求缓存&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;原理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;对相同请求参数，Hystrix 可以缓存结果，减少重复调用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实现&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 @CacheResult 和 @CacheKey 注解&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;请求合并&#34;&gt;请求合并&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;原理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;将多个请求合并为一个批量请求，减少网络开销&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;实现&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使用 @HystrixCollapser 注解&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;工作流程&#34;&gt;工作流程&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;请求进入：&#xA;&lt;ol&gt;&#xA;&lt;li&gt;请求被 Hystrix 拦截&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;检查熔断器状态&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如果熔断器打开，直接执行降级逻辑&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;资源隔离&#xA;&lt;ol&gt;&#xA;&lt;li&gt;根据配置选择线程池隔离或信号量隔离&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;执行目标服务&#xA;&lt;ol&gt;&#xA;&lt;li&gt;调用目标服务，记录成功或者失败&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;更新熔断器状态&#xA;&lt;ol&gt;&#xA;&lt;li&gt;根据调用结果更新熔断器状态&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;执行降级逻辑&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如果调用失败或者熔断器打开，执行降级逻辑&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;返回结果&#xA;&lt;ol&gt;&#xA;&lt;li&gt;返回调用结果或者降级结果&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;sequenceDiagram&#xA;    participant Client as 客户端&#xA;    participant Hystrix as Hystrix&#xA;    participant TargetService as 目标服务&#xA;    participant Fallback as 降级逻辑&#xA;&#xA;    Client-&gt;&gt;Hystrix: 1. 发起请求&#xA;    Hystrix-&gt;&gt;Hystrix: 2. 检查熔断器状态&#xA;    alt 熔断器关闭&#xA;        Hystrix-&gt;&gt;Hystrix: 3. 资源隔离（线程池/信号量）&#xA;        Hystrix-&gt;&gt;TargetService: 4. 调用目标服务&#xA;        TargetService--&gt;&gt;Hystrix: 5. 返回结果&#xA;        Hystrix-&gt;&gt;Hystrix: 6. 更新熔断器状态&#xA;        alt 调用成功&#xA;            Hystrix--&gt;&gt;Client: 7. 返回结果&#xA;        else 调用失败&#xA;            Hystrix-&gt;&gt;Fallback: 8. 执行降级逻辑&#xA;            Fallback--&gt;&gt;Hystrix: 9. 返回降级结果&#xA;            Hystrix--&gt;&gt;Client: 10. 返回降级结果&#xA;        end&#xA;    else 熔断器打开&#xA;        Hystrix-&gt;&gt;Fallback: 11. 执行降级逻辑&#xA;        Fallback--&gt;&gt;Hystrix: 12. 返回降级结果&#xA;        Hystrix--&gt;&gt;Client: 13. 返回降级结果&#xA;    end&lt;/pre&gt;&lt;h3 id=&#34;底层原理&#34;&gt;底层原理&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;熔断器实现&#xA;&lt;ol&gt;&#xA;&lt;li&gt;状态机&#xA;&lt;ol&gt;&#xA;&lt;li&gt;熔断器有三种状态：CLOSED （关闭）、OPEN（打开）、HALF_OPEN（半开）&lt;/li&gt;&#xA;&lt;li&gt;状态转换基于容错率和请求量&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;滑动窗口&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用滑动窗口统计最近一段时间的请求成功率和错误率&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;线程池隔离&#xA;&lt;ol&gt;&#xA;&lt;li&gt;线程池管理&#xA;&lt;ol&gt;&#xA;&lt;li&gt;每个服务调用使用独立的线程池，避免资源竞争&lt;/li&gt;&#xA;&lt;li&gt;线程池大小通过 **coreSize **和 **maxSize **配置。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;队列管理&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用有界队列（&lt;strong&gt;BlockingQueue&lt;/strong&gt;）控制请求排队&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;信号量隔离&#xA;&lt;ol&gt;&#xA;&lt;li&gt;信号量机制&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用 **Semaphore **控制并发请求书&lt;/li&gt;&#xA;&lt;li&gt;适用于轻量级调用，减少线程切换开销&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;请求缓存&#xA;&lt;ol&gt;&#xA;&lt;li&gt;缓存实现&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用 &lt;strong&gt;ConcurrentHashMap&lt;/strong&gt; 存储缓存结果&lt;/li&gt;&#xA;&lt;li&gt;通过 &lt;strong&gt;@CacheKey&lt;/strong&gt; 指定缓存键&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;请求合并&#xA;&lt;ol&gt;&#xA;&lt;li&gt;合并实现&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用 &lt;strong&gt;BatchCommand&lt;/strong&gt; 将多个请求合并为一个批量请求&lt;/li&gt;&#xA;&lt;li&gt;通过 &lt;strong&gt;@HystrixCollapser&lt;/strong&gt; 配置合并规则&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;image&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;images/NHBaLoW_AxpSCXjKfL2ffJvynFlMnp8I9_-xcX-SxY8.jpg&#34;&gt;&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
