Docker-HealthCheck指令探测ASP.NET Core容器健康状态

写在前面

HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查,还包括应用程序对外部服务或依赖资源的健康检查。
健康检查通常是以暴露应用程序的HTTP端点的形式实施,可用于配置健康探测的的场景有 :

  1. 容器或负载均衡器 探测应用状态,执行既定策略,例如:容器探测到应用unhealthy可终止后续的滚动部署或者重启容器;负载均衡器探测到实例unhealthy能将请求路由到健康的运行实例。

  2. 对应用程序种依赖的第三方服务进行健康探测,比如redis、database、外部服务接口

  3. 内存、硬盘、网络等物理依赖资源的探测

HealthCheck提供对外暴露程序运行状态的机制。

容器HEALTHCHECK指令

一般情况下我们很容易知道容器正在运行running, 但容器作为相对独立的应用执行环境,有时候并不知道容器是否以预期方式正确运作working

Dockerfile 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端点成功,命令返回0;curl web端点失败,命令返回1

// curl -f 表示请求失败返回
HEALTHCHECK --interval=5m --timeout=3s --retries=3 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实践&排坑指南

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

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

相关文章

ASP.NET Core分布式项目实战(课程介绍,MVP,瀑布与敏捷)--学习笔记

任务1:课程介绍课程目标:1、进一步理解 ASP.NET Core 授权认证框架、MVC 管道2、掌握 Oauth2,结合 Identity Sercer4 实现 OAuth2 和 OpenID Connect Server3、掌握 ASP.NET Core 与 Redis, MongoDB, RabitMQ, MySQL 配合使用4、理解 DDD&…

html坐标轴背景色,CSS 背景(css background)

CSS 背景-CSS background一、Css background背景语法 - TOPCSS背景基础知识CSS 背景这里指通过CSS对对象设置背景属性,如通过CSS设置背景各种样式。背景语法:background: background-color || background-image || background-repeat || background-…

LeetCode 965单值二叉树-简单

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:true 示例 2: 输入&…

使用EF.Core将同一模型映射到多个表

在 EntityFramework Core 中,我们可以使用属性或Fluent API来配置模型映射。有一天,我遇到了一个新的需求,有一个系统每天会生成大量数据,每天生成一个新的表存储数据。例如,数据库如下所示:所有表都具有相…

EntityFramework Core 3.x添加查询提示(NOLOCK)

前几天看到有博客园中有园友写了一篇关于添加NOLOCK查询提示的博文,这里呢,我将介绍另外一种添加查询提示的方法,此方式源于我看过源码后的实现,孰好孰歹,请自行判之,接下来我们一起来看看。在EntityFramew…

Xamarin.Forms客户端第一版

1. 功能简介1.1. 读取手机基本信息主要使用Xamarin.Essentials库获取设备基本信息,Xam.Plugin.DeviceInfo插件获取App Id,其实该插件也能获取设备基本信息。1.2. 读取手机联系人信息Android和iOS工程具体实现联系人读取服务,使用到Dependency…

给 EF Core 查询增加 With NoLock

给 EF Core 查询增加 With NoLockIntroEF Core 在 3.x 版本中增加了 Interceptor,使得我们可以在发生低级别数据库操作时作为 EF Core 正常运行的一部分自动调用它们。例如,打开连接、提交事务或执行命令时。所以我们可以自定义一个 Interceptor 来记录执…

LeetCode 138 复制带随机指针的链表-中等

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记...

任务4:第一章计划与目录敏捷产品开发流程原型预览与业务介绍整体架构设计API 接口设计 / swaggerIdentity Server 4 搭建登录账号 API 实现配置中心任务5:业务介绍项目背景:基于人脉关系的金融行业项目用户:1、账号:基…

LeetCode 82 删除排序链表中的重复元素||-中等

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。 返回同样按升序排列的结果链表。 输入:head [1,2,3,3,4,4,5] 输出:[1,2,…

你复工了吗?啥感受?

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「136」篇原创敬上感觉还没做什么事情,2020年的第一季度就结束了。相信大多数人也都已经复工了。之前进行远程公办的,大多也都回到了原先在公…

LeetCode 1669合并两个链表-中等

给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中第 a 个节点到第 b 个节点删除,并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果: 请你返回结果链表的头指针。 输入&#xff1a…

dotNET Core 3.X 使用 Web API

现在的 Web 开发大多都是前后端分离的方式,后端接口的正确使用显得尤为重要,本文讲下在 dotNET Core 3.X 下使用 Web API 。环境操作系统:MacIDE:RiderdotNET Core:3.1创建项目如果是 Windows 操作系统当然是首选 VS20…

你需要了解的 HTTP Status Code

你需要了解的 HTTP Status CodeIntro现在前后端分离的开发模式越来越流行,后端负责开发对应的 API,前端只需要 关注前端页面的数据展示和前端逻辑即可。对于前后端分离这种开发模式,我个人还是比较喜欢的,因为这样可以让更专业的人…

LeetCode 24两两交换链表中的节点-中等

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 输入:head [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head []…

2021中考高考成绩查询,2021中考

2021年浙江东阳中考查分入口暂未公布!如有最新信息,中考网会第一时间发布,请中考生和家长及时关注中考网中考考试时间频道! 编辑推荐: 2021年浙江省中考查分时间及入口汇总 2021年全国各省市中考查分时间及入2021-06-1…

今天网站都变成灰色了,这其中是怎么实现的?

“ 阅读本文大概需要 7 分钟。 ”今天是 2020 年 4 月 4 日,星期六,清明节。我们的国家经历了非常惨痛的时刻,很多英雄在救助他人的路上倒下,更有很多烈士英雄保卫人民的安危遇难,今天全国下降半旗,北京时间…

深圳市公务员考试计算机专业素养,深圳市考职位分析_公务员考试专业对照表...

2020深圳市公务员招录1069人公告已发布,报名时间:11月13日-19日16:00,报名入口:深圳市考试院专栏(http://hrss.sz.gov.cn/szksy/)或深圳市人事考试考生服务系统(以下简称考生服务系统,https://hrsstext.sz.gov.cn/ess/…

LeetCode 61旋转链表-中等

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3] 输入:head [0,1,2], k 4 输出:[2,0,1] 提示: 链表中节点的数目在…

科个普:进程、线程、并发、并行

一、进程刘大胖打开电脑,想写点东西,于是打开WPS,突然又想和女朋友(反正我不信)聊聊天,就又打开了微信PC端,这时操作系统就会为这两个程序生成两个进程,如图:二、线程每个进程至少包含一个线程&…