Go微服务注册与发现Consul-Etcd集成实战
文章导语
微服务架构中,服务实例动态变化——扩容、缩容、故障转移。注册中心是服务间相互发现的核心基础设施。本文基于Consul和etcd,在Go中实现完整的服务注册发现和健康检查。
一、服务注册发现的基本流程
1. 服务启动 → 向注册中心注册(IP+Port+健康检查URL) 2. 注册中心定期健康检查 3. 服务消费者从注册中心获取可用实例列表 4. 实例变化时注册中心推送更新 5. 服务关闭 → 注销实例二、Consul集成
import"github.com/hashicorp/consul/api"typeConsulRegistrystruct{client*api.Client}funcNewConsulRegistry(addrstring)(*ConsulRegistry,error){config:=api.DefaultConfig()config.Address=addr client,err:=api.NewClient(config)iferr!=nil{returnnil,err}return&ConsulRegistry{client:client},nil}func(r*ConsulRegistry)Register(service*api.AgentServiceRegistration)error{returnr.client.Agent().ServiceRegister(service)}func(r*ConsulRegistry)Discover(serviceNamestring)([]*api.ServiceEntry,error){entries,_,err:=r.client.Health().Service(serviceName,"",true,nil)returnentries,err}// 使用funcRegisterService(registry*ConsulRegistry){registration:=&api.AgentServiceRegistration{ID:"user-service-1",Name:"user-service",Address:"192.168.1.100",Port:8080,Check:&api.AgentServiceCheck{HTTP:"http://192.168.1.100:8080/health",Interval:"10s",Timeout:"3s",},}registry.Register(registration)}三、etcd集成
funcEtcdRegister(client*clientv3.Client,serviceName,addrstring,ttlint64)error{lease,err:=client.Grant(context.Background(),ttl)iferr!=nil{returnerr}key:=fmt.Sprintf("/services/%s/%s",serviceName,addr)_,err=client.Put(context.Background(),key,addr,clientv3.WithLease(lease.ID))iferr!=nil{returnerr}// 续租ch,err:=client.KeepAlive(context.Background(),lease.ID)gofunc(){forrangech{// 续租成功}}()returnnil}funcEtcdDiscover(client*clientv3.Client,serviceNamestring)([]string,error){key:=fmt.Sprintf("/services/%s/",serviceName)resp,err:=client.Get(context.Background(),key,clientv3.WithPrefix())iferr!=nil{returnnil,err}varaddrs[]stringfor_,kv:=rangeresp.Kvs{addrs=append(addrs,string(kv.Value))}returnaddrs,nil}四、健康检查端点
funcHealthCheck(c*gin.Context){c.JSON(200,gin.H{"status":"UP","time":time.Now(),})}funcReadinessCheck(db*sql.DB)gin.HandlerFunc{returnfunc(c*gin.Context){iferr:=db.Ping();err!=nil{c.JSON(503,gin.H{"status":"DOWN","reason":"db unreachable"})return}c.JSON(200,gin.H{"status":"READY"})}}五、全文总结
- Consul提供完整的服务发现+健康检查+KV存储
- etcd基于Raft强一致性,适合K8S环境
- 健康检查是服务发现准确性的保障
- 服务关闭时必须主动注销
参考文献
- Consul Go API: https://github.com/hashicorp/consul
- etcd Go Client: https://github.com/etcd-io/etcd
- Microservices Patterns - Service Discovery