Consul服务发现与KV配置管理:微服务注册中心搭建实战

Consul是HashiCorp开源的分布式服务发现配置管理工具,提供服务注册、健康检查、KV存储和多数据中心支持。在微服务架构和DevOps实践中,Consul作为服务注册中心解决了服务间动态寻址问题,配合健康检查机制实现自动故障摘除,是容器编排场景中替代硬编码地址的关键基础设施组件。

Consul集群架构与Server/Agent部署

Consul采用Gossip协议进行成员管理和故障检测,使用Raft协议保证强一致性。集群节点分为Server和Client两种角色:Server节点参与Raft共识和数据存储(建议3或5个节点),Client节点轻量级运行在应用主机上转发请求。

以下是在三台服务器上部署Consul Server集群的配置。每台Server节点配置如下:

# server.hcl - Consul Server节点配置
datacenter = "dc1"
data_dir = "/opt/consul/data"
server = true
bootstrap_expect = 3
bind_addr = "{{ GetInterfaceIP "eth0" }}"
client_addr = "0.0.0.0"
advertise_addr = "{{ GetInterfaceIP "eth0" }}"

raft_protocol = 3
performance = {
  raft_multiplier = 1
}

verify_incoming = true
verify_outgoing = true
verify_server_hostname = true
ca_file = "/opt/consul/tls/ca.crt"
cert_file = "/opt/consul/tls/server.crt"
key_file = "/opt/consul/tls/server.key"

acl = {
  enabled = true
  default_policy = "deny"
  enable_token_persistence = true
}

connect = {
  enabled = true
}

ports = {
  grpc = 8502
  grpc_tls = 8503
}

log_level = "INFO"
log_file = "/var/log/consul/"
log_rotate_bytes = 10485760
log_rotate_duration = "24h"

使用systemd管理Consul Server进程:

# /etc/systemd/system/consul.service
[Unit]
Description=Consul Server
After=network-online.target
Wants=network-online.target

[Service]
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/opt/consul/config
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Client节点配置更简单,去掉server和bootstrap_expect即可。Client启动后自动通过Gossip协议发现集群并加入。

服务注册与健康检查配置

服务可以两种方式注册到Consul:配置文件声明和HTTP API动态注册。配置文件方式适合静态服务,API方式适合容器化动态服务。

配置文件方式注册服务:

{
  "services": [
    {
      "id": "web-1",
      "name": "webapp",
      "tags": ["v2", "primary"],
      "address": "192.168.1.10",
      "port": 8080,
      "meta": {
        "version": "2.1.0",
        "team": "frontend"
      },
      "checks": [
        {
          "id": "web-http",
          "name": "HTTP Health Check",
          "http": "http://192.168.1.10:8080/health",
          "method": "GET",
          "interval": "10s",
          "timeout": "3s",
          "deregister_critical_service_after": "30s"
        },
        {
          "id": "web-tcp",
          "name": "TCP Port Check",
          "tcp": "192.168.1.10:8080",
          "interval": "5s",
          "timeout": "1s"
        }
      ]
    }
  ]
}

HTTP API动态注册方式:

import requests
import json

CONSUL_URL = "http://consul-server:8500/v1"

def register_service(service_id, name, address, port, tags=None):
    payload = {
        "ID": service_id,
        "Name": name,
        "Address": address,
        "Port": port,
        "Tags": tags or [],
        "Check": {
            "HTTP": f"http://{address}:{port}/health",
            "Interval": "10s",
            "Timeout": "3s",
            "DeregisterCriticalServiceAfter": "30s"
        }
    }
    resp = requests.put(
        f"{CONSUL_URL}/agent/service/register",
        json=payload
    )
    return resp.status_code == 200

def deregister_service(service_id):
    resp = requests.put(
        f"{CONSUL_URL}/agent/service/deregister/{service_id}"
    )
    return resp.status_code == 200

def discover_service(name, healthy_only=True):
    params = {}
    if healthy_only:
        params["filter"] = "Checks[0].Status == 'passing'"
    resp = requests.get(
        f"{CONSUL_URL}/health/service/{name}",
        params=params
    )
    services = []
    for entry in resp.json():
        svc = entry["Service"]
        services.append({
            "id": svc["ID"],
            "address": svc["Address"],
            "port": svc["Port"],
            "tags": svc.get("Tags", [])
        })
    return services

Consul Template实现动态配置渲染

Consul Template监控Consul KV或服务列表变化,自动渲染配置文件并触发服务重载。这在Nginx动态upstream配置场景中非常实用——当服务实例上下线时,Nginx配置自动更新。

# nginx-upstream.ctmpl
upstream backend {
    {{ range service "webapp" }}
    server {{ .Address }}:{{ .Port }} weight=5 max_fails=3 fail_timeout=30s;
    {{ end }}
}

{{ key "nginx/worker_processes" | default "auto" }}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

运行Consul Template并配置自动重载:

consul-template   -consul-addr="http://consul-server:8500"   -template="/etc/consul-template/nginx-upstream.ctmpl:/etc/nginx/conf.d/upstream.conf:nginx -s reload"   -log-level=info

Watch机制与事件通知集成

Consul的Watch机制可以监控服务或KV的变化并触发外部脚本,常用于与CI/CD流水线集成实现自动扩缩容:

{
  "watches": [
    {
      "type": "service",
      "service": "webapp",
      "state": "critical",
      "handler": "/opt/scripts/handle_service_failure.sh"
    },
    {
      "type": "keyprefix",
      "prefix": "config/",
      "handler": "/opt/scripts/reload_config.py"
    }
  ]
}

当服务健康检查失败时,handler脚本可以调用告警系统发送通知或触发自动修复流程。这种机制使得Consul不仅是服务注册中心,还能作为运维自动化的事件驱动引擎。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/consul-fu-wu-fa-xian-yu-kv-pei-zhi-guan-li-wei-fu-wu-zhu-ce/

(0)
小编小编
上一篇 4小时前
下一篇 4小时前

相关推荐