使 Spring 引导配置容错

Making a Spring Boot Configuration Fault Tolerant

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

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

这并不能完全回答您的问题。但是对于数据库,可以在数据库不可用的情况下启动 spring 引导。如果你使用 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 都会尝试创建一个连接。如果数据库仍然关闭,将抛出异常。如果它备份了那么你就成功了。

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

如需in-depth分析,可参考我的博客post;它是为 Couchbase 数据库编写的,但处理的用例与您的相同。 https://blog.asarkar.com/technical/couchbase-kubernetes/