contrib/registry/zookeeper: 服务多实例,会删除之前的注册信息
Author: fengpengyunCreated Feb 11, 2025Updated Aug 6, 2026
Labelsbughelp wanted
Go version
go version go1.23.4 windows/amd64
GoFrame version
2.8.3
Can this bug be reproduced with the latest release?
Option Yes
What did you do?
gsvc.SetRegistry(zookeeper.New(
[]string{"127.0.0.1:2181"}, zookeeper.WithRootPath("/gogf"),
))
s := g.Server("hello.svc")
s.BindHandler("/", func(r *ghttp.Request) {
g.Log().Info(r.Context(), `request received`)
r.Response.Write(`Hello world`)
})
s.Run()What did you see happen?
zookeeper_register.go
// ensureName ensure node exists, if not exist, create and set data
func (r *Registry) ensureName(path string, data []byte, flags int32) error {
exists, stat, err := r.conn.Exists(path)
if err != nil {
return gerror.Wrapf(err,
"Error with check node exist which name is %s",
path,
)
}
// ephemeral nodes handling after restart
// fixes a race condition if the server crashes without using CreateProtectedEphemeralSequential()
if flags&zk.FlagEphemeral == zk.FlagEphemeral {
// 此处会删除 原有server name对应的node节点
err = r.conn.Delete(path, stat.Version)
if err != nil && err != zk.ErrNoNode {
return gerror.Wrapf(err,
"Error with delete node which name is %s",
path,
)
}
exists = false
}
if !exists {
if len(r.opts.user) > 0 && len(r.opts.password) > 0 {
_, err = r.conn.Create(path, data, flags, zk.DigestACL(zk.PermAll, r.opts.user, r.opts.password))
} else {
_, err = r.conn.Create(path, data, flags, zk.WorldACL(zk.PermAll))
}
if err != nil {
return gerror.Wrapf(err,
"Error with create node which name is %s",
path,
)
}
}
return nil
}What did you expect to see?
保留原有的server name node节点,endpoints对应添加,否则服务负载均衡会有问题。
Source: gogf/gf