Java / Spring Boot Entegrasyonu
Consul Guardian, Java uygulamanızın yanında sidecar olarak çalışır. Spring Boot uygulamanız Spring Cloud Consul aracılığıyla Consul KV'den konfigürasyon okur. Guardian aynı anahtarları bağımsız olarak izler, her değişikliği Git'e commit eder ve herhangi bir anahtarı önceki değerine geri yükleyebilir.
Uygulama kodunuzda hiçbir değişiklik gerekmez.
Spring Boot uygulamaları Consul'dan nasıl okur
Spring Cloud Consul Config, Consul KV girdilerini Spring'in @Value ve @ConfigurationProperties mekanizmalarıyla otomatik olarak eşler.
Maven bağımlılığı
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
Gradle bağımlılığı
implementation 'org.springframework.cloud:spring-cloud-starter-consul-config'
bootstrap.yml
spring:
application:
name: order-service
cloud:
consul:
host: consul
port: 8500
config:
enabled: true
format: YAML
prefix: config
default-context: order-service
watch:
enabled: true
delay: 5000
application.yml
spring:
datasource:
url: ${db.url}
username: ${db.username}
cache:
ttl: ${cache.ttl:300}
Konfigürasyonun kullanımı
@RestController
public class OrderController {
@Value("${db.url}")
private String dbUrl;
@Value("${cache.ttl:300}")
private int cacheTtl;
@GetMapping("/orders")
public ResponseEntity<List<Order>> getOrders() {
// Consul KV'den gelen dbUrl ve cacheTtl kullanilir
return ResponseEntity.ok(orderService.findAll());
}
}
Consul KV yapınız:
config/order-service/db.url → "jdbc:postgresql://db.prod:5432/orders"
config/order-service/db.username → "app_user"
config/order-service/cache.ttl → "600"
Spring Cloud Consul değişiklikleri izler ve @RefreshScope bean'lerini otomatik olarak yeniler. Sorun şu: Consul'a yanlış bir değer geldiğinde, önceki değerin ne olduğunu görmenin veya geri almanın dahili bir yolu yoktur.
Guardian ekleme
Docker Compose
version: "3.8"
services:
consul:
image: hashicorp/consul:1.17
ports:
- "8500:8500"
command: agent -dev -client=0.0.0.0
order-service:
build: .
ports:
- "8080:8080"
environment:
- SPRING_CLOUD_CONSUL_HOST=consul
- SPRING_CLOUD_CONSUL_PORT=8500
depends_on:
- consul
guardian:
image: ghcr.io/consul-guardian/consul-guardian:latest
environment:
- CONSUL_GUARDIAN_CONSUL_ADDRESS=http://consul:8500
- CONSUL_GUARDIAN_WATCH_PREFIXES=config/
- CONSUL_GUARDIAN_GIT_REPO_PATH=/data/repo
volumes:
- guardian-data:/data
depends_on:
- consul
volumes:
guardian-data:
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: myregistry/order-service:latest
ports:
- containerPort: 8080
env:
- name: SPRING_CLOUD_CONSUL_HOST
value: "consul.consul.svc.cluster.local"
- name: SPRING_CLOUD_CONSUL_PORT
value: "8500"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: consul-guardian
spec:
replicas: 1
selector:
matchLabels:
app: consul-guardian
template:
metadata:
labels:
app: consul-guardian
spec:
containers:
- name: guardian
image: ghcr.io/consul-guardian/consul-guardian:latest
env:
- name: CONSUL_GUARDIAN_CONSUL_ADDRESS
value: "http://consul.consul.svc.cluster.local:8500"
- name: CONSUL_GUARDIAN_WATCH_PREFIXES
value: "config/"
- name: CONSUL_GUARDIAN_GIT_REPO_PATH
value: "/data/repo"
volumeMounts:
- name: guardian-data
mountPath: /data
volumes:
- name: guardian-data
persistentVolumeClaim:
claimName: guardian-pvc
Geri yükleme senaryosu
Biri veritabanı URL'sini yanlış bir değerle günceller:
consul kv put config/order-service/db.url "jdbc:postgresql://yanlis-host:5432/orders"
Spring Cloud Consul değişikliği alır. Uygulamanız PSQLException: Connection refused hatası fırlatmaya başlar. Tüm /orders istekleri 500 döner.
1. Önceki değeri bulun
consul-guardian log --key config/order-service/db.url
# 2024-03-15T14:45:00Z bad1234 config/order-service/db.url modified
# 2024-03-01T10:00:00Z good567 config/order-service/db.url modified
# 2024-01-15T09:00:00Z init890 config/order-service/db.url created
2. Geri yükleyin
consul-guardian restore --key config/order-service/db.url --commit good567
3. Doğrulayın
consul kv get config/order-service/db.url
# jdbc:postgresql://db.prod:5432/orders ← doğru değer geri yüklendi
Spring Cloud Consul değişikliği algılar ve bean'lerinizi yeniler. Uygulama yeniden başlatmaya gerek kalmadan toparlanır.
Kod değişikliği gerekmez
Guardian, Spring ile entegre olmaz, pom.xml dosyanıza bağımlılık eklemez ve classpath'inizi değiştirmez. Consul KV'yi bağımsız olarak izleyen ayrı bir süreçtir. Spring Boot uygulamanız ve Guardian birbirlerinden habersizdir.