Polish Liveness and Readiness support
This commit moves the core Liveness and Readiness support to its own `availability` package. We've made this a core concept independent of Kubernetes. Spring Boot now produces `LivenessStateChanged` and `ReadinessStateChanged` events as part of the typical application lifecycle. Liveness and Readiness Probes (`HealthIndicator` components and health groups) are still configured only when deployed on Kubernetes. This commit also improves the documentation around Probes best practices and container lifecycle considerations. See gh-19593
This commit is contained in:
@@ -14,34 +14,25 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.autoconfigure.kubernetes;
|
||||
package org.springframework.boot.autoconfigure.availability;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
|
||||
import org.springframework.boot.cloud.CloudPlatform;
|
||||
import org.springframework.boot.kubernetes.ApplicationStateProvider;
|
||||
import org.springframework.boot.kubernetes.SpringApplicationEventListener;
|
||||
import org.springframework.boot.availability.ApplicationAvailabilityProvider;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration} for
|
||||
* {@link ApplicationStateProvider}.
|
||||
* {@link ApplicationAvailabilityProvider}.
|
||||
*
|
||||
* @author Brian Clozel
|
||||
* @since 2.3.0
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
|
||||
public class ApplicationStateAutoConfiguration {
|
||||
public class ApplicationAvailabilityAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
public ApplicationStateProvider applicationStateProvider() {
|
||||
return new ApplicationStateProvider();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SpringApplicationEventListener springApplicationEventListener() {
|
||||
return new SpringApplicationEventListener();
|
||||
public ApplicationAvailabilityProvider applicationAvailabilityProvider() {
|
||||
return new ApplicationAvailabilityProvider();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,6 +15,6 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Auto-configuration for Kubernetes application features.
|
||||
* Auto-configuration for application availability features.
|
||||
*/
|
||||
package org.springframework.boot.autoconfigure.kubernetes;
|
||||
package org.springframework.boot.autoconfigure.availability;
|
||||
@@ -89,7 +89,7 @@ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.kubernetes.ApplicationStateAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
|
||||
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
|
||||
|
||||
@@ -19,33 +19,25 @@ package org.springframework.boot.autoconfigure.kubernetes;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.kubernetes.ApplicationStateProvider;
|
||||
import org.springframework.boot.kubernetes.SpringApplicationEventListener;
|
||||
import org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration;
|
||||
import org.springframework.boot.availability.ApplicationAvailabilityProvider;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link ApplicationStateAutoConfiguration}
|
||||
* Tests for {@link ApplicationAvailabilityAutoConfiguration}
|
||||
*
|
||||
* @author Brian Clozel
|
||||
*/
|
||||
class ApplicationStateAutoConfigurationTests {
|
||||
class ApplicationAvailabilityAutoConfigurationTests {
|
||||
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(ApplicationStateAutoConfiguration.class));
|
||||
.withConfiguration(AutoConfigurations.of(ApplicationAvailabilityAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
void disabledWhenNotDeployedOnKubernetes() {
|
||||
this.contextRunner.run(((context) -> assertThat(context).doesNotHaveBean(ApplicationStateProvider.class)
|
||||
.doesNotHaveBean(SpringApplicationEventListener.class)));
|
||||
}
|
||||
|
||||
@Test
|
||||
void enabledWhenDeployedOnKubernetes() {
|
||||
this.contextRunner.withPropertyValues("spring.main.cloud-platform:kubernetes")
|
||||
.run(((context) -> assertThat(context).hasSingleBean(ApplicationStateProvider.class)
|
||||
.hasSingleBean(SpringApplicationEventListener.class)));
|
||||
void providerIsPresent() {
|
||||
this.contextRunner.run(((context) -> assertThat(context).hasSingleBean(ApplicationAvailabilityProvider.class)));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -92,7 +92,9 @@ class WebSocketMessagingAutoConfigurationTests {
|
||||
|
||||
@AfterEach
|
||||
void tearDown() {
|
||||
this.context.close();
|
||||
if (this.context.isActive()) {
|
||||
this.context.close();
|
||||
}
|
||||
this.sockJsClient.stop();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user