go语言做consul的服务发现

quanyecha · 2019-10-08 19:53:43 · 1328 次点击

1楼 @kuangyuansheng 嗯,我明白consul可以做集群。比如说现在有2个consul server 叫做serverA,serverB,两个consul client,client A,client B,现在我有一个微服务叫user,还有一个微服务叫order ,他们都要注册到consul集群中,我使用的是微服务主动注册的方式. 网上一般的例子都是这样的:

fmt.Println("begin register server")

fmt.Println(c)
config := consulApi.DefaultConfig()
fmt.Println(c.ConsulAddress)
config.Address = c.ConsulAddress
client, err := consulApi.NewClient(config)
if err != nil {
    log.Fatal("consul client error : ", 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 = &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("register server error : ", err)
}

// 下面两行代码的意思还不是很明白
http.HandleFunc("/check", consulCheck)
// 这个代码是监听相应的端口
go http.ListenAndServe(fmt.Sprintf(":%d", 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