gpt4 book ai didi

java - 为什么zuul网关应用程序需要这么长时间才能以优雅的方式关闭

转载 作者:行者123 更新时间:2023-12-04 19:39:54 25 4
gpt4 key购买 nike

我在通过我自己开发的 CICD 模块更新和重新启动应用程序时遇到了一种情况。

我有 Eureka 作为注册中心,zuul 作为网关。

通过使用 kill -15 命令运行 shell 脚本,我想以一种优雅的方式关闭我的应用程序。并且该 shell 脚本运行正确。

但是到目前为止,在我测试和观察这个 CICD 模块的过程中,我发现重启 zuul 网关应用程序需要很长时间才能关闭(大约等待 5 分钟,其他应用程序只需不到 5 秒)。

据我所知,springboot首先会关闭线程池以拒绝解析新请求,然后让剩余的线程完成,然后关闭应用程序上下文。

重新启动网关应用程序时,我已完成以下步骤:

  • 从 nginx 上游拉下这个网关服务;
  • 从 eureka 服务器拉下这个网关服务,但不关闭;
  • 等待 90 秒
  • 30 (eureka server refresh to readable server list cache default 30s )
    + 30 (eureka client fetching interval default 30s)
    + 30 (ribbon refreshing after eureka client fething server list cache default 30s)
  • 使用 kill -15 applicationPid关闭应用程序
  • 做一个循环,看看这个 pid 是否被关闭。
  • 重启新应用
  • 如果应用程序可以从 eureka 服务器的 api
  • 访问,则等待 60 秒
    30 (eureka client fetching interval default 30s)
    + 30 (ribbon refreshing after eureka client fething server list cache default 30s)
  • 从 nginx 拉起这个网关服务

  • 测试计划如下图:
  • 通过从 20 个线程发送请求,每个线程每秒发送 3 个请求。
  • 2 台 Linux 服务器 A 和 B,每台服务器上都有一个网关服务。
  • 关闭 A 的网关时,nginx 会指向 B 并让 B 承担工作,与 B 的网关关闭时相同的选项。

  • 正如我所观察到的,所有请求都将正确解决,并且在重新启动网关应用程序期间没有出现错误。

    但我不知道为什么关闭网关应用程序会花费这么多时间。 nginx 被拉下后完全没有请求进入,应用程序仍然会卡在那里,似乎没有有用的日志来显示发生了什么。
    几分钟后,应用程序将最终关闭。
    如果我不发送任何请求,网关应用程序将立即优雅地关闭。

    当它卡住时,控制台日志如下所示:
    ....normal log....
    2021-07-19 14:42:08.195 [app:web-gateway,traceId:,spanId:,parentId:] [SpringContextShutdownHook] INFO | EurekaServiceRegistry.java:65 | o.s.c.n.e.s.EurekaServiceRegistry | Unregistering application WEB-GATEWAY with eureka with status DOWN
    2021-07-19 14:42:08.195 [app:web-gateway,traceId:,spanId:,parentId:] [SpringContextShutdownHook] WARN | DiscoveryClient.java:1351 | c.netflix.discovery.DiscoveryClient | Saw local status change event StatusChangeEvent [timestamp=1626676928195, current=DOWN, previous=UP]
    2021-07-19 14:42:08.195 [app:web-gateway,traceId:,spanId:,parentId:] [DiscoveryClient-InstanceInfoReplicator-0] INFO | DiscoveryClient.java:870 | c.netflix.discovery.DiscoveryClient | DiscoveryClient_WEB-GATEWAY/192.168.24.200:web-gateway:8005:NEW_GATEWAY_DEFAULT_GROUP: registering service...
    2021-07-19 14:42:08.199 [app:web-gateway,traceId:,spanId:,parentId:] [DiscoveryClient-InstanceInfoReplicator-0] INFO | DiscoveryClient.java:879 | c.netflix.discovery.DiscoveryClient | DiscoveryClient_WEB-GATEWAY/192.168.24.200:web-gateway:8005:NEW_GATEWAY_DEFAULT_GROUP - registration status: 204
    2021-07-19 14:42:08.252 [app:web-gateway,traceId:,spanId:,parentId:] [Thread-17] INFO | EurekaNotificationServerListUpdater.java:71 | c.n.n.l.EurekaNotificationServerListUpdater | Shutting down the Executor for EurekaNotificationServerListUpdater
    2021-07-19 14:42:08.745 [app:web-gateway,traceId:,spanId:,parentId:] [SpringContextShutdownHook] INFO | DirectJDKLog.java:173 | o.a.coyote.http11.Http11NioProtocol | Pausing ProtocolHandler ["http-nio-8005"]
    2021-07-19 14:43:18.087 [app:web-gateway,traceId:,spanId:,parentId:] [AsyncResolver-bootstrap-executor-0] INFO | ConfigClusterResolver.java:43 | c.n.d.s.r.aws.ConfigClusterResolver | Resolving eureka endpoints via configuration
    .....stuck here.....

    因为我已经从 eureka 手动下拉网关应用程序,所以这里的应用程序日志显示代码 204 是可以接受的。

    我曾经猜测如果是代码 204 错误导致卡住的应用程序关闭。但是其他也承载请求的应用程序会在调用 kill -15 命令后立即优雅地关闭。只有网关应用程序会卡住。
    谁能告诉我如何从卡住的应用程序中 checkout 以查看 kill -15 命令完成后发生了什么?

    最佳答案

    问题解决了。

    永远不要质疑稳定的结构......

    我的线程池出了点问题,所以在使用 kill -15 杀死时,我的自定义线程池有这么多任务没有结束。

    通过检查 JVM 堆栈,我发现了这个问题。通过更正代码,问题解决了。

    关于java - 为什么zuul网关应用程序需要这么长时间才能以优雅的方式关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68436046/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com