我有两个使用docker-compose启动的docker实例。
一个拥有一个Cassandra实例
一个拥有一个Spring Boot应用程序,它试图连接到该应用程序。
但是,Spring Boot应用程序将始终失败,因为它试图连接到尚未准备好进行连接的Cassandra实例。
我努力了:
现在,唯一有效的方法是使用相同的bash脚本,将进程休眠x秒,然后启动jar。这更加骇人听闻...
有谁知道如何解决这个问题?
谢谢!
最佳答案
docker-compose.yml 中定义的spring boot服务是否取决于cassandara服务的?如果是,则仅在cassandra服务就绪时才启动该服务。
https://docs.docker.com/compose/compose-file/#depends_on
看看这个github仓库,找到cassandra服务的运行状况检查。
https://github.com/docker-library/healthcheck
结论
经过一番讨论,我们发现docker-compose似乎没有提供等待服务正常运行的功能,例如Kubernetes和Openshift提供(请参阅下面的评论)。他们建议使用包装脚本(docker-entrypoint.sh),该脚本等待依赖服务出现,这使二进制文件成为必需,但不应使用实际服务,例如cassandra客户端二进制文件。另外,如果cassandra不这样做,则取决于cassandra的服务将永远无法启动,这不应该发生。
微服务的主要优点是,它们必须具有故障恢复能力,并且如果当前尚不存在依赖服务或者意外地消失,则它们不应该死亡或不恢复正常运行。因此,微服务的实现方式应使其在启动或意外消失后重试以建立连接。 意外的是在此上下文中实际错误使用的单词,因为您应该始终在分布式环境中期待此类问题,即使使用docker-compose,您也将面临本主题中讨论的此类问题。
以下链接指向一个教程,该教程有助于将cassandra正确集成到spring boot应用程序中。它提供了一种实现具有重试行为的cassandra连接的检索的方法,因此该服务对不存在的cassandra数据库具有 flex ,并且不会再失败。希望这对其他人也有帮助。
https://dzone.com/articles/containerising-a-spring-data-cassandra-application
关于bash - 如何检查docker Cassandra实例是否准备好进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424619/