成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

招行二面:為什么有了服務(wù)降級(jí),還需要服務(wù)熔斷?

開發(fā) 系統(tǒng)
本文,我們深入淺出地介紹了服務(wù)熔斷機(jī)制,并通過Resilience4j的實(shí)戰(zhàn)示例展示了如何在Java項(xiàng)目中實(shí)現(xiàn)服務(wù)熔斷機(jī)制。

在分布式系統(tǒng)中,我們經(jīng)常聽到服務(wù)熔斷這個(gè)詞,那么,什么是服務(wù)熔斷?為什么需要服務(wù)熔斷?如何實(shí)現(xiàn)服務(wù)熔斷?這篇文章,我們來聊一聊。

一、什么是服務(wù)熔斷?

簡單來說,服務(wù)熔斷(Circuit Breaker)是一種用于提高分布式系統(tǒng)健壯性的設(shè)計(jì)模式。它的靈感來源于電路中的熔斷器,當(dāng)電路中出現(xiàn)問題時(shí),熔斷器會(huì)自動(dòng)斷開,防止故障擴(kuò)大,保護(hù)整個(gè)系統(tǒng)。應(yīng)用在微服務(wù)架構(gòu)中,服務(wù)熔斷機(jī)制可以在某個(gè)服務(wù)出現(xiàn)故障或響應(yīng)緩慢時(shí),快速失敗或采取備用方案,從而避免級(jí)聯(lián)失敗,提升系統(tǒng)的整體穩(wěn)定性。

二、原理分析

接下來,我們講解服務(wù)熔斷的原理,整體總結(jié)成下面五個(gè)步驟。

1. 正常狀態(tài)

在正常情況下,服務(wù)之間的調(diào)用是通暢的,熔斷器處于關(guān)閉狀態(tài)。所有請求都會(huì)正常發(fā)送到目標(biāo)服務(wù),沒有任何干預(yù)。

2. 監(jiān)控與檢測

熔斷器會(huì)監(jiān)控目標(biāo)服務(wù)的調(diào)用情況,包括請求成功率、失敗率、響應(yīng)時(shí)間等。當(dāng)某個(gè)閾值被超過(比如連續(xù)失敗次數(shù)超過預(yù)設(shè)值),熔斷器會(huì)認(rèn)為目標(biāo)服務(wù)可能出現(xiàn)了問題。

3. 打開熔斷

一旦檢測到目標(biāo)服務(wù)可能故障,熔斷器會(huì)打開(Open),此時(shí)所有對該服務(wù)的請求都會(huì)被立即失敗,不再發(fā)送實(shí)際請求。這就像是電路中的熔斷器斷開一樣,防止故障蔓延。

4. 半開啟狀態(tài)

過一段時(shí)間后,熔斷器會(huì)進(jìn)入半開啟狀態(tài)(Half-Open),允許少量請求嘗試調(diào)用目標(biāo)服務(wù)。如果這些請求成功,熔斷器會(huì)重新關(guān)閉,恢復(fù)正常狀態(tài);如果失敗,熔斷器繼續(xù)保持打開狀態(tài)。

5. 備用機(jī)制

當(dāng)熔斷器打開時(shí),可以采取備用方案,比如返回默認(rèn)值、跳過某些操作,甚至切換到其他服務(wù)實(shí)例,以保證系統(tǒng)的部分功能仍然可用。

通過這樣的機(jī)制,服務(wù)熔斷能夠有效地防止單個(gè)服務(wù)故障導(dǎo)致的系統(tǒng)級(jí)別的連鎖反應(yīng)。

三、示例演示

為了更好地理解服務(wù)熔斷,接下來,我們將使用 Resilience4j 這個(gè)輕量級(jí)的容錯(cuò)庫來實(shí)現(xiàn)服務(wù)熔斷機(jī)制。Resilience4j是一個(gè)專為 Java 8及以上版本設(shè)計(jì)的庫,具有易用性和高性能的特點(diǎn)。

1. 環(huán)境準(zhǔn)備

首先,確保你的項(xiàng)目中已經(jīng)引入了Resilience4j的依賴。以Maven項(xiàng)目為例,添加以下依賴到pom.xml中:

<dependencies>
    <!-- Resilience4j核心依賴 -->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-all</artifactId>
        <version>2.0.2</version>
    </dependency>
    <!-- 其他依賴項(xiàng) -->
