我有两个通过docker-compose启动的docker实例。 一个拥有一个Cassandra实例 一个拥有一个Spring Boot应用程序,尝试连接到该应用程序。
但是,Spring Boot应用程序将始终失败,因为它试图连接到尚未准备好进行连接的Cassandra实例。
我尝试过:
现在唯一真正有效的方法是使用相同的bash脚本并将进程休眠x秒,然后启动jar。这甚至更hacky ...
有人对如何解决这个问题有想法吗?
谢谢!
答案 0 :(得分:1)
在docker-compose.yml中定义的spring boot服务 depends_on 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数据库具有弹性,并且不会再启动失败。希望这对其他人也有帮助。
https://dzone.com/articles/containerising-a-spring-data-cassandra-application