问题描述
我有一个Spring Boot应用程序,它依赖于各种服务,例如Keycloak,Elastic Stack和Postgresql。该应用程序将与许多其他应用程序一起部署到Kubernetes集群中。是否有可能导致我的应用程序对可能无法使用的服务进行容忍?想象一下Postgresql在启动时没有启动。是否可以强制应用程序以降级状态启动,通知用户,记录错误以及将服务降级通知任何调用应用程序?如果它可以重试每隔一段时间自动配置此类bean的话,也会很有用。
解决方法
您不是在问@Retryable和@Recover吗?还有@Lazy,但是前2个可能正是您想要的。假设您的bean没有内置重试功能。 Kafka bean自动重试。如果您在谈论休息api,则可能会使用Eureka,Circuit Breaker等。
,这不会完全回答您的问题。但是对于数据库,可以在数据库不可用的情况下启动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都会尝试创建连接。如果数据库仍然关闭,将引发异常。如果备份,则您成功。
,您的问题含糊不清,范围太广。如果您使用的是Spring Data,那么这是不可能的,因为Spring数据将在启动时尝试连接到DB,否则将失败。您可以建立连接,但是稍后您必须考虑断开连接,重试,客户体验等等。
如果您想进行深入分析,请参阅我的博客文章;它是为Couchbase数据库编写的,但是解决了与您相同的用例。 https://blog.asarkar.com/technical/couchbase-kubernetes/