【问题标题】:Making a Spring Boot Configuration Fault Tolerant [closed]使 Spring Boot 配置容错[关闭]
【发布时间】:2020-08-11 10:54:59
【问题描述】:

我有一个 Spring Boot 应用程序,它依赖于 Keycloak、Elastic Stack 和 PostgreSQL 等各种服务。此应用程序将与许多其他应用程序一起部署到 Kubernetes 集群。是否有可能使我的应用程序能够容忍可能不可用的服务?想象一下,如果 PostgreSQL 在启动时没有启动。我可以强制应用程序以降级状态启动,通知用户,记录错误,并通知任何调用应用程序服务降级吗?如果它可以每隔一段时间重新尝试自动配置此类 bean,这也会很有用。

【问题讨论】:

  • 是的,有可能,一切皆有可能。这是否是个好主意是另一回事。
  • @JAsgarov 如果这里面有笑的表情,我会用它。不过,我认为否决票有点苛刻。
  • @Dave 是的,尤其是在 Spring 团队竭尽全力构建该功能之后,哈哈。

标签: java spring spring-boot microservices


【解决方案1】:

你不是在问@Retryable 和@Recover 吗?还有@Lazy,但前两个可能正是您想要的。这是假设您的 bean 没有内置重试。即Kafka bean 自动重试。如果你说的是rest api,我可能会使用Eureka、Circuit Breaker等。

【讨论】:

  • 太棒了,我想这正是我想要的。感谢您的帮助!
【解决方案2】:

这不会完全回答您的问题。但是对于数据库,可以在数据库不可用的情况下启动 spring boot。如果您使用Hikari,那么您可以配置连接池,使其在启动时不会尝试连接到数据库。

@Bean
public DataSource xxxDataSource() {
    HikariConfig config = new HikariConfig();
    config.setDriverClassName("org.postgresql.Driver");
    config.setUsername("user");
    config.setPassword("password");
    config.setJdbcUrl("jdbc-url");
    config.setMaximumPoolSize(5);
    config.setInitializationFailTimeout(-1);  // <-- This line here is what you need

    return new HikariDataSource(config);
}

您不需要重新创建 bean。每次您尝试使用数据源时,Hikari 都会尝试创建连接。如果数据库仍然关闭,则会引发异常。如果它备份了,那么你就成功了。

【讨论】:

  • 是的,我想过这样做,但我并不想为每个外部服务创建处理程序。但我想,在某种程度上,这是不可避免的。我认为我正在寻找的正是@SledgeHammer 所建议的。谢谢!
【解决方案3】:

您的问题含糊不清,范围太广。如果您使用的是 Spring Data,这是不可能的,因为 Spring 数据将在启动时尝试连接到数据库,如果不能,则会失败。您可以自己连接,但您必须考虑稍后连接断开、重试、客户端体验等问题。

如果您想深入分析,请参阅我的博客文章;它是为 Couchbase 数据库编写的,但与您的用例相同。 https://blog.asarkar.com/technical/couchbase-kubernetes/

【讨论】:

  • 我知道我的问题很广泛,但这是设计使然。我想知道是否有一个基于框架的解决方案来解决许多外部服务应该常见的问题。我认为 SledgeHammer 给出的答案正是我想要的。
  • @Dave 含糊不清的“设计”问题最终会被设计关闭。所以,如果你已经找到了有用的答案,那对你有好处。
猜你喜欢
  • 2019-07-13
  • 2019-05-05
  • 2017-06-24
  • 2017-05-24
  • 1970-01-01
  • 2017-09-12
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多