首页 > 解决方案 > 如何找出特定端点是否在 Spring Boot 中启用了 keepalive?

问题描述

我有一个 Spring Boot 应用程序,其中声明了几个端点,如下所示:

@RestController
public class MyRestController {

    @PostMapping("/someRequest")
    public void doSomething(final @RequestBody MyRequest request) {
       // ...
    }

}

如何确定该控制器使用的套接字是否打开了TCP keepalive ?

更新 1:我使用libdontdie启动了应用程序,即sudo DD_DEBUG=1 DD_TCP_KEEPALIVE_TIME=4 DD_TCP_KEEPALIVE_INTVL=5 DD_TCP_KEEPALIVE_PROBES=6 LD_PRELOAD=/usr/lib/libdontdie.so java -jar myapp.jar --spring.config.location=myapp-config.yaml &. 需要等到明天看看它是否有效。

标签: javaspring-bootnetworkingkeep-alivetcp-keepalive

解决方案


很有可能发生以下情况之一。这可能与keepalive无关。

原因

  1. 由于 CPU 空闲,您的 AWS 资源正面临冷启动或进入休眠状态。这可能是由于 AWS
  2. 您的/someRequest端点依赖于一些下游资源,例如数据库、另一个 RESTful 服务,或者可能与 I/O 处于空闲状态有关。
  3. 如果它正在连接到数据库,请确保您启用了重新连接。这可能取决于您如何设置连接。请参阅Spring 正在失去与数据库的连接,并且无法恢复或重新连接以了解如何根据您的情况进行操作。

建议解决

  1. 在 AWS 控制台上检查实例的运行状况,看看它是否已达到 IDLE。尝试让节点空闲。
  2. 使用 Spring Boot Actuator 可以测试下游依赖项的健康状况,并在进行任何 API 调用之前确保您的健康状况良好。见,https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html
  3. 我不想推荐这个,但是你上面的所有选项都干了,然后创建一个虚拟端点,比如/infoor/health并定期轮询它。这不是一个很好的解决方案,但希望在大多数情况下都能工作。

推荐阅读