听说过Netflix的Chaos Monkey吗?不用羡慕,我们.NET也有

Chaos Monkey,是Netflix工程师创建的一种故障注入系统,它会随机在生产实例中引发各种各样的故障或异常,以确保它们的系统能够在这样的情况下存活,而不会对客户造成任何影响。

可见,Chaos Monkey可以提高系统的安全和可用性。

那如何在.NET中用优雅的方式实现故障注入呢?

Simmy

Simmy是Polly团队发布的一个混沌工程和故障注入工具,它允许你在通过Polly执行代码的任何位置引入一个或多个故障注入策略。

Simmy提供了以下类型的故障注入策略:

  • 异常策略,在你的系统中注入异常;

  • 结果策略,控制返回的结果类型;

  • 延迟策略,类似Netflix的Latency Monkey,执行远程调用时注入巨大的延迟,模拟一个节点甚至整个服务宕机的情况;

  • 行为策略,允许在调用之前注入任何额外的行为;

下面我们就来演示一下,具体如何使用Simmy。

实现Chaos Monkey

假设,我们的API提供天气预报,而具体的天气信息来自于“中国天气网”,也就是说我们依赖于第三方。

如果第三方出现故障,我们应该要有一定的保障措施。

1.实现功能

新建ASP.NET Core Web API项目,在Startup.cs中添加如下代码:

public void ConfigureServices(IServiceCollection services)
{...services.AddHttpClient("Weather", client =>{client.BaseAddress = new Uri("http://www.weather.com.cn/");client.DefaultRequestHeaders.Add("Accept", "application/json");client.Timeout = TimeSpan.FromSeconds(2);});
}

修改WeatherForecastController.cs,代码如下:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{private readonly IHttpClientFactory _httpClientFactory;public WeatherForecastController(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}[HttpGet]public async Task<string> Get(){var client = _httpClientFactory.CreateClient("Weather");string result = await client.GetStringAsync("data/sk/101200101.html");return result;}
}

运行后,返回结果正常:

2.引入Simmy

添加nuget包Polly.Contrib.SimmyMicrosoft.Extensions.Http.Polly,修改Startup.cs代码:

