spring-boot - 在 Spring-Boot 应用程序中配置打开端口的时间
问题描述
问题: 当 spring 准备好处理流量时,spring 或其嵌入式 servlet 容器中是否有打开端口的选项?
情况: 在当前设置中,我使用在 google cloud run 中运行的 spring boot 应用程序。
情况:
Cloud run 不支持 liveness/readyness 探测,它将开放端口视为“应用程序就绪”。
Cloud run 向容器发送请求,尽管 spring 还没有准备好处理请求。
Spring 启动它的 servlet 容器,打开它的端口,同时仍然旋转它的 bean。
问题: 到未就绪应用程序的流量将导致大量 http 429 状态代码。
这会影响:
- 新部署
- 云运行的扩展能力
我的愿望:
配置 spring/servlet 容器以在应用程序实际准备好时延迟打开端口将打开端口延迟到应用程序准备好时会减轻很多痛苦,而不会过多地干扰现有的代码库。
有什么替代品不会造成太大的痛苦吗?
我发现并认为不可行的事情
使用native-image不是一个选项,因为它被认为是实验性的,并且在编译时消耗的 RAM 比我们的部署管道代理允许分配的更多(最大 8GB 与需要 13GB)
我找到的另一个答案:谷歌云运行的准备情况检查 - 如何? 我看不出它如何满足我的需求,因为 spring-boot 启动时间仍然很慢。这就是为什么我最初的想法是延迟开放端口
我没有时间测试以下内容,但我偶然发现的一件事是
解决方案
正如您很清楚“Cloud Run 目前没有准备就绪/活跃度检查以避免向未就绪的应用程序发送请求”这一事实,我想说在 Cloud Run 方面没有什么可以做的,除了:
- 尝试按照文档优化 Spring Boot 应用程序。
- 在负责更多设置任务的 Cloud Run 服务中创建一个更重的入口点。这个stackoverflow 线程提到了“一个‘更重’的入口点将如何帮助部署后响应,但代价是冷启动速度较慢”(从 Cloud Run 的角度来看,这是最相关的解决方案,并且正确地概述了问题)
- 如您所述,在 Cloud Run的容器中运行多个进程。
这个问题似乎更专门针对 Spring Boot,我发现了一篇有类似要求的文章。但是,如果您绝对需要在收到请求时准备好应用程序,我们可以使用 Cloud Run 的另一种替代方案,即Google Kubernetes Engine (GKE),它使用了就绪/活跃度探针。
推荐阅读
- html - 使用 html 发送带有附件 pdf 的电子邮件
- c# - 如何在 Unity3D 中使用 PUT 方法更新用户图片
- php - 是否可以在没有订单的情况下迁移迁移?(如果没有,我该如何解决这个问题)
- hyperledger-fabric - 如何在第一个网络设置中解决“CRIT 002 Error unmarshaling config into struct: 21 error(s)”?
- networking - 无法使用外部 IP 连接到我的 winsock 服务器
- android - 在 TabBarView 颤动下的 ListView 的奇怪行为
- python - 使用 df(loc) Pandas 的多个条件
- meteor - Meteor:错误:无法安装 npm 依赖项
- python - 如何根据 django 框架中的用户不活动来实现会话到期?
- sql - 不考虑撇号的搜索字符串