使用.NET 6开发TodoList应用(28)——实现应用程序健康检查
系列导航及源代码
需求
应用健康检查在容器部署的微服务场景下非常常见,相比而言单体非容器部署的应用就不太关心这个特性,为了后续的内容我们在本文中简单介绍一下如何实现应用程序的健康检查功能。
目标
实现TodoList
的健康检查功能。
原理与思路
.NET框架从.NET Core 2.2版本开始引入了相关的功能,同时AspNetCore.Diagnostics.HealthChecks包提供了更为丰富的健康检查功能,包括数据库,消息总线,Redis和ElasticSearch的健康检查。
健康检查探针(probe)分为三种:
- readiness probes:应用程序就绪探针,判断当前应用程序是否已经启动。
- liveness probes: 应用程序存活探针,判断当前应用程序是否出于活动状态。
- startup probes:应用程序功能探针,一般我们用
hc
来表示其端口,可以用来判断应用程序内部功能是否正常(比如判断数据库连接是否正常,判断Redis连接是否正常之类)。
在本文中我们不过多地发散,通过创建一个自定义的健康检查对象来实现。
实现
自定义健康检查,实现IHealthCheck接口
Microsoft.Extensions.Diagnostics.HealthChecks
using Microsoft.Extensions.Diagnostics.HealthChecks;
namespace TodoList.Application.Common;
public class ApplicationHealthCheck : IHealthCheck
{
private static readonly Random _rnd = new ();
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
var result = _rnd.Next(5) == 0
? HealthCheckResult.Healthy()
: HealthCheckResult.Unhealthy("Failed random");
return Task.FromResult(result);
}
}
添加服务和中间件
首先在Application/DependencyInjection
中添加健康检查服务:
DependencyInjection.cs
services.AddHealthChecks().AddCheck<ApplicationHealthCheck>("Random Health Check");
然后修改Program
中间件配置如下:
Program.cs
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseHttpLogging();
app.MapDefaultControllerRoute();
app.MapHealthChecks("/liveness");
app.MapHealthChecks("/ready");
app.MapHealthChecks("/hc");
验证
启动Api
项目,执行健康检查的三个GET
接口,截图我只贴其中一个,因为我们在实现健康检查的时候,采用了随机数返回Healthy
或者Unhealthy
的方式,所以多请求几次,应该能看到下面的响应:
一点扩展
关于Smart probes和Dumb probes
- 所谓
Smart probes
最典型的目的就是为了验证应用程序是否能正确工作,像一开始所说的,它可以用来探测外部依赖如数据库、消息队列、甚至是其他API的连接是否正常,程序在这些地方是否可以按预期工作。 - 相对而言,
Dumb probes
典型的应用目的是用来判断应用程序没有崩溃,它并不检查功能及依赖上的正确性,通常表现为HTTP的直接响应。
推荐的使用方式是:
- 对于
liveness
检查,使用dumb probes
就可以了,因为只要能够响应HTTP请求,就可以证明应用程序没有崩溃。 - 对于
startup
或者称作真正的“健康”检查hc
,使用smart probes
,因为这时候不仅要保证程序没有崩溃,我们还需要某种程度的功能及依赖的健康检查,以证明程序能够按预期工作。 - 对于
readiness
检查,需要根据实际的需求来看,如果我们没有定义特殊的应用程序“就绪”标准,使用dumb probes
就可以;反之如果我们需要进行某种程度的逻辑检查来定义“就绪”,那么就需要使用smart probes
。
设置Dumb健康检查接口
修改中间件配置:
Program.cs
app.MapHealthChecks("/liveness", new HealthCheckOptions { Predicate = r => r.Name.Contains("self") });
app.MapHealthChecks("/ready", new HealthCheckOptions { Predicate = _ => false });
这时候我们再去请求健康检查,这两个接口已经固定返回Healthy
结果了,hc接口依然按照我们之前设置的进行随机返回。
总结
本文我们简单地实现了健康检查接口,目前还不太能看得出来作用,但是当我们进行容器化部署,或是进行k8s部署时,健康检查探针的作用就比较明显了。关于健康检查,更多用法请参考官方文档:Health checks in ASP.NET Core
参考资料
- AspNetCore.Diagnostics.HealthChecks
- Adding health checks with Liveness, Readiness, and Startup probes
- Health checks in ASP.NET Core
使用.NET 6开发TodoList应用(28)——实现应用程序健康检查的更多相关文章
- 使用.NET 6开发TodoList应用(3)——引入第三方日志库
需求 在我们项目开发的过程中,使用.NET 6自带的日志系统有时是不能满足实际需求的,比如有的时候我们需要将日志输出到第三方平台上,最典型的应用就是在各种云平台上,为了集中管理日志和查询日志,通常会选 ...
- 使用.NET 6开发TodoList应用(1)——系列背景
前言 想到要写这样一个系列博客,初衷有两个:一是希望通过一个实践项目,将.NET 6 WebAPI开发的基础知识串联起来,帮助那些想要入门.NET 6服务端开发的朋友们快速上手,对使用.NET 6开发 ...
- 使用.NET 6开发TodoList应用(2)——项目结构搭建
为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...
- 使用.NET 6开发TodoList应用(4)——引入数据存储
需求 作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件.对我们的TodoList项目来说,自然也需要配置数据存储.目前的需求很简单: 需要能持久化TodoList对象并对其 ...
- 使用.NET 6开发TodoList应用(5)——领域实体创建
需求 上一篇文章中我们完成了数据存储服务的接入,从这一篇开始将正式进入业务逻辑部分的开发. 首先要定义和解决的问题是,根据TodoList项目的需求,我们应该设计怎样的数据实体,如何去进行操作? 长文 ...
- 使用.NET 6开发TodoList应用(5.1)——实现Repository模式
需求 经常写CRUD程序的小伙伴们可能都经历过定义很多Repository接口,分别做对应的实现,依赖注入并使用的场景.有的时候会发现,很多分散的XXXXRepository的逻辑都是基本一致的,于是 ...
- 使用.NET 6开发TodoList应用(6)——使用MediatR实现POST请求
需求 需求很简单:如何创建新的TodoList和TodoItem并持久化. 初学者按照教程去实现的话,应该分成以下几步:创建Controller并实现POST方法:实用传入的请求参数new一个数据库实 ...
- 使用.NET 6开发TodoList应用文章索引
系列导航 使用.NET 6开发TodoList应用(1)--系列背景 使用.NET 6开发TodoList应用(2)--项目结构搭建 使用.NET 6开发TodoList应用(3)--引入第三方日志 ...
- 使用.NET 6开发TodoList应用(7)——使用AutoMapper实现GET请求
系列导航 使用.NET 6开发TodoList应用文章索引 需求 需求很简单:实现GET请求获取业务数据.在这个阶段我们经常使用的类库是AutoMapper. 目标 合理组织并使用AutoMapper ...
随机推荐
- windows下python3.7安装gmpy2、Crypto 库及rsa
基于python3.7在windows下安装gmpy2 先检查一下是否安装了wheel文件包,在cmd中输入wheel,查看一下,如果没有安装,则输入安装:pip install wheel 如果遇到 ...
- 拖动条形图设置任务关联(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 仅仅是知悉了四种任务关联,那只是纸上谈兵,要把这四种关联真正用到Project上才行,所以我们就要来设置任务关联了. 这是 ...
- msfvenom生成payload命令
msfvenom生成payload命令 windows: msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp L ...
- 洛谷八月月赛 II T1 题解
Content 在大小为 \(n\) 的数字三角形中,第 \(i\) 行包含有 \(i\) 个数字,数字从上到下,从左到右依次排列为 \(1,2,3,\dots\). 设第 \(i\) 行第 \(j\ ...
- CF1291A Even But Not Even 题解
Content 有 \(t\) 组数据,每组数据给定一个整数 \(n\),接着给出一个长度为 \(n\) 的数字串.请从中删除一些数,使得剩下的数字串不是偶数,但是其和为偶数,或者不存在这样的方案. ...
- Python 属性方法、类方法、静态方法、 特殊属性__doc__ (内建属性)
总结:和类的关联性讲:属性方法>类方法>静态方法 属性方法@property:仅仅是调用方式不用+括号. 类方法@classmethod:访问不了累的属性变量,只可以访问类变量. 静态方法 ...
- ThreadLocal的正确使用与原理
ThreadLocal是什么 ThreadLocal是线程Thread中属性threadLocals即ThreadLocal.ThreadLocalMap的管理者,ThreadLocal用于给每个线程 ...
- 【LeetCode】1161. Maximum Level Sum of a Binary Tree 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...
- 【九度OJ】题目1015:还是A+B 解题报告
[九度OJ]题目1015:还是A+B 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1015 题目描述: 读入两个小于10000的正整 ...
- 【LeetCode】203. Remove Linked List Elements 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 递归 日期 题目地址:https://lee ...