使用ASP.NET Core 实现Docker的HealthCheck指令

640?wx_fmt=gif 写在前面

         HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查。

健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配置健康探测的的场景有 :

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

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

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

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程序的健康检查能力

 640?wx_fmt=png

640?wx_fmt=gif ASP.NET Core 实现HealthCheck

  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项目物理资源和服务依赖的健康检查需求, 这里我们为避免重复造轮子,引入了开源的力量。

640?wx_fmt=gif 开源社区对HealthCheck的支持

 开源的企业级AspNetCore.Diagnostics.HealthChecks系列组件,该系列组件支持多种物理资源和服务依赖的健康检查,支持报告推送,支持友好的检查报告UI(支持后台轮训检查)、支持webhook通知。

下面的步骤演示了对web程序HTTP请求、Redis、Sqlite等服务进行健康检查的端点配置

    ① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget库

    ② startup中配置并启用健康检查

640?wx_fmt=png


// 以下代码截取自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,包含所有检查项的详细检查结果
});

注意

    上文配置的HEALTHCHECK 指令: 

       HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1

      并不关注响应体输出,依然对于success response 返回0, error response返回1。

640?wx_fmt=gif 测试容器的HEALTHCHECK输出

    使用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

   容器在启动的时候是starting, 一旦监测到成功的响应状态码,将会转换为healthy 并将会持续间隔轮询检查。

 640?wx_fmt=gif附加知识点

   抛开Docker的HEALTHCHECK指令、负载均衡器的轮询机制不谈,我们的Web自身也可以进行 轮询健康检查并给出告警。

就我们上面的Web 实例来说,我们只对外提供的是一个 /healthcheck 检查端点,引入HealthChecks.UI.dll 将会在前端生成友好的HealthReport 界面, 该库支持后台轮询检查、支持webhook 通知。

这里就不展开说明,自行前往AspNetCore.Diagnostics.HealthChecks查看响应文档,效果如下:

640?wx_fmt=png

至此,本文内容完毕:

   -  使用ASP.NETCore 框架实现一个稍复杂的HealthCheck端点 /healthz

    - 使用docker的HEALTHCHECK 指令对接Web程序健康检查端点(该能力是实现容器自愈的基础, 请关注后续博文)。

原文地址:https://www.cnblogs.com/mi12205599/p/10837804.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

VS Code 中有哪些好用的 Azure 插件?

在之前的文章中,我们提到了 Amazon、Google、IBM、Red Hat、Salesforce、Pivotal 等大厂都在 VS Code 中有提供相应的开发工具:亚马逊上了 VS Code 的船,还有哪些大厂也上了船?微软必定更是把 VS Code 作为其最重要的开发者平台了…

CF1592E Bored Bakry

CF1592E Bored Bakry 题意: 给你长度为n的数组a,现在定义一段区间[l,r]为good,如果al&al1&...&ar>al⊕al1⊕...⊕ara_{l}\& a_{l1}\&...\&a_{r}>a_{l}⊕a_{l1}⊕...⊕a_{r}al​&al1​&...&ar​&…

邀请 | 关于微软容器服务,你需要知道的二三事

容器是近年来特别火的话题,那么,什么是容器?为什么我们需要容器服务?微软容器服务特点是什么?今天我们用一种特殊的方式为大家介绍这三大话题。什么是容器这个部分,我们用一个故事进行开场。很久以前&#…

Codeforces Round #746 (Div. 2)

Codeforces Round #746 (Div. 2) 题号题目难度AGamer HemoseBHemose ShoppingCBakry and PartitioningDHemose in ICPC ?EBored Bakry二进制思想F1Alice and Recoloring 1F2Alice and Recoloring 2

CF1592D Hemose in ICPC ?

CF1592D Hemose in ICPC ? 题意: 给你一棵n个节点的树,定义dis(a,b)a,b两点之间路径的gcd的最大值 最多可以询问12次,每次询问给出一个点集合,系统返回当前点集的所有点对中的最大Dist,最终需要输出a,b两…

UWP 推荐 | 限时免费的RSS阅读器《RSS 追踪》登录 Windows 10

前不久,本公号作者 Bravo Yeung 写了一篇不错的关于 RSS 的文章 .Net开发者必知的技术类RSS订阅指南。RSS 现在用的人很少了,而且就算是我,也不过是在一周前才开始正视 RSS 。只因为接触到了一个很好很强大的社区 RSS Hub ,当时看…

King Gym - 102471H