public void ConfigureServices(IServiceCollection services)
{...IAsyncPolicy<HttpResponseMessage> chaosPolicy = MonkeyPolicy.InjectLatencyAsync<HttpResponseMessage>(with =>with.Latency(TimeSpan.FromSeconds(5))//50%的几率出现故障.InjectionRate(.5)//默认关闭.EnabledWhen(GetChaosEnabled));services.AddHttpClient("Weather", client =>{client.BaseAddress = new Uri("http://www.weather.com.cn/");client.DefaultRequestHeaders.Add("Accept", "application/json");client.Timeout = TimeSpan.FromSeconds(2);}).AddPolicyHandler(chaosPolicy);
}public static bool ChaosEnabled = false;
private static Task<bool> GetChaosEnabled(Context context, CancellationToken ct)
{return Task.FromResult(ChaosEnabled);
}

我们引入了延迟策略,但是现在我们还没有开启。

3.设置开关

添加ChaosController.cs,代码如下:

[ApiController]
[Route("[controller]")]
public class ChaosController : ControllerBase
{[HttpGet]public async Task<bool> Swich(){Startup.ChaosEnabled = !Startup.ChaosEnabled;return Startup.ChaosEnabled;}
}

这样,我们就可以控制是否启用策略了。

4.放出Monkey

首先,访问/Chaos/switch,开启策略。

然后多访问几次WeatherForecast,你就会看到如下页面:

Monkey出现了!

结论

现在,你应该已经修复了发现的问题。但是同时,你还需要部署一套监控工具,以便及时发现其他问题并定位它们的确切位置。

赶快添加其他策略,让你的Chaos Monkey军团更加壮大吧!

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP中session与cookie的简单使用

2019独角兽企业重金招聘Python工程师标准>>> cookie简单实例&#xff1a; <?php if($_GET[out]){ //注销cookie setcookie(id,); setcookie(password,); echo "<script>location.hrefcookie.php</script>"; …

NetBeans Weekly News 刊号 # 27 - Sep 24, 2008

刊号 # 27 - Sep 24, 2008 日程表 注册 NetBeans Day--圣保罗&#xff0c;巴西&#xff08;十月一日&#xff09; 欢迎来到巴西圣保罗的 Sun Tech Days 。赶快在十月一日加入我们的 NetBeans Deep Dive 吧&#xff01;注册 NetBeans Day 是免费的&#xff0c;即使您不参加 Sun …

做项目开发你必须得掌握的知识:设计模式

先分享一个小故事 两个年轻人是大学同班同学&#xff0c;毕业后被同一家公司录取&#xff0c;可以说是站在相同的起跑线上。两人对未来也都是信心满满&#xff0c;踌躇满志。其中一人怀抱满腔激情&#xff0c;到处学习热门框架&#xff0c;但受限于公司体量和业务逻辑&#xff…

985硕博士:你为什么比我差?

全世界只有3.14 % 的人关注了青少年数学之旅身边总有些人看上去很轻松&#xff0c;不仅在工作中游刃有余&#xff0c;还知识渊博&#xff0c;对各种事情有自己的思考。这次&#xff0c;我们非常认真地筛选了这些公众号&#xff0c;他们专注于内容&#xff0c;关心当下发生的事情…

ESXI转HYPER-V,问题接二连三啊(VMDK转VHD)

首先说软件&#xff1a; 要不是用SCVMM来转的话&#xff0c;我用得最爽的还是WINIMAGE&#xff0c;自然流畅。其它的都有各种问题。 其次说说配置更改&#xff1a; 如果原ESXI里只有一个硬盘&#xff0c;一切好说&#xff0c;如果里面挂载了两个&#xff0c;甚至三个硬盘&#…

ASP.NET2.0_多语言本地化应用程序

1.设置当前文化 页面类有两个影响本地化的重要属性均在< % Page % >指令设置:1).UICulture 此属性用于指定载入到页面的资源文件,资源文件可以包含页面文本内容的特定语言的翻译版本.其属性值可为中立文化也可为特定文化(下面有介绍&#xff09;2).Culture …

不用“背”单词,一个方法从普通二本到哥伦比亚大学:我是如何做到的?

全世界只有3.14 % 的人关注了青少年数学之旅“学英语太难、太费劲了。”我听过无数人这么说。然而&#xff0c;我的学员们&#xff0c;却都只用了短短3—6个月时间&#xff0c;就以惊人速度提高了英语&#xff1a;小磊&#xff1a;勉强踩着2本线上了大学&#xff0c;四级考了3次…

“熊猫烧香”源码启示录

一、 引言 去年秋天回趟老家&#xff0c;适逢家中秋收后“祭宅神”。期间&#xff0c;听亲家二大娘在香毕吟颂的《十柱香》的佛歌&#xff0c;深有感触&#xff1a;百姓烧香祝的是神仙幸福&#xff0c;盼的是亲人平安—这 是作为衣食百姓发自内心的心愿&#xff01;但如今&…

ios之UISplitViewController

iPad的屏幕比iPhone大&#xff0c;所以在界面上&#xff0c;iPad比iPhone多一个UISplitViewController&#xff0c;用来实现iPad在横屏时&#xff0c;分两栏显示所需要的界面&#xff0c;可以一边是目录一边是具体的内容。下面我将详细的阐述UISplitViewController在ipad中的使…

为什么日本的科学那么牛?

▲ 点击查看日本化学家吉野彰&#xff0c;因发明了现代锂离子电池&#xff08;LIB&#xff09;&#xff0c;成为了今年的诺贝尔化学奖得主&#xff0c;一起获得这个奖项的&#xff0c;还有斯坦利惠廷汉姆、古迪纳夫。吉野彰事实上&#xff0c;当我们往回看这些年诺贝尔奖获得…

技术分享|单元测试推广与实战-在全新的DDD架构上进行单元测试

源宝导读&#xff1a;单元测试是伴随软件工程出现和发展的&#xff0c;怎么做大家可能各有见解。本文介绍了单元测试中的反模式&#xff0c;强调了可测试性的重要性&#xff0c;并以 DDD 架构项目的迭代进程作为示例&#xff0c;演示了单元测试的组织过程&#xff0c;展示了单元…

Object-C中的字符串对象1-不可变字符串

2019独角兽企业重金招聘Python工程师标准>>> #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {autoreleasepool {NSString *str1"this is string A";NSString *str2"this is string B";NSString *temp;NSCom…

硬盘分区与故障排解速查手册(1)

在所有计算机配件中&#xff0c;硬盘是一个比较特殊的角色&#xff0c;它不仅关系到系统的整体性能&#xff0c;而且用户的所有资料都保存在它的身上。 那么&#xff0c;硬盘该如何初始化呢&#xff1f;遇到硬盘故障该如何解决呢&#xff1f;一、大硬盘分区与格式化 硬盘分区是…

Ant Design Blazor 发布 0.9.0,共100+人贡献!

???? 截至这个版本&#xff0c;本项目一共迎来 101 位贡献者&#xff0c;是他们成就了这个项目&#xff01;在此感谢他们慷慨的贡献&#xff01;变更记录Tabs???? 增加路由服用多标签页组件 ReuseTabs。(demo) #1704 ElderJames???? 增加 OnClose 事件与 TabTempla…

人类究竟有多喜欢看热闹?! | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

Python通过amqp消息队列协议中的Qpid实现数据通信

简介&#xff1a;这两天看了消息队列通信&#xff0c;打算在配置平台上应用起来。以前用过zeromq但是这东西太快了&#xff0c;还有就是rabbitmq有点大&#xff0c;新浪的朋友推荐了qpid&#xff0c;简单轻便。自己总结了下文档&#xff0c;大家可以瞅瞅。AMQP&#xff08;消息…

基于 Blazor 打造一款实时字幕

早先在录制视频的时候一直使用的是 obs-auto-subtitle 作为实时字幕展示功能。不过这个是以 OBS 插件的形式存在&#xff0c;不管是语言和功能上都有一定的限制。故而使用 Blazor server 实现一个。总体思路 实时字幕自然需要语音转文字的功能。考察了一些服务之后&#xff0c;…

一个数学系毕业的物理学家,是怎么拿到诺贝尔化学奖的?

全世界只有3.14 % 的人关注了青少年数学之旅2019年10月9日&#xff0c;这个“特别好”教授&#xff0c;1940年&#xff0c;“特别好”考上了耶鲁&#xff0c;1943年&#xff0c;“特别好”终于拿到数学学士学位。“特别好”特别沮丧&#xff0c;▲ “特别好”在牛津大学&#x…

杀鸡焉用牛刀!放下Windbg,让dotnet-stack来快速定位死锁原因

我们用来分析CPU过高、死锁问题的常见方案是使用Windbg分析dump文件。但是这种方式存在一些缺点&#xff0c;比如dump文件过大难以下载&#xff0c;windbg使用过于复杂难以掌握等。这里介绍一个小工具dotnet-stack&#xff0c;帮助我们检查托管代码调用堆栈&#xff0c;快速定位…

数学中那些非常奇葩的证明

全世界只有3.14 % 的人关注了青少年数学之旅一、费马大定理证明证&#xff1a;是无理数假设是有理数&#xff0c;p和q是互素正整数那么移项得又由费马大定理可知&#xff1a;与费马大定理(Fermats last therorem)矛盾, Q.E.D. &#xff08;也可易证2的n分之一次方且n属于大于2的…