package etcd import "fmt" const ( rootKeyServices = "services" rootKeyTopic = "topic" ) type INode interface { // 注册到etcd的key EtcdKey() string EtcdRootKey() string MapKey() string } type ServiceNodeStateType int const ( SNST_Unknown = 0 // 无状态服务,如大厅,聊天服,匹配服,登陆服等 SNST_Stateless = 1 // 无状态服务,如大厅,聊天服,匹配服,登陆服等 SNST_Stateful = 2 // 有状态服务,主要是各类玩法服,需要记录玩家在哪个玩法服里面,以便消息不会发到同玩法的其它节点服上 SNST_Ordered = 3 // 有序服务,主要是db服这类需要根据玩家id hash到固定的节点上,保证数据一致性 ) func (s ServiceNodeStateType) String() string { switch s { case SNST_Stateless: return "stateless" case SNST_Stateful: return "stateful" case SNST_Ordered: return "ordered" case SNST_Unknown: return "unknown" default: return fmt.Sprint(s) } } // 服务节点信息,TypeId及Type都是标记同类型的节点,Name是区别该节点与其它节点的字段 type ServiceNode struct { TypeId int `json:"type_id"` // 服务类型id,与Type字段功能一样, 由proto定义,gate通过该字段找到这类服务的所有节点信息 Name string `json:"name"` // 服务名 多个同类服务依赖name区分:lobby1,lobby2,lobby3等等 Type string `json:"type"` // 服务类型:lobby, game, gate等等 Version string `json:"version"` // 版本号 } func (s ServiceNode) EtcdKey() string { return fmt.Sprintf("/%s/%s/%s", rootKeyServices, s.Type, s.Name) } func (s ServiceNode) EtcdRootKey() string { return rootKeyServices } func (s ServiceNode) MapKey() string { return s.Name } type TopicNode struct { Name string `json:"name"` // topic名 Creator string `json:"creator"` // topic创建者 } func (s TopicNode) EtcdKey() string { return fmt.Sprintf("/%s/%s/%s", rootKeyTopic, s.Creator, s.Name) } func (s TopicNode) EtcdRootKey() string { return rootKeyTopic } func (s TopicNode) MapKey() string { return s.Name }