Настройка Spring Boot Actuator для Kubernetes probing
Mikhail BorisovЕсли вы использовали Spring Initializr, то вам не нужно думать о совместимых версиях, т.к. в Gradle будет применен плагин io.spring.dependency-management, а в Maven ваш pom.xml будет отнаследован от org.springframework.boot:spring-boot-starter-parent, оба способа зафиксируют совместимые версии зависимостей для Spring Boot. Также, если вы начинаете новый проект, то в Spring Initializr можно сразу добавить Spring Boot Actuator и Spring Web/Reactive Web, которые нам понадобятся.
Прежде всего, нужно добавить starter для actuator:
Gradle:
dependencies {
// какие-то зависимости...
implementation 'org.springframework.boot:spring-boot-starter-actuator'
// еще какие-то зависимости...
}
Maven:
<dependencies>
// какие-то зависимости...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
// еще какие-то зависимости...
</dependencies>
Теперь actuator присутствует в classpath и мы можем получить информацию о приложении через JMX, но мы хотим, чтобы Kubernetes мог "достучаться" до нее по HTTP. Без Spring Web/Reactive Web у приложения не будет веб-сервера, который мог бы отдавать ответы, поэтому добавим один из них.
Gradle:
dependencies {
// какие-то зависимости...
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// еще какие-то зависимости...
}
Maven:
<dependencies>
// какие-то зависимости...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
// еще какие-то зависимости...
</dependencies>
Все возможные опции для настройки представлены тут. При запуске приложения в среде Kubernetes, Spring Boot должен автоматически сделать доступными пути /actuator/health/liveness и /actuator/health/readiness, которые мы можем использовать в Kubernetes. Если мы хотим увидеть эти пути при локальном запуске или по какой-то причине Spring Boot не делает их доступными автоматически, нам нужно задать свойство (в application.properties, application.yml или другими способами. Прочитать о способах можно здесь)
management.health.probes.enabled=true
Доступные статусы описаны здесь. После того, как мы добавили Spring Boot Actuator в зависимости, мы можем изменять состояния probes используя механизм ApplicationEvent. Вот пример такого использования:
/**
* Component that checks that the local cache is in a valid state.
*/
@Component
public class LocalCacheVerifier {
private final ApplicationEventPublisher eventPublisher;
public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void checkLocalCache() {
try {
//...
}
catch (CacheCompletelyBroken ex) {
AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
}
}
}