go语言做consul的服务发现

quanyecha · 2019-10-08 19:53:43 · 1316 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-10-08 19:53:43 的主题,其中的信息可能已经有所发展或是发生改变。

现在使用consul做了注册中心,想问下如果对于集群注册中心,有没有现成的框架可以直接使用的,网上好多的例子都是注册到单机上的,想求一个类似于spring boot 里面注册到eureka集群里面直接写多个地址就行了,go语言中有没有这样的开源项目啊?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1316 次点击  
加入收藏 微博
4 回复  |  直到 2019-10-12 15:50:13
kuangyuansheng
kuangyuansheng · #1 · 5年之前

consul本来就是支持集群的, 而且k8s可以开启多个consul副本.

quanyecha
quanyecha · #2 · 5年之前

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当注册中心的时候,直接写多个注册中心的地址,如果一个不可用他可以去另外的一个注册中心进行注册

kuangyuansheng
kuangyuansheng · #3 · 5年之前

一般注册中心只有一个域名或ip对外, 注册中心可以用nginx反向代理或者是k8s做集群,

确保注册成功有两个方法, 1 supervisor守护consul进程 2 k8s开启N个consul的pod, 用探针确保k8s指向正常工作的consul.

而且你的client也要有retry机制

quanyecha
quanyecha · #4 · 5年之前

@kuangyuansheng 嗯,明白了,多谢指导

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传