听说过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.Simmy和Microsoft.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“,記住我!
總結
以上是生活随笔為你收集整理的听说过Netflix的Chaos Monkey吗?不用羡慕,我们.NET也有的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于事件驱动架构构建微服务第1部分:应用
- 下一篇: 如何排查 StackOverflow 异