posted at 2021.3.5 09:40 by Administrator
随着系统架构的发展,分布式的服务架构越来越普及,应用程序在线上运行时一般以多副本的方式运行在负载均衡器之后或Kubernetes中。为了保障应用程序在部分副本故障的情况下仍然能够正常提供服务,负载均衡器或Kubernetes需要按照一定的约定来感知应用程序的运行状态,以便流量不被转发到有故障的副本,健康检查组件则提供了将应用程序运行状态暴露出来的能力。
健康检查组件的核心包括以下部分:HealthCheckRegistration、
IHealthCheck、HealthStatus、IHeathCheckPublisher
核心类型位于下列包中:
Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions;
Microsoft.AspNetCore.Diagnostics.HealthChecks
要启用健康检查组件需要两步:
1、向容器注册健康检查项。
与其他组件一样,健康检查组件的注册也是在Startup.cs的ConfigureServices方法里注册到依赖注入容器中。
默认情况下检查项为空,可以作为应用程序连通性的检查。如果需要添加更多的检查项,可以使用IHealthCheckBuilder的Add方法来添加检查项。
还可以添加已经封装好的检查项,ASP.NET Core官方已经实现了下列健康检查:1)SQLServer。2)EntityFrameworkCore。
.NET Core社区内也提供了大量丰富的健康检查项组件包。
2、配置健康检查终结点。
完成健康检查注册后,需要通过Endpoint将健康检查暴露出去,供负载均衡器、Kubernetes探针等基础设施来探测。Endpoint的暴露代码定义在Startup.cs的Configure方法中。
默认情况下,健康检查终结点响应的内容为HealthStatus的值:Unhealthy(http响应码:500)、Degraded(http响应码:200)、Healthy(http响应码:200)。
当内置和第三方的健康检查组件无法满足需求时,可以定义自己的健康检查组件,通过实现IHealthCheck接口即可。
除了通过终结点的方式暴露健康检查、被动地接收探测外,还可以定义IHealthCheckPublisher来主动定期推送健康检查结果,这在无法使用外部探测时非常有用。
实现推送健康检查结果,大多数采用是跨域传送请求方式,我们可以通过在运行状况检查终结点上调用 RequireCors 来启用 CORS 中间件,以实现跨域传送信息。
何谓CORS?浏览器中通过脚本发起HTTP请求有很多方式,常见的就是XMLHttpRequest和FetchAPI。出于安全原因,脚本发起的跨域HTTP请求会受到浏览器限制。这个限制又常称为同源策略,同源其实是浏览器规定的一项君子协议,阻止了Web应用在没有受到异源服务器允许的情况下的请求。这个允许的标准格式就叫跨域资源共享(CORS)。比如https://timedy.com 页面中有一段脚本需要访问https://www.worldcite.com/HealthCheck接口获取健康信息,就是跨域资源共享。
具体实现:
在Startup.cs文件中部署CORS后,我们就可以在Controller或者Action上应用【EnableCors】,以启用CORS。代码如下:
[AllowAnonymous]
[Route("api/[controller]/[action]")]
[ApiController]
Public class TodoController:ControllerBase
{
[EnableCors]
[HttpGet]
public async Task<ActionResult<List<TodoItem>>> GetAll()
{ //获取所有的代码事项列表
var models = await _todoItemRepository.GetAllListAsync();
return models;
}
}
效果测试推荐使用Chrome插件—Postman,下面是笔者截取的测试图,在页面下方的Save Respone窗格中,Status的值为200,Ok代表信息读取成功。
e45d3f22-e2b2-4aff-8026-f789b2662366|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: Web, 程序, 代码, 方法, 接口, 类, 依赖注入
IT技术