1. 探针集成实现高可用
- Liveness
- Readiness
- Startup
1.1 LivenessProbe
- 判断服务是否存活
- 结束“非存活”状态服务
- 根据重启策略决定是否重启服务
1.2 ReadinessProbe
- 判断服务是否“就绪”
- “就绪”状态的服务可以接收请求
- 非“就绪”状态的服务将会被从流量负载中摘除
1.3 StartupProbe
- 检测应用程序是否启动成功
- 启动探针执行成功后,将不再执行,除非应用重启
- 当启动探针检测成功后,其它探针才开始工作
- 适合启动较慢的应用配置
- Kuberbetes 1.16以后的支持
// startup
internal static bool Ready { get; set; } = true;
internal static bool Live { get; set; } = true;
public void ConfigureServices(IServiceCollection services)
{
...
// 注册健康检查
services.AddHealthChecks()
.AddMySql(Configuration.GetValue<string>("Mysql"), "mysql", tags: new string[] { "mysql", "live", "all" })// tags标签分组
.AddRabbitMQ(s =>
{
var connectionFactory = new RabbitMQ.Client.ConnectionFactory();
Configuration.GetSection("RabbitMQ").Bind(connectionFactory);
return connectionFactory;
}, "rabbitmq", tags: new string[] { "rabbitmq", "live", "all" })
.AddCheck("liveChecker", () =>
{
return Live ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();
}, new string[] { "live", "all" })
.AddCheck("readyChecker", () =>
{
return Ready ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();
}, new string[] { "ready", "all" });
}
//
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
endpoints.MapMetrics();
endpoints.MapHealthChecks("/live", new HealthCheckOptions { Predicate = registration => registration.Tags.Contains("live") });// 检查标记了live的检查项
endpoints.MapHealthChecks("/ready", new HealthCheckOptions { Predicate = registration => registration.Tags.Contains("ready") });
endpoints.MapHealthChecks("/hc", new Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions
{
ResponseWriter = HealthChecks.UI.Client.UIResponseWriter.WriteHealthCheckUIResponse
});// 没有传检查项,检查所有
endpoints.MapControllers();
endpoints.MapGrpcService<GeekTime.Ordering.API.Grpc.OrderServiceImpl>();
});
}
// Controller调用
// 设置Ready的值
[HttpGet]
public IActionResult SetReady([FromQuery]bool ready)
{
Startup.Ready = ready;
if (!ready)
{
Task.Run(async () =>
{
await Task.Delay(60000);
Startup.Ready = true;
});
}
return Content($"{Environment.MachineName} : Ready={Startup.Ready}");
}
// 设置live
[HttpGet]
public IActionResult SetLive([FromQuery]bool live)
{
Startup.Live = live;
return Content($"{Environment.MachineName} : Live={Startup.Live}");
}
// 程序退出
[HttpGet]
public IActionResult Exit([FromServices]IHostApplicationLifetime application)
{
Task.Run(async () =>
{
await Task.Delay(3000);
application.StopApplication();
});
return Content($"{Environment.MachineName} : Stopping");
}
2. 健康检查看板
AspNetCore.Diagnostics.HealthCheck项目,开源社区项目插件文章来源地址https://www.toymoban.com/news/detail-681530.html
2.1 组件包
- 探针检测端:AspNetCore.HealthChecks.UI
- 应用端输出:AspNetCore.HealthChecks.UI.Client
- 应用端检查项:AspNetCore.HealthChecks.Xxx
// startup
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddHealthChecks();
services.AddHealthChecksUI();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/live");
endpoints.MapHealthChecks("/ready");
endpoints.MapHealthChecks("/hc");
endpoints.MapMetrics();
endpoints.MapHealthChecksUI();// 使得dashboard生效
endpoints.MapControllers();
});
}
// 配置文件配置需要检查的项目
"HealthChecksUI": {
"HealthChecks": [
{
"Name": "geektime-ordering-api",
"Uri": "http://geektime-ordering-api/hc"
},
{
"Name": "geektime-mobile-apiaggregator",
"Uri": "http://geektime-mobile-apiaggregator/hc"
},
{
"Name": "geektime-mobile-gateway",
"Uri": "http://geektime-mobile-gateway/hc"
}
],
文章来源:https://www.toymoban.com/news/detail-681530.html
到了这里,关于【微服务部署】03-健康检查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!