资讯动态

Go微服务注册与发现从Consul到etcd的完整集成

发布时间:2026/8/22 12:49:38 来源:尧图企业网站定制
Go微服务注册与发现Consul-Etcd集成实战文章导语微服务架构中服务实例动态变化——扩容、缩容、故障转移。注册中心是服务间相互发现的核心基础设施。本文基于Consul和etcd在Go中实现完整的服务注册发现和健康检查。一、服务注册发现的基本流程1. 服务启动 → 向注册中心注册IPPort健康检查URL 2. 注册中心定期健康检查 3. 服务消费者从注册中心获取可用实例列表 4. 实例变化时注册中心推送更新 5. 服务关闭 → 注销实例二、Consul集成importgithub.com/hashicorp/consul/apitypeConsulRegistrystruct{client*api.Client}funcNewConsulRegistry(addrstring)(*ConsulRegistry,error){config:api.DefaultConfig()config.Addressaddr client,err:api.NewClient(config)iferr!nil{returnnil,err}returnConsulRegistry{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)_,errclient.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{addrsappend(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/consuletcd Go Client: https://github.com/etcd-io/etcdMicroservices Patterns - Service Discovery

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价