.net core 使用heathcheck初始化dotnet core 3.1应用程序

.net core 使用heathcheck初始化dotnet core 3.1应用程序,.net-core,.net Core,我在kubertenes上部署了dotnet core 3.1 web应用程序,我们希望使用healthcheck在“health/ready”上初始化应用程序。目前,当我运行应用程序时,第一次向home controller发出请求时,应用程序初始化需要1s的时间 [18:50:55 INF] HTTP GET /health/live responded 200 in 114.6692 ms [18:51:13 INF] HTTP GET /health/ready responded 20

我在kubertenes上部署了dotnet core 3.1 web应用程序,我们希望使用healthcheck在“health/ready”上初始化应用程序。目前,当我运行应用程序时,第一次向home controller发出请求时,应用程序初始化需要1s的时间

[18:50:55 INF] HTTP GET /health/live responded 200 in 114.6692 ms
[18:51:13 INF] HTTP GET /health/ready responded 200 in 6.3631 ms

[18:51:43 INF] HTTP GET / responded 302 in 1052.4785 ms
[18:51:53 INF] HTTP GET / responded 302 in 5.9961 ms
我在启动时添加了
HealthCheck()
,但是有没有办法向home controller发送请求并在
health/ready
上预热,所以当我们真正向home controller发出请求时,它会在5毫秒而不是1000毫秒内完成

ConfigureServices()

Configure()


谢谢

你知道你的
HomeController
在做什么导致了最初的延迟吗?据我所知,dotnet核心Web应用程序在启动时会进行大量的反思,比如找出依赖注入。而且,从我所看到的,其中一些是及时的。因此,第一次呼叫任何控制器都可能需要一些预热时间。我对kubernetes知之甚少,但它是否可以设置为等待,或者使用连续3次健康呼叫中最好的一次来决定你的应用程序是否正在运行?@mrblewog,正如你从上面的日志中看到的,健康呼叫会在6毫秒内返回。库伯内特斯很高兴,因为两人的健康状况都恢复了200分,但我正在努力解决第一次请求的延迟问题。我想在“健康/准备就绪”状态下进行热身。我知道kubernetes只会将请求发送到容器,因为它已经从ready call获得了成功响应。第二个健康呼叫很快,是的。我认为这是一个不错的问题,我对此投了赞成票,但正如我所说的,dotnet core加载第一次调用所需内容的方式似乎确实存在一些问题。我总是看到相同的模式:先慢后快。你知道你的
HomeController
在做什么导致了最初的延迟吗?据我所知,dotnet核心Web应用程序在启动时会进行大量的反思,比如找出依赖注入。而且,从我所看到的,其中一些是及时的。因此,第一次呼叫任何控制器都可能需要一些预热时间。我对kubernetes知之甚少,但它是否可以设置为等待,或者使用连续3次健康呼叫中最好的一次来决定你的应用程序是否正在运行?@mrblewog,正如你从上面的日志中看到的,健康呼叫会在6毫秒内返回。库伯内特斯很高兴,因为两人的健康状况都恢复了200分,但我正在努力解决第一次请求的延迟问题。我想在“健康/准备就绪”状态下进行热身。我知道kubernetes只会将请求发送到容器,因为它已经从ready call获得了成功响应。第二个健康呼叫很快,是的。我认为这是一个不错的问题,我对此投了赞成票,但正如我所说的,dotnet core加载第一次调用所需内容的方式似乎确实存在一些问题。我总是看到同样的模式:先慢后快。
services.AddHealthChecks()
        .AddCheck("Liveness", () => HealthCheckResult.Healthy())
        .AddCheck("Readiness", () => HealthCheckResult.Healthy(), tags: new[] { "Readiness" });
app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health/live", new HealthCheckOptions() {
        Predicate = r => r.Name == "Liveness"
    });

    endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions() {
        Predicate = r => r.Name == "Readiness"
    });                

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});