go语言做consul的服务发现

quanyecha · · 1207 次点击
1楼 <a href="/user/kuangyuansheng" title="@kuangyuansheng">@kuangyuansheng</a> 嗯,我明白consul可以做集群。比如说现在有2个consul server 叫做serverA,serverB,两个consul client,client A,client B,现在我有一个微服务叫user,还有一个微服务叫order ,他们都要注册到consul集群中,我使用的是微服务主动注册的方式. 网上一般的例子都是这样的: fmt.Println(&#34;begin register server&#34;) fmt.Println(c) config := consulApi.DefaultConfig() fmt.Println(c.ConsulAddress) config.Address = c.ConsulAddress client, err := consulApi.NewClient(config) if err != nil { log.Fatal(&#34;consul client error : &#34;, err) } registration := new(consulApi.AgentServiceRegistration) registration.ID = c.ID // 服务节点的名称 registration.Name = c.Name // 服务名称 registration.Port = c.Port // 服务端口 //registration.Tags = c.Tags // tag,可以为空 registration.Address = c.ServiceAddress registration.Check = &amp;consulApi.AgentServiceCheck{ // 健康检查 HTTP: c.HTTP, Timeout: c.Timeout, Interval: c.Interval, // 健康检查间隔 DeregisterCriticalServiceAfter: c.DeregisterCriticalServiceAfter, //check失败后30秒删除本服务,注销时间,相当于过期时间 } // 注册服务 err = client.Agent().ServiceRegister(registration) if err != nil { log.Fatal(&#34;register server error : &#34;, err) } // 下面两行代码的意思还不是很明白 http.HandleFunc(&#34;/check&#34;, consulCheck) // 这个代码是监听相应的端口 go http.ListenAndServe(fmt.Sprintf(&#34;:%d&#34;, c.CheckPort), nil) 但是这样的例子服务职能注册固定的consul 的client ,万一服务注册的时候这个consul client挂了就会导致注册不上去,这里可以写多个地址,就像springboot 里面eureka当注册中心的时候,直接写多个注册中心的地址,如果一个不可用他可以去另外的一个注册中心进行注册
#2
更多评论
consul本来就是支持集群的, 而且k8s可以开启多个consul副本.
#1
一般注册中心只有一个域名或ip对外, 注册中心可以用nginx反向代理或者是k8s做集群, 确保注册成功有两个方法, 1 supervisor守护consul进程 2 k8s开启N个consul的pod, 用探针确保k8s指向正常工作的consul. 而且你的client也要有retry机制
#3