// 创建指定的Path func (top *Topology) CreateDir(path string) (string, error) { dir := top.FullPath(path) if ok, _ := top.Exist(dir); ok { log.Println("Path Exists") return dir, nil } else { return zkhelper.CreateRecursive(top.ZkConn, dir, "", 0, zkhelper.DefaultDirACLs()) } }
// // 设置RPC Proxy的数据: // 绑定的前端的ip/port, 例如: {"rpc_front": "tcp://127.0.0.1:5550"} // func (top *Topology) SetRpcProxyData(proxyInfo map[string]interface{}) error { path := top.FullPath("/rpc_proxy") data, err := json.Marshal(proxyInfo) if err != nil { return err } // topo.FlagEphemeral 这里的ProxyInfo是手动配置的,需要持久化 path, err = CreateOrUpdate(top.ZkConn, path, string(data), 0, zkhelper.DefaultDirACLs(), true) log.Println(green("SetRpcProxyData"), "Path: ", path, ", Error: ", err, ", Data: ", string(data)) return err }
// // 注册一个服务的Endpoints // func (s *ServiceEndpoint) AddServiceEndpoint(topo *Topology) error { path := topo.ProductServiceEndPointPath(s.Service, s.ServiceId) data, err := json.Marshal(s) if err != nil { return err } // 创建Service(XXX: Service本身不包含数据) CreateRecursive(topo.ZkConn, os_path.Dir(path), "", 0, zkhelper.DefaultDirACLs()) // 当前的Session挂了,服务就下线 // topo.FlagEphemeral // 参考: https://www.box.com/blog/a-gotcha-when-using-zookeeper-ephemeral-nodes/ // 如果之前的Session信息还存在,则先删除;然后再添加 topo.ZkConn.Delete(path, -1) var pathCreated string pathCreated, err = topo.ZkConn.Create(path, []byte(data), int32(zookeeper.FlagEphemeral), zkhelper.DefaultFileACLs()) log.Println(Green("AddServiceEndpoint"), "Path: ", pathCreated, ", Error: ", err) return err }