首页 > 解决方案 > 在 Spring-Boot 应用程序中配置打开端口的时间

问题描述

问题: 当 spring 准备好处理流量时,spring 或其嵌入式 servlet 容器中是否有打开端口的选项?

情况: 在当前设置中,我使用在 google cloud run 中运行的 spring boot 应用程序。

情况:

问题: 到未就绪应用程序的流量将导致大量 http 429 状态代码。

这会影响:

我的愿望:

  1. 配置 spring/servlet 容器以在应用程序实际准备好时延迟打开端口将打开端口延迟到应用程序准备好时会减轻很多痛苦,而不会过多地干扰现有的代码库。

  2. 有什么替代品不会造成太大的痛苦吗?

  3. 我发现并认为不可行的事情

    • 使用native-image不是一个选项,因为它被认为是实验性的,并且在编译时消耗的 RAM 比我们的部署管道代理允许分配的更多(最大 8GB 与需要 13GB)

    • 我找到的另一个答案:谷歌云运行的准备情况检查 - 如何? 我看不出它如何满足我的需求,因为 spring-boot 启动时间仍然很慢。这就是为什么我最初的想法是延迟开放端口


我没有时间测试以下内容,但我偶然发现的一件事是

标签: spring-bootgoogle-cloud-runhttp-status-code-429

解决方案


正如您很清楚“Cloud Run 目前没有准备就绪/活跃度检查以避免向未就绪的应用程序发送请求”这一事实,我想说在 Cloud Run 方面没有什么可以做的,除了:

  • 尝试按照文档优化 Spring Boot 应用程序。
  • 在负责更多设置任务的 Cloud Run 服务中创建一个更重的入口点。这个stackoverflow 线程提到了“一个‘更重’的入口点将如何帮助部署后响应,但代价是冷启动速度较慢”(从 Cloud Run 的角度来看,这是最相关的解决方案,并且正确地概述了问题)
  • 如您所述,在 Cloud Run的容器中运行多个进程。

这个问题似乎更专门针对 Spring Boot,我发现了一篇有类似要求的文章。但是,如果您绝对需要在收到请求时准备好应用程序,我们可以使用 Cloud Run 的另一种替代方案,即Google Kubernetes Engine (GKE),它使用了就绪/活跃度探针


推荐阅读