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:
Brian Clozel
2020-03-20 23:49:28 +01:00
parent 3edc1c3a7d
commit ffdf9a422f
30 changed files with 521 additions and 354 deletions

View File

@@ -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();
}
}

View File

@@ -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;

View File

@@ -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,\

View File

@@ -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)));
}
}

View File

@@ -92,7 +92,9 @@ class WebSocketMessagingAutoConfigurationTests {
@AfterEach
void tearDown() {
this.context.close();
if (this.context.isActive()) {
this.context.close();
}
this.sockJsClient.stop();
}