Steeltoe之Circuit Breaker篇

来源:https://www.cnblogs.com/kenwoo/archive/2018/09/24/9696167.html
-Advertisement-
Play Games

在分散式系統中,服務發生異常是很正常的現象。為了處理這類“例外”,可以採取不同的應對策略,斷路器模式即是其中一種方法。這個模式的主要特點是其可以阻斷失敗的級聯影響,不會因為一個服務的失敗導致其它關聯服務一併失敗。 在Spring Cloud生態系統中有Hystrix類庫可以提供這個模式的解決方案,而 ...


在分散式系統中,服務發生異常是很正常的現象。為了處理這類“例外”,可以採取不同的應對策略,斷路器模式即是其中一種方法。這個模式的主要特點是其可以阻斷失敗的級聯影響,不會因為一個服務的失敗導致其它關聯服務一併失敗。

在Spring Cloud生態系統中有Hystrix類庫可以提供這個模式的解決方案,而在.NET世界里也有Steeltoe這個開源項目能夠提供助力。

Package

對於ASP.NET Core,使用Steeltoe.CircuitBreaker.HystrixCore類庫。

對於Console/ASP.NET 4.x,使用Steeltoe.CircuitBreaker.HystrixBase類庫。

而如果有需求使用Hystrix的Dashboard,還需要增加Steeltoe.CircuitBreaker.Hystrix.MetricsEventsCore類庫。

Service

建立一個Service類與介面,其中會調用試水Spring Cloud Hystrix一文中的服務端應用程式。

public interface IMessageService
{
    Task<string> GetMessage();
}
public class MessageService : IMessageService
{
    private readonly IHttpClientFactory _httpClientFactory;
    public MessageService(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }
    public async Task<string> GetMessage()
    {
        var client = _httpClientFactory.CreateClient();
        var result = await client.GetStringAsync("http://localhost:8200/message");
        return result;
    }
}

Command

建立一個繼承HystrixCommand的Command類,重寫其RunAsync與RunFallbackAsync方法,分別用於正常場合下對Service的調用與異常情況下的特別處理。

public class MessageCommand : HystrixCommand<string>
{
    private readonly IMessageService _messageService;
    public MessageCommand(IHystrixCommandOptions options, IMessageService messageService) : base(options)
    {
        _messageService = messageService;
    }

    public async Task<string> GetMessage()
    {
        return await ExecuteAsync();
    }

    protected override async Task<string> RunAsync()
    {
        return await _messageService.GetMessage();
    }

    protected override async Task<string> RunFallbackAsync()
    {
        return await Task.FromResult("Woo, bad luck!");
    }
}

Controller

Controller的Action方法里調用Command的對應方法。

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly MessageCommand _command;
    public ValuesController(MessageCommand command)
    {
        _command = command;
    }

    // GET api/values
    [HttpGet]
    public async Task<string> Get()
    {
        return await _command.GetMessage();
    }
}

Startup.cs

配置類中通過依賴註入方式註冊HttpClientFactory及已定義的Service。如果需要使用儀錶盤的話,還要追加註冊AddHystrixMetricsStream。同時使用UseHystrixRequestContextUseHystrixMetricsStream

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
        services.AddSingleton<IMessageService, MessageService>();
        services.AddHystrixCommand<MessageCommand>("Message", Configuration);
        services.AddMvc();

        services.AddHystrixMetricsStream(Configuration);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHystrixRequestContext();

        app.UseMvc();

        app.UseHystrixMetricsStream();
    }
}

當應用程式啟動後,如果Spring Cloud的服務端正常工作的話,頁面會顯示如下結果:

如果把服務端停止的話,頁面則會顯示另外的結果:

使用儀錶盤的話,則可以看到更直觀的數據(這裡使用的也是上文中現成的客戶端服務,已帶有儀錶盤功能):


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • %還是format 1、皇城PK Python中格式化字元串目前有兩種陣營:%和format,我們應該選擇哪種呢? 自從Python2.6引入了format這個格式化字元串的方法之後,我認為%還是format這根本就不算個問題。不信你往下看。 上面的代碼很明顯會拋出一個如下的TypeError: T ...
  • 閑來無事,買了一個雲伺服器來玩玩。想要做的第一件事情就是搭建web項目,查詢了網上的資料得知,部署web項目的步驟是 (1)配置java環境(這裡選擇的是jdk1.8) (2)配置tomcat伺服器(這裡選擇的是tomcat7) (3)上傳web項目 (4)訪問web項目 那麼就開始我們的第一步和第 ...
  • 隨著微處理機技術的發展,人們只需花幾百美元就能買到一個CPU晶元,這個晶元每秒鐘執行的指令比80年代最大的大型機的處理機每秒鐘所執行的指令還多。如果你願意付出兩倍的價錢,將得到同樣的CPU,但它卻以更高的時鐘速率運行。因此,最節約成本的辦法通常是在一個系統中使用集中在一起的大量的廉價CPU。所以,傾... ...
  • 在我們的應用程式中日誌是不可缺少的部分,在Apache中由一個功能無比強大的日誌組件,它提供了方便的日誌記錄,這個開源的項目就是我們慣用的Log4j,jar包我麽們一顆取Apache官網下載最新版本的。log4j下載地址 一.入門篇 1.打開我們的Eclipse新建一個Java項目並且導入Log4j ...
  • 在開源文件大行其道的今天,基於java種種解決方案和框架紛繪踏至而來,猶如浩瀚如海,看不完也學不盡。在採用這些解決方案和框架進行項目開發時,往往會出現當程式卡殼時,既無異常提示信息亦沒有與之對應的日誌輸出的局面。每每出現這樣的困境時,往往只能通過打斷點來一步一步調試跟蹤來解決。更有甚者,基於某一底層... ...
  • 題目介紹:現在輸入一組數據,寫入學生的考試分數。已知學生數為N,學生編號為1到N,且0<N<=30000,每個學生都有一個分數;操作數為M且0<M<5000。輸入第一行為N M,接下來是1行N列數據代表學生的初試分數,接下來是M行操作數據。已知操作有兩種,分為Q和U。一次操作的格式為 C A B,當 ...
  • 線性表是一種隨機存取的結構,和鏈表不同,鏈表順序存取的結構。但是,線性表是一種順序存儲的結構,而鏈表是鏈式存儲結構。兩者都是線性的,但區別不同。 進入主題: 1.假如有一串數據元素,要求刪除其中的重覆元素。 首先想到的是用兩層迴圈,第一層從第一個元素開始,第二層從第一層元素的下一個元素開始。 就是假 ...
  • 1、指令:<%@ 指令名 屬性名="值"%> 1) page:page指令告訴servlet容器,這是一個Jsp頁面 pageEncoding 指頁面文本的字元集編碼 contentType 告訴Browser 和Servlet端,要使用哪個格式哪個字元集進行解析 獨立的@page指令,可以使用im ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...