ΠΡ ΡΠΆΠ΅ ΡΡΠΏΠ΅Π»ΠΈ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΎΡΠΊΠ°Π·ΠΎΠ² Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
ΠΈ ΡΠ³Π»ΡΠ±ΠΈΠ»ΠΈΡΡ Π² ΠΏΠ°ΡΡΠ΅ΡΠ½ Circuit Breaker. ΠΡ ΡΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΡΡΠΎΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°Π·ΠΎΡΠ²Π°ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ ΠΎΡΠΊΠ°Π·ΠΎΠ², ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ: Closed, Open ΠΈ Half-Open. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Circuit Breaker Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Resilience4j, Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ (Retry) ΠΈ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ fallback-ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ΅ gracefully ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Circuit Breaker Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎΠ±Ρ Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠ»Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ, Π½ΠΎ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΠΉ.
ΠΠΎΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Circuit Breaker Π²Π°ΠΆΠ΅Π½ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Π²Ρ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΉ Circuit Breaker, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Retry ΠΈ Fallback. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ... ΡΡΠΎ-ΡΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΆΠ°Π»ΡΡΡΡΡ Π½Π° Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ, ΠΊΡΠΎ-ΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ
. ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ? ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Circuit Breaker ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² Open ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, ΠΈ Π²Ρ ΠΎΠ± ΡΡΠΎΠΌ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅! ΠΠ΅Π· ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° β ΡΡΠΎ ΡΡΡΠ½ΡΠΉ ΡΡΠΈΠΊ, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ.
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Circuit Breaker ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ:
- ΠΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΡΡΡ Π² ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΡ.
- ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Circuit Breaker Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ
Open, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΎΡΠ»ΠΎ Π²Closed). - ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Circuit Breaker
ΠΠ»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Circuit Breaker ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Resilience4j, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΆΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π° Π² Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Resilience4j ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΡΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ:
- Micrometer: ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΊΡΠΏΠΎΡΡ Π΄Π°Π½Π½ΡΡ Π² ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Prometheus.
- Prometheus ΠΈ Grafana: ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ.
- Actuator: Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² Spring Boot ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π΄Π»Ρ Resilience4j
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Ρ, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π°Ρ pom.xml (ΠΈΠ»ΠΈ build.gradle) ΡΠΆΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ Resilience4j ΠΈ Spring Boot Actuator. ΠΡΠ»ΠΈ Π½Π΅Ρ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈΡ
.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
Maven:
<dependencies>
<!-- Resilience4j -->
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<!-- Micrometer Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
Gradle:
dependencies {
implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Resilience4j Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°
Resilience4j Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΡΡΡ Ρ micrometer, ΠΏΠΎΡΡΠΎΠΌΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Ρ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ±Π΅Π΄ΠΈΠΌΡΡ, ΡΡΠΎ Π² Π½Π°ΡΠ΅ΠΌ application.yml Π²ΠΊΠ»ΡΡΠ΅Π½ Actuator ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
management:
endpoints:
web:
exposure:
include: health, metrics, prometheus
metrics:
tags:
application: my-spring-app
ΠΠ΄Π΅ΡΡ:
- ΠΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ
metricsΠΈprometheusΠΊ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ HTTP endpoint-Π°ΠΌ, ΡΡΠΎΠ±Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ³Π»Π° ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈ.
ΠΡΠΈΠΌΠ΅Ρ ΠΌΠ΅ΡΡΠΈΠΊ Π΄Π»Ρ Circuit Breaker
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΡΠΉ Circuit Breaker, Π΅ΡΠ»ΠΈ Π²Ρ Π΅ΡΡ ΡΡΠΎΠ³ΠΎ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ, ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΎΠ½ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ.
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
@Service
public class ExternalService {
@CircuitBreaker(name = "externalService", fallbackMethod = "fallbackMethod")
public String getDataFromExternalService() {
// Π‘ΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ
throw new RuntimeException("External service is not available");
}
public String fallbackMethod(Throwable throwable) {
return "Fallback response";
}
}
ΠΠ΅ΡΡΠΈΠΊΠΈ Π΄Π»Ρ externalService Π±ΡΠ΄ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ:
resilience4j_circuitbreaker_state: ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.resilience4j_circuitbreaker_calls: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ².resilience4j_circuitbreaker_successful: ΡΡΠΏΠ΅ΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ.resilience4j_circuitbreaker_failed: Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ.
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΡΠΈΠΊ ΡΠ΅ΡΠ΅Π· Actuator
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ Π·Π°ΠΏΡΠΎΡ Π² Actuator:
curl http://localhost:8080/actuator/metrics
ΠΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ ΠΌΠ΅ΡΡΠΈΠΊ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎ Π²Π°ΡΠ΅ΠΌ Circuit Breaker, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅:
curl http://localhost:8080/actuator/metrics/resilience4j.circuitbreaker.state
ΠΡΠΈΠΌΠ΅Ρ ΠΎΡΠ²Π΅ΡΠ°:
{
"name": "resilience4j.circuitbreaker.state",
"measurements": [
{
"statistic": "value",
"value": 1.0
}
],
"availableTags": [
{
"tag": "name",
"values": ["externalService"]
}
]
}
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ 1.0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Closed ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΡΠ»ΠΈ Π±Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±ΡΠ»ΠΎ Open, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎ Π±Ρ 2.0.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Prometheus
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³: Π½Π°ΡΡΡΠΎΠΈΠΌ Prometheus Π΄Π»Ρ ΡΠ±ΠΎΡΠ° ΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Prometheus
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» prometheus.yml Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ:
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'spring-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Prometheus Ρ ΡΡΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ (Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅, ΡΡΠΎ Prometheus Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½):
prometheus --config.file=prometheus.yml
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π²Π°ΡΠ΅Π³ΠΎ Circuit Breaker Π½Π°ΡΠ½ΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π² Prometheus.
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ Π² Grafana
Π‘ Prometheus ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Grafana Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ .
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Grafana
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Grafana (Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠ΅ΡΠ΅Π· Docker, Homebrew, yum, apt ΠΈ Ρ.Π΄.).
- ΠΠΎΠ±Π°Π²ΡΡΠ΅ Prometheus ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π΄Π°Π½Π½ΡΡ
:
- ΠΠΎΠΉΠ΄ΠΈΡΠ΅ Π² Grafana, ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² "Configuration" -> "Data Sources".
- Π£ΠΊΠ°ΠΆΠΈΡΠ΅ URL Prometheus:
http://localhost:9090.
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ Dashboard:
- Π ΡΠ°Π·Π΄Π΅Π»Π΅ "Visualization" Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Π³ΡΠ°ΡΠΈΠΊ.
- ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π·Π°ΠΏΡΠΎΡ ΠΊ Prometheus, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
resilience4j_circuitbreaker_state{name="externalService"} - ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ Π³ΡΠ°ΡΠΈΠΊ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π²Π°ΡΠΈΠΌΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΡΠΌΠΈ.
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ Π°Π»Π΅ΡΡΡ: Π΅ΡΠ»ΠΈ Circuit Breaker ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
Open, ΠΎΡΠΏΡΠ°Π²Π»ΡΠΉΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π² Slack, ΠΏΠΎΡΡΡ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°. - ΠΠ·ΡΡΠ°ΠΉΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ: Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ. ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΡΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅: Prometheus ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π°.
Π’Π΅ΠΏΠ΅ΡΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠ°Π»ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΠΎ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ Π·Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Circuit Breaker Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ΅Π΄Ρ Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΡΠΊΠ°ΠΆΠ΅Ρ Π²Π°ΠΌ: "ΠΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΏΠ°Π»Π°", Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΎΡΠ²Π΅ΡΠΈΡΡ: "Π― ΡΠΆΠ΅ Π·Π½Π°Ρ, ΠΈ ΠΎΠ½Π° ΡΠ°ΠΌΠ° ΡΠΎΠ±ΠΎΠΉ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· 10 ΡΠ΅ΠΊΡΠ½Π΄. ΠΡΠΈΡΡΠ½ΠΎΠ³ΠΎ Π΄Π½Ρ!"