如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
Intro
健康檢查可以幫助我們知道應(yīng)用的當(dāng)前狀態(tài)是不是處于良好狀態(tài),現(xiàn)在無(wú)論是 docker 還是 k8s 還是現(xiàn)在大多數(shù)的服務(wù)注冊(cè)發(fā)現(xiàn)大多都提供了健康檢查機(jī)制來(lái)檢測(cè)應(yīng)用的健康狀態(tài),如果應(yīng)用本身就提供一個(gè)健康檢查的機(jī)制會(huì)更友好,更能真實(shí)的反映出應(yīng)用的健康狀態(tài)。
我們的開(kāi)發(fā)環(huán)境虛擬機(jī)配置有點(diǎn)低,所以有時(shí)候虛擬機(jī)會(huì)卡死。。導(dǎo)致接口無(wú)響應(yīng),有時(shí)可能有些服務(wù)啟動(dòng)有問(wèn)題會(huì)掛掉,所以需要一個(gè)簡(jiǎn)單的健康檢查機(jī)制去檢查應(yīng)用的健康狀態(tài)來(lái)第一時(shí)間知道應(yīng)用出現(xiàn)異常。
健康檢查擴(kuò)展實(shí)現(xiàn)
實(shí)現(xiàn)源碼
public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder) { return UseHealthCheck(applicationBuilder, new PathString("/api/health")); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path) { return UseHealthCheck(applicationBuilder, new PathString(path)); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path) { applicationBuilder.Map(path, builder => builder.Use( (context, next) => { context.Response.StatusCode = 200; return context.Response.WriteAsync("healthy"); })); return applicationBuilder; } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path, Func<IServiceProvider, bool> checkFunc) { return UseHealthCheck(applicationBuilder, new PathString(path), serviceProvider => Task.FromResult(checkFunc(serviceProvider))); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path, Func<IServiceProvider, Task<bool>> checkFunc) { return UseHealthCheck(applicationBuilder, new PathString(path), checkFunc); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, bool> checkFunc) { if (checkFunc == null) { checkFunc = serviceProvider => true; } return UseHealthCheck(applicationBuilder, path, serviceProvider => Task.FromResult(checkFunc(serviceProvider))); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, Task<bool>> checkFunc) { if (checkFunc == null) { checkFunc = serviceProvider => Task.FromResult(true); } applicationBuilder.Map(path, builder => builder.Use( async (context, next) => { try { var healthy = await checkFunc.Invoke(context.RequestServices); if (healthy) { context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.WriteAsync("healthy"); } else { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; await context.Response.WriteAsync("unhealthy"); } } catch (Exception ex) { context.RequestServices.GetService<ILoggerFactory>().CreateLogger("HealthCheck").Error(ex); context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; await context.Response.WriteAsync("unhealthy"); } })); return applicationBuilder; }
配置健康檢查
在 Startup 里配置健康檢查,示例代碼
app.UseHealthCheck(); // 最基本的健康檢查, 默認(rèn)檢查路徑為 ""/api/health",直接返回 healthy app.UseHealthCheck("/heath"); // 配置健康檢查的路徑為 "/health",直接返回 healthy app.UseHealthCheck("/health", serviceProvider => { // 檢查數(shù)據(jù)連接是否正常,這里只是一個(gè)示例,可以根據(jù)需要自定義自己的實(shí)現(xiàn) var configuration = serviceProvider.GetService<IConfiguration>(); var connString = configuration.GetConnectionString("DefaultConnection"); try { using (var conn = new SqlConnection(connString)) { conn.EnsureOpen(); } return true; } catch (Exception) { return false; } });
實(shí)際效果
直接啟動(dòng)訪問(wèn) "/health"
數(shù)據(jù)庫(kù)連接改為一個(gè)錯(cuò)誤的連接,修改數(shù)據(jù)庫(kù)名稱為一個(gè)不存在的數(shù)據(jù)庫(kù)
End
這個(gè)實(shí)現(xiàn)比較簡(jiǎn)單,只是實(shí)現(xiàn)一個(gè)比較簡(jiǎn)單的檢查,最初的想法比較簡(jiǎn)單只是看某個(gè)應(yīng)用是否正常工作,具體的檢查邏輯可以自定義。官方的 HealthChecks 的實(shí)現(xiàn)稍為復(fù)雜,下次單獨(dú)寫一篇文章介紹。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
上一篇:淺析.Net Core中Json配置的自動(dòng)更新
欄 目:ASP.NET
下一篇:VsCode插件開(kāi)發(fā)之插件初步通信的方法步驟
本文標(biāo)題:如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10934.html
您可能感興趣的文章
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11asp.net Core3.0區(qū)域與路由配置的方法
- 01-11ASP.Net Core中使用枚舉類而不是枚舉的方法
- 01-11Asp.net core利用MediatR進(jìn)程內(nèi)發(fā)布/訂閱詳解
- 01-11WCF如何綁定netTcpBinding寄宿到控制臺(tái)應(yīng)用程序詳解
- 01-11ASP.NET Core中間件計(jì)算Http請(qǐng)求時(shí)間示例詳解
- 01-11asp.net core集成JWT的步驟記錄
- 01-11ASP.NET Core MVC學(xué)習(xí)教程之路由(Routing)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開(kāi)發(fā)詳解
- 01-11VsCode插件開(kāi)發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開(kāi)發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)