</dependencies>

2. 編寫服務(wù)熔斷代碼

下面是一個(gè)簡單的示例,展示如何使用Resilience4j實(shí)現(xiàn)服務(wù)熔斷。當(dāng)目標(biāo)服務(wù)響應(yīng)慢或失敗時(shí),熔斷器會(huì)起作用,快速返回備用結(jié)果。

import io.github.resilience4j.circuitbreaker.*;
import io.github.resilience4j.decorators.Decorators;

import java.time.Duration;
import java.util.concurrent.*;
import java.util.function.Supplier;

publicclass CircuitBreakerDemo {

    public static void main(String[] args) {
        // 創(chuàng)建CircuitBreaker配置
        CircuitBreakerConfig config = CircuitBreakerConfig.custom()
                .failureRateThreshold(50) // 失敗率閾值
                .waitDurationInOpenState(Duration.ofSeconds(5)) // 打開狀態(tài)持續(xù)時(shí)間
                .slidingWindowSize(4) // 滑動(dòng)窗口大小
                .build();

        // 創(chuàng)建CircuitBreaker實(shí)例
        CircuitBreaker circuitBreaker = CircuitBreaker.of("myCircuitBreaker", config);

        // 模擬目標(biāo)服務(wù)調(diào)用
        Supplier<String> decoratedSupplier = Decorators.ofSupplier(() -> callExternalService())
                .withCircuitBreaker(circuitBreaker)
                .withFallback(Collections.singletonList(CircuitBreaker.class), 
                             throwable -> "默認(rèn)響應(yīng)")
                .decorate();

        // 模擬多次調(diào)用
        for (int i = 0; i < 10; i++) {
            try {
                String response = decoratedSupplier.get();
                System.out.println("響應(yīng): " + response);
            } catch (Exception e) {
                System.out.println("調(diào)用失敗: " + e.getMessage());
            }

            // 等待1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }

    // 模擬外部服務(wù)調(diào)用,隨機(jī)失敗或延時(shí)
    private static String callExternalService() {
        double random = Math.random();
        if (random < 0.5) {
            // 模擬失敗
            thrownew RuntimeException("服務(wù)調(diào)用失敗");
        } else {
            // 模擬延時(shí)
            try {
                Thread.sleep(2000); // 2秒延時(shí)
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return"成功響應(yīng)";
        }
    }
}

3. 代碼解析

  • 配置CircuitBreaker:我們創(chuàng)建了一個(gè)自定義的熔斷器配置,設(shè)置了失敗率閾值為50%,滑動(dòng)窗口大小為4次調(diào)用,打開狀態(tài)持續(xù)5秒。
  • 裝飾目標(biāo)服務(wù)調(diào)用:使用Decorators將目標(biāo)服務(wù)調(diào)用裝飾為一個(gè)有熔斷器保護(hù)的供應(yīng)者(Supplier)。同時(shí),我們設(shè)置了一個(gè)備用響應(yīng),當(dāng)熔斷器打開或目標(biāo)服務(wù)調(diào)用失敗時(shí),返回“默認(rèn)響應(yīng)”。
  • 模擬調(diào)用:在for循環(huán)中,我們模擬了多次服務(wù)調(diào)用。目標(biāo)服務(wù)callExternalService隨機(jī)成功或失敗,并可能產(chǎn)生延時(shí)。通過這種方式,我們可以觀察熔斷器是如何根據(jù)調(diào)用結(jié)果自動(dòng)切換狀態(tài)的。

運(yùn)行這段代碼,當(dāng)失敗率超過 50%時(shí),熔斷器會(huì)打開,后續(xù)的請求會(huì)立即返回“默認(rèn)響應(yīng)”。經(jīng)過 5秒后,熔斷器會(huì)進(jìn)入半開啟狀態(tài),嘗試恢復(fù)調(diào)用。如果目標(biāo)服務(wù)恢復(fù)正常,熔斷器會(huì)重新關(guān)閉,系統(tǒng)恢復(fù)正常運(yùn)行。

四、問題解答

回到文章的標(biāo)題:為什么有了服務(wù)降級(jí)還需要服務(wù)熔斷?

這里我們總結(jié)了四個(gè)核心理由:

  • 避免資源浪費(fèi):當(dāng)一個(gè)服務(wù)出現(xiàn)故障時(shí),如果沒有熔斷機(jī)制,系統(tǒng)可能會(huì)持續(xù)不斷地嘗試調(diào)用這個(gè)失敗的服務(wù),導(dǎo)致請求積壓和資源耗盡。服務(wù)熔斷通過快速失敗,避免了不必要的調(diào)用,節(jié)省了寶貴的系統(tǒng)資源。
  • 防止級(jí)聯(lián)故障:在微服務(wù)架構(gòu)中,服務(wù)之間通常相互依賴。如果一個(gè)服務(wù)出現(xiàn)問題,持續(xù)的失敗調(diào)用可能會(huì)影響到依賴它的其他服務(wù),導(dǎo)致級(jí)聯(lián)故障。服務(wù)熔斷器可以在問題初期及時(shí)切斷受影響的服務(wù)調(diào)用,防止故障擴(kuò)散到整個(gè)系統(tǒng)。
  • 加速系統(tǒng)恢復(fù):通過熔斷機(jī)制,系統(tǒng)能夠更快地檢測到服務(wù)的故障狀態(tài),并在熔斷器打開后,等待一段時(shí)間再嘗試恢復(fù)調(diào)用。這有助于目標(biāo)服務(wù)有足夠的時(shí)間進(jìn)行自我修復(fù),從而加速整個(gè)系統(tǒng)的恢復(fù)過程。
  • 提供更好的用戶體驗(yàn): 服務(wù)降級(jí)雖然能夠保證核心功能的可用性,但在高負(fù)載或持續(xù)失敗的情況下,用戶可能會(huì)頻繁遇到降級(jí)后的功能或默認(rèn)響應(yīng),影響使用體驗(yàn)。服務(wù)熔斷器通過控制調(diào)用頻率和恢復(fù)策略,能夠在保證必要降級(jí)的同時(shí),減少對用戶的負(fù)面影響。
責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2025-04-03 10:04:53

服務(wù)降級(jí)分布式系統(tǒng)系統(tǒng)

2023-09-12 14:02:30

數(shù)組vector

2023-10-24 15:15:26

HTTPWebSocket

2021-10-12 18:48:07

HTTP 協(xié)議Websocket網(wǎng)絡(luò)通信

2024-02-22 10:34:00

NULLC++nullptr

2024-02-18 12:39:15

C++autodecltype

2025-04-14 10:00:00

負(fù)載均衡Java開發(fā)

2024-11-26 07:37:22

2016-01-28 10:04:09

Jenkins運(yùn)維持續(xù)交付

2020-05-13 15:57:59

聚類分析算法監(jiān)督學(xué)習(xí)

2025-01-07 14:36:12

2023-01-31 17:24:21

DPUCPUGPU

2023-09-14 16:02:27

2023-04-07 15:30:24

操作系統(tǒng)ChatGPT

2024-11-29 16:02:17

2024-04-03 08:53:16

PythonGIL線程

2023-06-01 07:50:42

JSDocTypeScriptAPI

2015-06-19 06:41:45

生命科學(xué)云計(jì)算集群計(jì)算

2025-04-30 10:49:11

Java序列化反序列化

2020-12-11 07:39:37

RPC MQ架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲人精品午夜 | 老司机成人在线 | 欧美日韩综合精品 | 精品国产18久久久久久二百 | 国产精品一区二区视频 | 91一区| 综合久久av| 亚洲欧美日韩国产综合 | 午夜午夜精品一区二区三区文 | 一区二区三区四区在线免费观看 | 久久草在线视频 | 日韩一及片 | 欧美视频| 日韩精品在线一区二区 | 国产精品日产欧美久久久久 | 亚洲日日夜夜 | 国产精品久久久亚洲 | 国产四区 | 亚洲一二三在线观看 | 国产一区二 | 国精产品一区二区三区 | 国产黄色网址在线观看 | 中文字幕高清一区 | 久久久久久免费免费 | 逼逼网| 视频一区中文字幕 | 国产精品乱码一区二区三区 | 国产免国产免费 | 午夜精品一区二区三区在线播放 | 天天躁日日躁aaaa视频 | 国产91网站在线观看 | 亚洲成人一区 | 精久久 | 国产激情一区二区三区 | 精品欧美一区二区精品久久 | 亚洲天堂精品久久 | 在线视频亚洲 | 一区二区三区日韩 | 亚洲日本欧美 | 精品伦精品一区二区三区视频 | 国产乱码高清区二区三区在线 |