容器HEALTHCHECK指令对接ASP.NET Core健康检查能力
? ? ? ? ?HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查。 健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配置健康探测的的场景有 :
HealthCheck提供一种 告知外部应用运行状态的机制。 ? 容器HEALTHCHECK指令一般情况下我们很容易知道容器正在运行[running], 但容器作为相对独立的应用执行环境,有时候并不知道容器是否以预期的方式正确运作[working] Dockerfile/ docker-compose.yml文件提供的 HEALTHCHECK指令提供了探测容器正确工作的轮询机制,轮训内容可由应用自身决定。 该指令定义轮询参数interval、探测超时参数timeout、 重试参数retries 进行不间断探测容器: // 通过在容器内运行shell命令来探测容器健康状态, 命令返回值0表示容器healthy, 命令返回值1表示unhealthy
EALTHCHECK [OPTIONS] CMD command
对于容器内Web应用,自然而然会想到使用暴露HTTP端点的方式去探测,并将error response认定为unhealthy // 容器每隔5min请求应用程序的http://localhost(重试3次),成功响应则返回0,错误响应则返回1
HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1 下面我们会将渐进式演示 使用Docker平台的HEALTHCHECK指令对接 ASP.NET Core程序的健康检查能力。 ? ? ASPNET Core在2.2版本内置了健康检查的能力, 使用的是一个HealthCheck Middleware, 该中间件是一个终端中间件,满足该路径的url请求,将会被该中间件处理。 public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); } public void Configure(IApplicationBuilder app,IHostingEnvironment env) { app.UseHealthChecks("/healthcheck"); } ? 请求/healthcheck端点, 程序会进行健康检查逻辑并响应输出, 默认的行为: ? ? ?① 对healthy、degraded状态返回200 OK 响应码; 对于unhealthy返回503 Service Unavailable?响应码 ? ? ?② 响应体只会包含简单的HealthStatus枚举字符串 ? ? ?③ 将每次健康检查的结果写入HealthReport对象。 ? ?作为企业级项目,存在对Web项目物理资源和服务依赖的健康检查需求, 这里我们为避免重复造轮子,引入了开源的力量。 ?
下面的步骤演示了对web程序HTTP请求、Redis、Sqlite等服务进行健康检查的端点配置 ? ? ① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget库 ? ? ② startup中配置并启用健康检查 // 以下代码截取自 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枚举值 ? ?? 小技巧:你也可以使用UseHealthChecks()扩展方法修改默认的响应输出, 这里我们可引入HealthChecks.UI.Client nuget package输出更加详细的的HealthReport app.UseHealthChecks("/healthz",new HealthCheckOptions() { Predicate = _ => true,ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse // 该响应输出是一个json,包含所有检查项的详细检查结果 }); 注意
? ?? ? 使用docker ps命令可查看容器的状态, 通过docker inspect [container_id] 查看容器HealthCheck的输出 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0111ea10581f eqidmanager_proxy "nginx -g ‘daemon ..." 24 hours ago Up 24 hours 0.0.0.0:80->80/tcp eqidmanager_proxy_1 8e96a0e8b993 eqidmanager_app "dotnet EqidManage..." 24 hours ago Up 24 hours (healthy) 80/tcp eqidmanager_app_1
时间:2019-05-09 14:52:29
阅读(13)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 将ASP.NET 5远程发布到IIS
- asp.net-mvc – NHibernate与实体框架
- 覆盖单个页面的ASP.NET表单身份验证
- asp.net-mvc – 为什么ASP.NET MVC Html.CheckBox输出两个I
- asp.net – 如何在Nuget中排除/不显示.NET Framework包?
- asp.net – Linq’包含’查询耗时太长
- NHibernate中关于Inverse的理解和使用
- asp.net-mvc – 如何检测ASP.NET站点是在本地,azure web角色
- .net – MVC 4 Mocking HttpContext – 如何模拟DisplayMod
- asp.net-mvc – 发送电子邮件是否属于应用程序的表示层或业
- asp.net-mvc – Full-Stack Web应用程序框架的定
- asp.net-mvc – 如何测试MVC3 razor布局中是否存
- asp.net – 防止在ASP .Net中为单个用户进行多次
- ASP.NET表单身份验证 – 在调试时使用测试帐户自
- asp.net-mvc – 具有SelectList(s)最佳实践的ASP
- Asp.net服务器端代码块说明
- asp.net-mvc – 使用DTO而不是域实体进行ASP.NET
- asp.net-mvc – 我们可以传递模型作为参数在Redi
- asp.net-mvc – VS2013不编译ASP.NET MVC5视图
- prolog – 如何理解ASP中的否定失败?