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的服务端正常工作的话,页面会显示如下结果:

如果把服务端停止的话,页面则会显示另外的结果:

使用仪表盘的话,则可以看到更直观的数据(这里使用的也是上文中现成的客户端服务,已带有仪表盘功能):

Steeltoe之Circuit Breaker篇的更多相关文章
- .NET Core中Circuit Breaker
谈谈Circuit Breaker在.NET Core中的简单应用 前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不 ...
- 谈谈Circuit Breaker在.NET Core中的简单应用
前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不了服务之间的相互调用问题!如果调用没有处理好,就有可能造成整个系统的 ...
- Circuit Breaker Pattern(断路器模式)
Handle faults that may take a variable amount of time to rectify when connecting to a remote service ...
- Circuit Breaker Features
Better to use a circuit breaker which supports the following set of features: Automatically time-out ...
- Circuit Breaker模式
Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误.该模式可以提高一个应用的稳定性和弹性. 问题 在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源或者是 ...
- [AOP] 7. 一些自定义的Aspect - Circuit Breaker
Circuit Breaker(断路器)模式 关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式.它的作用一言以蔽之就是提高系统的可用性,在出现的问题通过服务降级的手段来保证系统的整体 ...
- Akka之Circuit Breaker
这周在项目中遇到了一个错误,就是Circuit Breaker time out.以前没有接触过,因此学习了下akka的断路器. 一.为什么使用Circuit Breaker 断路器是为了防止分布式系 ...
- 55.fielddata内存控制以及circuit breaker断路器
课程大纲 fielddata加载 fielddata内存限制 监控fielddata内存使用 circuit breaker 一.fielddata加载 fielddata加载到内存的过程是lazy加 ...
- 再探Circuit Breaker之使用Polly
前言 上一篇介绍了使用Steeltoe来处理服务熔断,这篇我们将用Polly来处理服务熔断. 不废话了,直接进正题. 简单的例子 同样先定义一个简单的服务. [Route("api/[con ...
随机推荐
- CentOS下防御或减轻DDoS攻击方法(转)
查看攻击IP 首先使用以下代码,找出攻击者IP netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 将会得 ...
- C#-MVC开发微信应用(8)--菜单管理的实现
之前讲解了微信后台管理页面的操作来管理菜单,下面我们在简单的来看一下,代码是如何实现的. 我们要实现获取微信的菜单.创建菜单.删除菜单等操作. 01.首先定义菜单操作的接口: /// <summ ...
- Lambert漫反射的BRDF
Lambert漫反射brdf=Albedo/pi. 推导: 如图,设Lambert面元获得入射照度Ei,各方向均匀释放亮度,每个方向释放的亮度都是Lo. 又设此表面反射率为Albedo,根据反射率定义 ...
- 详解shell编程中2>&1用法
在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 下面看一个命令示例,然后分析下他是如何工作的: ls foo > /dev/null 2>&am ...
- AJAX技术之DWR框架
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...
- MySQL累积求和
有如下表 id money 1 10 2 20 3 30 4 40 求出如下数据 id money cum 1 10 10 2 20 30 3 30 60 4 40 100 建表 CREA ...
- 【Linux高级驱动】如何分析并移植网卡驱动
dm9000的驱动分析 m9000_init platform_driver_register(); db); db); ); ; id_val ; id_val ; /* 获取芯片型号 */ id ...
- SAP BW 数据库表命名规则
SAP BW 数据库表命名规则 已有 315 次阅读2012/6/8 15:55 |系统分类:专业内容| SAP, 命名, 数据库表 Namings for Cube: /BI<C OR DIG ...
- golang:吐槽multipart的设计
最近在做邮件解析的工作,因此接触到multipart库,用了之后才发现golang的multipart有一点设计很诡异. 红线标出来的话意思是:当Content-Transfer-Encoding的值 ...
- 【iCore1S 双核心板_FPGA】例程五:Signal Tapll 实验——逻辑分析仪
核心代码: //--------------------Module_Signal_TapII-------------------// module Signal_TapII( input CLK_ ...