King Gym - 102471H 题意: 给你一个数组b,让你找到一个最长的最长的king子序列,如果长度大于等于n/2,输出长度值,否则输出-1 一个序列(a1,a2,...,an)(a_{1},a_{2},...,a_{n})(a1​,a2​,...,an​)是king序列当且仅当…

常见跨域解决方案以及Ocelot 跨域配置

常见跨域解决方案以及Ocelot 跨域配置Intro我们在使用前后端分离的模式进行开发的时候,如果前端项目和api项目不是一个域名下往往会有跨域问题。今天来介绍一下我们在Ocelot网关配置的跨域。什么是跨域跨域:浏览器对于javascript的同源策略的限制,例如a.cn下面的js不…

E - Flow Gym - 102471E

E - Flow Gym - 102471E 题意: n个点,m条边,从点1到点n有k条相同长度的路径,每个边都有对应的容量,你可以进行任意次操作,每次将一个边的容量-1,将另一个边的容量1,问最少操作多少…

解读大内老A的《.NET Core框架本质》

老A说的一句话让我很受启发,想要深入了解框架,你要把精力聚焦在架构设计的层面来思考问题。而透彻了解底层原理,最好的笨办法就是根据原理对框架核心进行重建或者说再造。看起来没有捷径,也是最快的捷径。相信很多读者已经看过老A…

2019 ICPC Asia-East Continent Final

2019 ICPC Asia-East Continent Final 题号题目知识点ACity贪心BBlack and WhiteCDirichlet kkk-th rootDFireEFlow思维FGameGHappinessHKing随机思维IMoonJPermutationKAll Pair Maximum FlowLTravelMValue状压贪心

Mono和.NET Core 从比翼双飞到合体

.NET 开源之路就是 Mono和.NET Core 从比翼双飞到合体:2001年12月-2002年2月。一个新的平台诞生了。与惠普、英特尔和其他公司一起, 创建了 ECMA-335 标准, 该标准定义了支持多种编程语言的公共语言基础结构,C# 和 Visual Basic. Net。 F # 于2007年晚些…

7-3 打怪升级 (25 分)

7-3 打怪升级 (25 分) 题意: 很多游戏都有打怪升级的环节,玩家需要打败一系列怪兽去赢取成就和徽章。这里我们考虑一种简单的打怪升级游戏,游戏规则是,给定有 N 个堡垒的地图,堡垒之间有道路相连,每条道路…

Skywalking部署常见问题以及注意事项

Skywalking部署常见问题以及注意事项IntroSkyWalking 创建与2015年,提供分布式追踪功能。从5.x开始,项目进化为一个完成功能的Application Performance Management系统。他被用于追踪、监控和诊断分布式系统,特别是使用微服务架构&#xff0c…

CF1486B Eastern Exhibition

CF1486B Eastern Exhibition 题意: 二维平面上有 n 个点,要找一个点,使得所有点到它的曼哈顿距离( x 和 y 的坐标差距之和)之和最小。请问有几个满足该要求的点? 题解: 我们先考虑一维的情况…

GitHub推出包管理服务,npm与Nuget全支持

GitHub 今天推出了一项名为 GitHub Package Registry 的新产品,它提供了软件包管理服务,开发者通过它可发布公共或私有软件包。官方介绍,GitHub Package Registry 完全集成在 GitHub 中,因此和 repo 一样,用户可以使用…

Codeforces Round #708 (Div. 2)

Codeforces Round #708 (Div. 2) 题号题目知识点AMeximization思维BM-arrays思维C1k-LCM (easy version)构造C2k-LCM (hard version)构造DGenius思维构造E1Square-free division (easy version)质因子分解E2Square-free division (hard version)线性dp

CF1497E1 Square-free division (easy version)

CF1497E1 Square-free division (easy version) 题意: 这是简单版,此题中 k0 给出一串长为 n 的序列 a1,a2,a3...ana_1,a_2,a_3...a_na1​,a2​,a3​...an​ 把它分成尽量少的块使每一块中任意两数的乘积不是一个完全平方数。 输出最少的块数。 题解&…

发布dotNetCore程序到Kubernetes

上一篇《Mac中搭建Kubernetes》介绍了怎样在Mac中搭建单节点的Kubernetes,本文将编写一个dotNetCore的示例程序,并发布到Kubernetes中。环境基本步骤创建dotnetCore示例项目;本地搭建私有registry,或者使用DockerHub,本…

CF1497E2 Square-free division (hard version)

CF1497E2 Square-free division (hard version) 题意: 数组 a 由 n 个正整数构成。你需要将它们分割成最小数量的连续子段,使得每一个子段中的任意两个数(不同位置)的乘积不为完全平方数。 除此之外,你被允许在分割之…