Tüm Diller / HTTP API
Consul, KV deposunu basit bir HTTP API üzerinden sunar. HTTP isteği yapabilen herhangi bir dil, konfigürasyonu okuyabilir ve yazabilir. Guardian aynı anahtarları bağımsız olarak izler -- uygulamanızın hangi dilde yazıldığı önemli değildir.
Consul KV HTTP API
Bir anahtar okuma
GET /v1/kv/:key
curl http://consul:8500/v1/kv/config/myapp/db_host?raw
# Dönen değer: db.prod.internal
?raw parametresi olmadan, yanıt Base64 kodlanmış değer içeren JSON formatındadır:
curl -s http://consul:8500/v1/kv/config/myapp/db_host | jq .
[
{
"LockIndex": 0,
"Key": "config/myapp/db_host",
"Flags": 0,
"Value": "ZGIucHJvZC5pbnRlcm5hbA==",
"CreateIndex": 42,
"ModifyIndex": 87
}
]
Bir anahtar yazma
curl -X PUT -d "db.prod.internal" http://consul:8500/v1/kv/config/myapp/db_host
Bir prefix altındaki anahtarları listeleme
curl http://consul:8500/v1/kv/config/myapp/?keys
# ["config/myapp/db_host", "config/myapp/db_port", "config/myapp/cache_ttl"]
Bir prefix altındaki tüm anahtarları okuma
curl -s http://consul:8500/v1/kv/config/myapp/?recurse | jq .
Dil örnekleri
Ruby
require "net/http"
require "json"
def consul_get(key)
uri = URI("http://consul:8500/v1/kv/#{key}?raw")
Net::HTTP.get(uri)
end
db_host = consul_get("config/myapp/db_host")
db_port = consul_get("config/myapp/db_port").to_i
PHP
<?php
function consul_get(string $key): string {
$url = "http://consul:8500/v1/kv/{$key}?raw";
return file_get_contents($url);
}
$dbHost = consul_get("config/myapp/db_host");
$dbPort = (int) consul_get("config/myapp/db_port");
Rust
use reqwest;
async fn consul_get(key: &str) -> Result<String, reqwest::Error> {
let url = format!("http://consul:8500/v1/kv/{}?raw", key);
reqwest::get(&url).await?.text().await
}
Shell script
#!/bin/bash
DB_HOST=$(curl -s http://consul:8500/v1/kv/config/myapp/db_host?raw)
DB_PORT=$(curl -s http://consul:8500/v1/kv/config/myapp/db_port?raw)
echo "${DB_HOST}:${DB_PORT} adresine baglaniliyor"
Guardian ekleme
Docker Compose sablonu
Bu sablon herhangi bir dil ile calışır. myapp kısmını kendi servisinizle değiştirin:
version: "3.8"
services:
consul:
image: hashicorp/consul:1.17
ports:
- "8500:8500"
command: agent -dev -client=0.0.0.0
myapp:
build: .
ports:
- "8080:8080"
environment:
- CONSUL_ADDR=http://consul: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 sablonu
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
Bunu mevcut uygulamanızın yanına deploy edin. Uygulamanızın Deployment'ında herhangi bir değişiklik gerekmez.
consul-template ile ortam değişkeni yaklaşımı
Uygulamanız Consul'dan doğrudan değil, ortam değişkenlerinden konfigürasyon okuyorsa, consul-template kullanarak Consul KV'den bir .env dosyası oluşturabilirsiniz. Guardian yine Consul'daki kaynak verileri korur:
# consul-template.hcl
template {
contents = <<EOF
DB_HOST={{ key "config/myapp/db_host" }}
DB_PORT={{ key "config/myapp/db_port" }}
CACHE_TTL={{ key "config/myapp/cache_ttl" }}
EOF
destination = "/app/.env"
command = "kill -HUP $(cat /app/app.pid)"
}
version: "3.8"
services:
consul:
image: hashicorp/consul:1.17
command: agent -dev -client=0.0.0.0
myapp:
build: .
volumes:
- app-env:/app
consul-template:
image: hashicorp/consul-template:latest
command: -config=/etc/consul-template.hcl
volumes:
- ./consul-template.hcl:/etc/consul-template.hcl
- app-env:/app
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:
app-env:
Bu kurulumda:
- consul-template Consul'dan okur ve uygulamanız için ortam değişken dosyaları yazar
- Guardian aynı Consul anahtarlarını izler ve Git geçmişini tutar
- Uygulamanız
.envdosyalarını okur ve Consul'dan habersizdir
Geri yükleme senaryosu
Dil fark etmeksizin, geri yükleme akışı aynıdır:
# Değişiklik geçmişini görün
consul-guardian log --prefix config/myapp/
# Tek bir anahtarı geri yükleyin
consul-guardian restore --key config/myapp/db_host --commit abc1234
# Tüm prefix'i geri yükleyin
consul-guardian restore --prefix config/myapp/ --commit abc1234
Guardian, CAS kullanarak değerleri Consul'a geri yazar. Uygulamanız, halihazırda kullandığı mekanizma aracılığıyla (polling, watch, consul-template, yeniden başlatma) değişiklikleri alır.
Kod değişikliği gerekmez
Guardian herhangi bir dille çalışır çünkü uygulamanıza hiç dokunmaz. Consul'un KV deposunu HTTP üzerinden izleyen ve değişiklikleri Git'e commit eden bağımsız bir süreçtir. Uygulamanız Ruby, PHP, Rust, Elixir veya bash script ile yazılmış olsun -- Guardian aynı şekilde çalışır.