Ana içeriğe geç

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.