Steeltoe之Circuit Breaker篇
在分散式系統中,服務發生異常是很正常的現象。為了處理這類“例外”,可以採取不同的應對策略,斷路器模式即是其中一種方法。這個模式的主要特點是其可以阻斷失敗的級聯影響,不會因為一個服務的失敗導致其它關聯服務一併失敗。
在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
。同時使用UseHystrixRequestContext
與UseHystrixMetricsStream
。
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的服務端正常工作的話,頁面會顯示如下結果:
如果把服務端停止的話,頁面則會顯示另外的結果:
使用儀表盤的話,則可以看到更直觀的資料(這裡使用的也是上文中現成的客戶端服務,已帶有儀表盤功能):
相關文章
- 快取及使用 Circuit Breaker 限制記憶體使用快取UI記憶體
- HBase查詢優化之Short-Circuit Local Reads優化UI
- Homomorphic Evaluation of the AES Circuit:解讀UI
- 【等待事件】virtual circuit next request事件UI
- .NET Core微服務之基於Steeltoe使用Spring Cloud Config統一管理配置微服務SpringCloud
- 從kratos分析breaker熔斷器原始碼實現原始碼
- JavaScript之物件篇JavaScript物件
- JavaScript之開篇JavaScript
- Kotlin之UI篇KotlinUI
- 【es】FATAL [circuit_breaking_exception] [parent] Data too large, data for [<http_request>] would beUIExceptionHTTP
- Linux 效能優化之 CPU 篇 ----- 套路篇Linux優化
- Docker初探之Windows篇DockerWindows
- 精通MySQL之鎖篇MySql
- 轉:AMS之dumpsys篇
- 深入 Nginx 之配置篇Nginx
- 精通MySQL之索引篇,這篇注重練習!MySql索引
- 『高階篇』docker之CICD(終結篇)(44)Docker
- Go 基礎篇之 MapGo
- 設計模式之概述篇設計模式
- 面試之道之效能篇面試
- Java學習之反射篇Java反射
- Java 審計之SSRF篇Java
- Java審計之XSS篇Java
- hadoop之yarn(優化篇)HadoopYarn優化
- Java 審計之XXE篇Java
- JAVASE之JAVA泛型篇Java泛型
- 精通MySQL之架構篇MySql架構
- Android Architecture Components 之 Room 篇AndroidOOM
- MVVM架構篇之DataBinding(-)MVVM架構
- 深入 Nginx 之架構篇Nginx架構
- spring cloud gateway 之限流篇SpringCloudGateway
- spring cloud gateway之filter篇SpringCloudGatewayFilter
- 面向面試之 HTML 篇面試HTML
- 面向面試之 CSS 篇面試CSS
- 三篇論文之bigtable
- webpack系列之-原理篇Web
- 深入剖析框架之OkHttp篇框架HTTP
- Docker 深入篇之 Build 原理DockerUI