现在使用consul做了注册中心,想问下如果对于集群注册中心,有没有现成的框架可以直接使用的,网上好多的例子都是注册到单机上的,想求一个类似于spring boot 里面注册到eureka集群里面直接写多个地址就行了,go语言中有没有这样的开源项目啊?
更多评论
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("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
一般注册中心只有一个域名或ip对外, 注册中心可以用nginx反向代理或者是k8s做集群,
确保注册成功有两个方法, 1 supervisor守护consul进程 2 k8s开启N个consul的pod, 用探针确保k8s指向正常工作的consul.
而且你的client也要有retry机制
#3