请求在springboot service pod rollout期间被丢弃



我正在使用带有docker的Kubernetes集群。当我部署java服务[springboot]时,一些请求被丢弃(几秒钟),并出现以下错误:

= org.springframework.beans.factory异常。BeanCreationNotAllowedException:创建名称为'controller'的bean时出错:在销毁此工厂的单例bean时不允许创建单例bean(不要在destroy方法实现中从BeanFactory请求bean !), stackTrace=[org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton() at line: 208]

我已经在使用liveessprobe &readinessProbe。Java版本:12SpringBoot版本:2.1.5.RELEASEHibernate版本:2.4.3 with Postgres DB

据我所知,这是由于在执行一些请求时关闭应用程序上下文而发生的。理想情况下,不应该是这样。

有人能帮忙吗?

问题不在于springboot,而在于Kubernetes停止pod的方式。当来自旧部署/复制集的pod被终止时(或者实际上设置为状态"正在终止"),会同时发生两件事:

A)Pod从服务端点中删除,因此它不再接收新请求

B)pod容器获得SIGTERM,因此应用程序可以优雅地关闭

所以你在这里看到的基本上是在上下文关闭时正在处理的活动请求(正如你已经发现的)

有(至少)两种解决方案:

1在kubernetes pod定义中:

Kubernetes pod可以配置一个预停止钩子,在a和B之间执行命令。根据你的应用,一个简单的"睡眠"几(毫秒)秒应该足够了,让应用程序有足够的时间在关闭之前完成当前的请求。谷歌有一个很好的文档,更详细地介绍了:https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace 2在SpringBoot:

可以让Java在接收到关机中断时等待完成正在运行的任务。这是(恕我直言)很好的解释:https://www.baeldung.com/spring-boot-graceful-shutdown

注意:kubernetes默认的优雅关闭超时是30秒,然后pod被强制删除。但像往常一样,您可以在terminationGracePeriodSeconds中配置此超时(也在google博客(1)

中描述)。

相关内容

最新更新