bash - 如何检查docker Cassandra实例是否准备好进行连接

标签 bash spring-boot docker cassandra

我有两个使用docker-compose启动的docker实例。
一个拥有一个Cassandra实例
一个拥有一个Spring Boot应用程序,它试图连接到该应用程序。

但是,Spring Boot应用程序将始终失败,因为它试图连接到尚未准备好进行连接的Cassandra实例。

我努力了:

  • 在Docker-compose中始终使用restart:
  • 这仍然不能总是起作用,因为Cassandra可能已经足够“足够”以不再使Spring Boot应用程序崩溃,但是还不能足够“足够”成功地创建了Table / Column系列。最重要的是,这是一个非常棘手的解决方案。
  • 使用运行状况检查
  • 似乎compose中的healthcheck没有重新启动功能
  • 使用bash脚本作为入口点
  • 希望我可以使用netstat,ping,...确定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/

    相关文章:

    java - 将 kotlin 与 spring-boot 一起使用时,启用 Hystrix 会导致 NullPointerException

    java - 如何将 Spring REST 投影与自定义 Controller 一起使用

    java - EL1008E : Property or Field 'timestamp' cannot be found on object of type 'java.util.HashMap' - maybe not public?

    angular - Nginx for Angular没有达到后端api

    docker - 如何通过更新 docker 注册表服务器来修复客户端上的不安全注册表错误

    docker - 容器突然终止并发出警告 "cleaning up after killed shim"

    bash - 将文件移动到 zip 中的批处理脚本

    linux - 在分别打印文件名和行时查找文件中的最大行?

    linux - git diff --numstat 按字符串而不是文件路径

    linux - Shell 脚本 - SFTP -> 如果复制,删除吗?