Consul 微服务集成实践
微服务里 Consul 通常同时扮演注册中心、发现器、配置中心三个角色,把这三件事做好,实例的扩容缩容与宕机恢复对调用方完全透明。
注册/发现/配置三件套
| 角色 | Consul 能力 | 使用方 |
|---|---|---|
| 注册中心 | 服务启动时自动注册 | 每个服务实例 |
| 发现中心 | 按服务名查询健康实例 | 调用方 |
| 配置中心 | KV 存放动态配置 | 各服务启动时读取 |
与 API 网关配合
网关是南北向流量的统一入口,与 Consul 组合的典型拓扑:
客户端 → API 网关 ──发现健康实例──→ user / api / order 各服务实例
↑
全部向 Consul 注册,健康检查自动摘除故障实例
后端扩容、缩容、宕机恢复都无需改网关配置,网关按健康实例列表动态路由即可。
Spring Cloud Consul 接入
Java 侧引入依赖后,应用启动即自动注册并维持心跳:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
spring:
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
instance-id: ${spring.application.name}-${random.value} # 保证实例 ID 唯一
health-check-interval: 10s # 心跳周期
启动后可在 Consul UI 看到该服务,健康检查与注销由框架自动维持,业务代码几乎零侵入。
Go 语言官方 API 简例
Go 用官方库手动注册与查询(片段需放入 main 函数,引入 github.com/hashicorp/consul/api):
client, _ := api.NewClient(api.DefaultConfig())
// 注册:提交名称、地址、端口与 TTL 检查
_ = client.Agent().ServiceRegister(&api.AgentServiceRegistration{
Name: "order", Address: "127.0.0.1", Port: 9001,
Check: &api.AgentServiceCheck{TTL: "30s"},
})
// 查询:按名取健康实例
svcs, _, _ := client.Health().Service("order", "", true, nil)
// svcs[0].Service.Address 与 .Service.Port 即实例地址端口
TTL 模式记得周期调用 client.Agent().UpdateTTL(checkID, "", api.HealthPassing) 上报心跳,否则会被判死摘除。
服务网格与 Kubernetes
进阶方向有两条:一是 Consul Connect,给服务注入 sidecar 代理做 mTLS 加密与意图(Intentions)访问控制;二是 Kubernetes 环境用 consul-k8s 项目把 Consul 跑进集群做服务网格。两者都属服务网格范畴,需要时再深入。
小结
微服务落地 Consul 的主线是"自动注册 + 健康摘除 + 按名发现":框架层选 Spring Cloud Consul 最省心,Go 侧用官方 api 几十行搞定,网关按实例列表动态路由,即可享受弹性伸缩与故障自愈的红利。