做本地生活圈网站好吗,wordpress悬浮广告,公路水运建设质量安全监督网站,网创电商是什么写在前面HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查#xff0c;还包括应用程序对外部服务或依赖资源的健康检查。健康检查通常是以暴露应用程序的HTTP端点的形式实施#xff0c;可用于配置健康探测的的场景有 #xff1a;容器或负载均衡器 探测应用状态… 写在前面HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查还包括应用程序对外部服务或依赖资源的健康检查。健康检查通常是以暴露应用程序的HTTP端点的形式实施可用于配置健康探测的的场景有 容器或负载均衡器 探测应用状态执行既定策略例如容器探测到应用unhealthy可终止后续的滚动部署或者重启容器负载均衡器探测到实例unhealthy能将请求路由到健康的运行实例。对应用程序种依赖的第三方服务进行健康探测比如redis、database、外部服务接口内存、硬盘、网络等物理依赖资源的探测HealthCheck提供对外暴露程序运行状态的机制。容器HEALTHCHECK指令一般情况下我们很容易知道容器正在运行running 但容器作为相对独立的应用执行环境有时候并不知道容器是否以预期方式正确运作workingDockerfile HEALTHCHECK指令提供了探测容器以预期工作的轮询机制轮询内容可由应用自身决定。具体而言通过在容器内运行shell命令来探测容器健康状态以Shell命令的退出码表示容器健康状态0 指示容器健康1 指示容器不健康2 指示不使用这个退出码// 可定义轮询interval、探测超时timeout、 重试retries参数轮询探测
HEALTHCHECK [OPTIONS] CMD command
Every Linux or Unix command executed by the shell script or user has an exit status. Exit status is an integer number. 0 exit status means the command was successful without any errors. A non-zero (1-255 values) exit status means command was a failure.linux shell执行成功返回0为对接Docker-HealcthCheck失败退出码1要对Shell执行失败返回退出码1对Web应用自然会联想到使用curl命令访问端点去探测容器应用curl web端点成功命令返回0curl web端点失败命令返回1// curl -f 表示请求失败返回
HEALTHCHECK --interval5m --timeout3s --retries3 CMD curl -f http://localhost:5000/healthz || exit 1
探测命令在stdout或stderr输出的任何内容会在容器Health Status中存储可通过docker inspect [ContainerId] 查看HealthCheck状态。下面渐进式演示使用Docker平台的HEALTHCHECK指令对接 ASP.NET Core程序的健康检查能力。ASP.NET Core实现HealthCheck端点ASPNET Core在2.2版本内置了健康检查的能力终端中间件满足该路径的url请求将会被该中间件处理。public void ConfigureServices(IServiceCollection services)
{services.AddHealthChecks();
}public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{app.UseHealthChecks(/healthcheck);
}
Asp.NetCore 3.1将健康检查集成在 EndPoints请自行修改。请求/healthcheck端点 程序会进行健康检查逻辑并响应输出 默认的行为:① 对healthy、degraded状态返回200 OK响应码对于unhealthy返回503 Service Unavailable响应码② 响应体只会包含简单的HealthStatus枚举字符串③ 将每次健康检查的结果写入HealthReport对象。作为企业级项目存在对Web项目物理资源和服务依赖的健康检查需求 这里我们为避免重复造轮子引入了开源的力量。开源社区对HealthCheck的支持开源的企业级AspNetCore.Diagnostics.HealthChecks系列组件该系列组件支持多种物理资源和服务依赖的健康检查支持报告推送支持友好的检查报告UI支持后台轮询检查、支持webhook通知。下面的步骤演示了对web程序HTTP请求、Redis、Sqlite等服务进行健康检查的端点配置① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget库② Startup.cs配置并启用健康检查// 以下代码截取自 Startup.ConfigureServices方法对swagger服务地址、redis、sqlte进行健康检查
services.AddHealthChecks().AddAsyncCheck(Http, async () {using (HttpClient client new HttpClient()){try{var response await client.GetAsync(http://localhost:5000/swagger);if (!response.IsSuccessStatusCode){throw new Exception(Url not responding with 200 OK);}}catch (Exception){return await Task.FromResult(HealthCheckResult.Unhealthy());}}return await Task.FromResult(HealthCheckResult.Healthy());}).AddSqlite(sqliteConnectionString: Configuration.GetConnectionString(sqlite),healthQuery: select count(*) as count from ProfileUsageCounters;,name: sqlite,failureStatus: HealthStatus.Degraded,tags: new string[] { db, sqlite, sqlite }).AddRedis(Configuration.GetConnectionString(redis), redis, HealthStatus.Unhealthy, new string[] { redis, redis }).Services.AddMvc();// 以下代码截取自Startup.Configure方法启用/healthz作为检查端点app.UseHealthChecks(/healthz).UseMvcWithDefaultRoute(); // 这里仍然只会响应 200/503状态码简单的HealthStatus枚举值
再次强调容器HealthCheck指令不关注Shell命令的执行过程只关注shell命令的执行结果// docker-compose.yml文件健康检查 参考如下配置
healthcheck:test: curl -f http://localhost/healthcheck || exit 1interval: 1m30stimeout: 10sretries: 3
HealthChecks-UI 了解一下抛开Docker的HEALTHCHECK指令、负载均衡器的轮询机制不谈我们的Web自身也可以进行 轮询健康检查并给出告警。就我们上面的Web 实例来说我们只对外提供的是一个 /healthcheck 检查端点引入HealthChecks.UI.dll 将会在前端生成友好的HealthReport 界面 该库支持后台轮询检查、支持webhook 通知。这里就不展开说明自行前往AspNetCore.Diagnostics.HealthChecks查看相应文档效果如下至此本文内容完毕:使用ASP.NET Core框架实现一个稍复杂的HealthCheck端点 /healthz使用docker的HEALTHCHECK指令对接Web应用健康检查端点推荐阅读● DotNetCore三大Redis客户端对比和使用心得● 一文掌握Cookies前世今生● ASP.NET Core跨平台技术内幕● EFCore批量操作你真的清楚吗● 谁说docker-compose不能水平扩展容器、服务多实例● 基于docker-compose的Gitlab CI/CD实践排坑指南