提问者:小点点

配置Spring Boot应用程序中打开端口的时间


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

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

情况:

>

  • Cloud run不支持liveness/Readynes探测,它将开放端口视为“应用程序就绪”。

    Cloud run将请求发送到容器,尽管spring尚未准备好处理请求。

    Spring启动其servlet容器,打开其端口,同时仍然旋转其豆子。

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

    这会影响:

    • 新部署
    • 云运行的扩展功能

    我的愿望:

    >

  • 将spring/servlet容器配置为在应用程序实际准备就绪时延迟打开端口。将打开端口延迟到应用程序准备就绪时将减轻很多痛苦,同时不会对现有代码库造成太多干扰。

    有没有不会造成太多痛苦的替代方案?

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

    >

  • 使用本机映像不是一种选择,因为它被认为是实验性的,并且在编译时消耗的RAM比我们的部署管道代理允许分配的要多(最大8GB与所需的13GB)

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

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

    • 关于在容器中使用多个进程的博客文章。虽然它违背了容器原则的建议,但在云运行支持任何类型的探测器之前,它似乎是可行的。

  • 共1个答案

    匿名用户

    您很清楚“Cloud Run目前没有就绪/活动性检查来避免向未就绪的应用程序发送请求”,我想说的是,在Cloud Run方面除了以下几点之外,没有什么可以做的:

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

    这个问题似乎更具体地针对Spring Boot,我发现了一篇具有类似要求的文章。然而,如果您绝对需要该应用程序在收到请求时随时可用,我们有另一种云运行的替代方案,即谷歌Kubernetes引擎(GKE),它利用就绪/活跃度探测。