From 4826810c2aae1a8901c51a3432a6a79eb643bf09 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 9 Feb 2023 10:55:21 +0800 Subject: [PATCH] errcode --- go.mod | 13 +--- pkg/common/db/cache/black.go | 23 +++--- pkg/common/db/cache/conversation.go | 76 +++++++++++++------- pkg/common/db/cache/friend.go | 33 +++++---- pkg/common/db/cache/group.go | 16 +++-- pkg/discovery_registry/discovery_register.go | 2 +- 6 files changed, 99 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index ccb41a574..133907231 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module Open_IM -go 1.18 +go 1.16 require ( firebase.google.com/go v3.13.0+incompatible @@ -46,7 +46,7 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.428 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.428 github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca - go.etcd.io/etcd/client/v3 v3.5.6 + go.etcd.io/etcd/client/v3 v3.5.6 // indirect go.mongodb.org/mongo-driver v1.8.3 golang.org/x/image v0.3.0 golang.org/x/net v0.5.0 @@ -72,14 +72,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.5.0 // indirect - golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.4.0 // indirect - golang.org/x/text v0.6.0 // indirect - golang.org/x/time v0.1.0 // indirect - golang.org/x/tools v0.1.12 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.7 // indirect + golang.org/x/tools v0.1.12 google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.66.2 // indirect diff --git a/pkg/common/db/cache/black.go b/pkg/common/db/cache/black.go index 1ec53c5e1..9ccfdbf13 100644 --- a/pkg/common/db/cache/black.go +++ b/pkg/common/db/cache/black.go @@ -1,8 +1,6 @@ package cache import ( - "Open_IM/pkg/common/db/relation" - relationTb "Open_IM/pkg/common/db/table/relation" "Open_IM/pkg/common/tracelog" "Open_IM/pkg/utils" "context" @@ -17,25 +15,30 @@ const ( blackExpireTime = time.Second * 60 * 60 * 12 ) -type BlackCache struct { - blackDB *relationTb.BlackModel +type BlackCache interface { + //get blackIDs from cache + GetBlackIDs(ctx context.Context, userID string, fn func(ctx context.Context, userID string) ([]string, error)) (blackIDs []string, err error) + //del user's blackIDs cache, exec when a user's black list changed + DelBlackIDs(ctx context.Context, userID string) (err error) +} + +type BlackCacheRedis struct { expireTime time.Duration rcClient *rockscache.Client } -func NewBlackCache(rdb redis.UniversalClient, blackDB *relation.BlackGorm, options rockscache.Options) *BlackCache { - return &BlackCache{ - blackDB: blackDB, +func NewBlackCacheRedis(rdb redis.UniversalClient, blackDB BlackCache, options rockscache.Options) *BlackCacheRedis { + return &BlackCacheRedis{ expireTime: blackExpireTime, rcClient: rockscache.NewClient(rdb, options), } } -func (b *BlackCache) getBlackIDsKey(ownerUserID string) string { +func (b *BlackCacheRedis) getBlackIDsKey(ownerUserID string) string { return blackIDsKey + ownerUserID } -func (b *BlackCache) GetBlackIDs(ctx context.Context, userID string) (blackIDs []string, err error) { +func (b *BlackCacheRedis) GetBlackIDs(ctx context.Context, userID string) (blackIDs []string, err error) { getBlackIDList := func() (string, error) { blackIDs, err := b.blackDB.GetBlackIDs(ctx, userID) if err != nil { @@ -58,7 +61,7 @@ func (b *BlackCache) GetBlackIDs(ctx context.Context, userID string) (blackIDs [ return blackIDs, utils.Wrap(err, "") } -func (b *BlackCache) DelBlackIDListFromCache(ctx context.Context, userID string) (err error) { +func (b *BlackCacheRedis) DelBlackIDs(ctx context.Context, userID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "userID", userID) }() diff --git a/pkg/common/db/cache/conversation.go b/pkg/common/db/cache/conversation.go index 44f62094c..88d068119 100644 --- a/pkg/common/db/cache/conversation.go +++ b/pkg/common/db/cache/conversation.go @@ -2,6 +2,7 @@ package cache import ( "Open_IM/pkg/common/db/relation" + relationTb "Open_IM/pkg/common/db/table/relation" "Open_IM/pkg/common/tracelog" "Open_IM/pkg/utils" "context" @@ -12,16 +13,39 @@ import ( "time" ) -type DBFun func() (string, error) +const ( + conversationKey = "CONVERSATION:" + conversationIDsKey = "CONVERSATION_IDS:" + recvMsgOptKey = "RECV_MSG_OPT:" + superGroupRecvMsgNotNotifyUserIDsKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS:" + conversationExpireTime = time.Second * 60 * 60 * 12 +) type ConversationCache interface { - GetUserConversationIDListFromCache(userID string, fn DBFun) ([]string, error) - DelUserConversationIDListFromCache(userID string) error - GetConversationFromCache(ownerUserID, conversationID string, fn DBFun) (*table.ConversationModel, error) - GetConversationsFromCache(ownerUserID string, conversationIDList []string, fn DBFun) ([]*table.ConversationModel, error) - GetUserAllConversationList(ownerUserID string, fn DBFun) ([]*table.ConversationModel, error) - DelConversationFromCache(ownerUserID, conversationID string) error + // get user's conversationIDs from cache + GetUserConversationIDs(ctx context.Context, userID string, fn func(ctx context.Context, userID string) ([]string, error)) ([]string, error) + // del user's conversationIDs from cache, call when a user add or reduce a conversation + DelUserConversationIDs(ctx context.Context, userID string) error + // get one conversation from cache + GetConversation(ctx context.Context, ownerUserID, conversationID string, fn func(ctx context.Context, ownerUserID, conversationID string) (*relationTb.ConversationModel, error)) (*relationTb.ConversationModel, error) + // get one conversation from cache + GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string, fn func(ctx context.Context, ownerUserID, conversationIDs []string) ([]*relationTb.ConversationModel, error)) ([]*relationTb.ConversationModel, error) + // get one user's all conversations from cache + GetUserAllConversations(ctx context.Context, ownerUserID string, fn func(ctx context.Context, ownerUserIDs string) ([]*relationTb.ConversationModel, error)) ([]*relationTb.ConversationModel, error) + // del one conversation from cache, call when one user's conversation Info changed + DelConversation(ctx context.Context, ownerUserID, conversationID string) error + // get user conversation recv msg from cache + GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string, fn func(ctx context.Context, ownerUserID, conversationID string) (opt int, err error)) (opt int, err error) + // del user recv msg opt from cache, call when user's conversation recv msg opt changed + DelUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) error + // get one super group recv msg but do not notification userID list + GetSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string, fn func(ctx context.Context, groupID string) (userIDs []string, err error)) (userIDs []string, err error) + // del one super group recv msg but do not notification userID list, call it when this list changed + DelSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) error + //GetSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) (hash uint32, err error) + //DelSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) } + type ConversationRedis struct { rcClient *rockscache.Client } @@ -30,27 +54,27 @@ func NewConversationRedis(rcClient *rockscache.Client) *ConversationRedis { return &ConversationRedis{rcClient: rcClient} } -func NewConversationCache(rdb redis.UniversalClient, conversationDB *relation.ConversationGorm, options rockscache.Options) *ConversationCache { - return &ConversationCache{conversationDB: conversationDB, expireTime: conversationExpireTime, rcClient: rockscache.NewClient(rdb, options)} +func NewNewConversationRedis(rdb redis.UniversalClient, conversationDB *relation.ConversationGorm, options rockscache.Options) *ConversationRedis { + return &ConversationRedis{conversationDB: conversationDB, expireTime: conversationExpireTime, rcClient: rockscache.NewClient(rdb, options)} } -func (c *ConversationCache) getConversationKey(ownerUserID, conversationID string) string { +func (c *ConversationRedis) getConversationKey(ownerUserID, conversationID string) string { return conversationKey + ownerUserID + ":" + conversationID } -func (c *ConversationCache) getConversationIDsKey(ownerUserID string) string { +func (c *ConversationRedis) getConversationIDsKey(ownerUserID string) string { return conversationIDsKey + ownerUserID } -func (c *ConversationCache) getRecvMsgOptKey(ownerUserID, conversationID string) string { +func (c *ConversationRedis) getRecvMsgOptKey(ownerUserID, conversationID string) string { return recvMsgOptKey + ownerUserID + ":" + conversationID } -func (c *ConversationCache) getSuperGroupRecvNotNotifyUserIDsKey(groupID string) string { +func (c *ConversationRedis) getSuperGroupRecvNotNotifyUserIDsKey(groupID string) string { return superGroupRecvMsgNotNotifyUserIDsKey + groupID } -func (c *ConversationCache) GetUserConversationIDs(ctx context.Context, ownerUserID string, f func(userID string) ([]string, error)) (conversationIDs []string, err error) { +func (c *ConversationRedis) GetUserConversationIDs(ctx context.Context, ownerUserID string, f func(userID string) ([]string, error)) (conversationIDs []string, err error) { //getConversationIDs := func() (string, error) { // conversationIDs, err := relation.GetConversationIDsByUserID(ownerUserID) // if err != nil { @@ -76,7 +100,7 @@ func (c *ConversationCache) GetUserConversationIDs(ctx context.Context, ownerUse }) } -func (c *ConversationCache) GetUserConversationIDs1(ctx context.Context, ownerUserID string) (conversationIDs []string, err error) { +func (c *ConversationRedis) GetUserConversationIDs1(ctx context.Context, ownerUserID string) (conversationIDs []string, err error) { //getConversationIDs := func() (string, error) { // conversationIDs, err := relation.GetConversationIDsByUserID(ownerUserID) // if err != nil { @@ -146,14 +170,14 @@ func GetCache[T any](rcClient *rockscache.Client, key string, expire time.Durati return t, nil } -func (c *ConversationCache) DelUserConversationIDs(ctx context.Context, ownerUserID string) (err error) { +func (c *ConversationRedis) DelUserConversationIDs(ctx context.Context, ownerUserID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID) }() return utils.Wrap(c.rcClient.TagAsDeleted(c.getConversationIDsKey(ownerUserID)), "DelUserConversationIDs err") } -func (c *ConversationCache) GetConversation(ctx context.Context, ownerUserID, conversationID string) (conversation *relationTb.ConversationModel, err error) { +func (c *ConversationRedis) GetConversation(ctx context.Context, ownerUserID, conversationID string) (conversation *relationTb.Conversation, err error) { getConversation := func() (string, error) { conversation, err := relation.GetConversation(ownerUserID, conversationID) if err != nil { @@ -177,14 +201,14 @@ func (c *ConversationCache) GetConversation(ctx context.Context, ownerUserID, co return conversation, utils.Wrap(err, "Unmarshal failed") } -func (c *ConversationCache) DelConversation(ctx context.Context, ownerUserID, conversationID string) (err error) { +func (c *ConversationRedis) DelConversation(ctx context.Context, ownerUserID, conversationID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID, "conversationID", conversationID) }() return utils.Wrap(c.rcClient.TagAsDeleted(c.getConversationKey(ownerUserID, conversationID)), "DelConversation err") } -func (c *ConversationCache) GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []relationTb.ConversationModel, err error) { +func (c *ConversationRedis) GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []relationTb.ConversationModel, err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID, "conversationIDs", conversationIDs, "conversations", conversations) }() @@ -198,7 +222,7 @@ func (c *ConversationCache) GetConversations(ctx context.Context, ownerUserID st return conversations, nil } -func (c *ConversationCache) GetUserAllConversations(ctx context.Context, ownerUserID string) (conversations []relationTb.ConversationModel, err error) { +func (c *ConversationRedis) GetUserAllConversations(ctx context.Context, ownerUserID string) (conversations []relationTb.ConversationModel, err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID, "conversations", conversations) }() @@ -217,7 +241,7 @@ func (c *ConversationCache) GetUserAllConversations(ctx context.Context, ownerUs return conversationIDs, nil } -func (c *ConversationCache) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) { +func (c *ConversationRedis) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) { getConversation := func() (string, error) { conversation, err := relation.GetConversation(ownerUserID, conversationID) if err != nil { @@ -235,22 +259,22 @@ func (c *ConversationCache) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, return strconv.Atoi(optStr) } -func (c *ConversationCache) DelUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) error { +func (c *ConversationRedis) DelUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) error { return utils.Wrap(c.rcClient.TagAsDeleted(c.getConversationKey(ownerUserID, conversationID)), "DelUserRecvMsgOpt failed") } -func (c *ConversationCache) GetSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) { +func (c *ConversationRedis) GetSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) { return nil, nil } -func (c *ConversationCache) DelSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (err error) { +func (c *ConversationRedis) DelSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (err error) { return nil } -func (c *ConversationCache) GetSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) (hash uint32, err error) { +func (c *ConversationRedis) GetSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) (hash uint32, err error) { return } -func (c *ConversationCache) DelSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) { +func (c *ConversationRedis) DelSuperGroupRecvMsgNotNotifyUserIDsHash(ctx context.Context, groupID string) { return } diff --git a/pkg/common/db/cache/friend.go b/pkg/common/db/cache/friend.go index 8963ea41f..fb6c5c8c4 100644 --- a/pkg/common/db/cache/friend.go +++ b/pkg/common/db/cache/friend.go @@ -19,33 +19,42 @@ const ( friendKey = "FRIEND_INFO:" ) -type FriendCache struct { +type FriendCache interface { + GetFriendIDs(ctx context.Context, ownerUserID string, fn func(ctx context.Context, ownerUserID string) (friendIDs []string, err error)) (friendIDs []string, err error) + // call when friendID List changed + DelFriendIDs(ctx context.Context, ownerUserID string) (err error) + GetFriend(ctx context.Context, ownerUserID, friendUserID string, fn func(ctx context.Context, ownerUserID, friendUserID string) (friend *relationTb.FriendModel, err error)) (friend *relationTb.FriendModel, err error) + // del friend when friend info changed or remove it + DelFriend(ctx context.Context, ownerUserID, friendUserID string) (err error) +} + +type FriendCacheRedis struct { friendDB *relation.FriendGorm expireTime time.Duration rcClient *rockscache.Client } -func NewFriendCache(rdb redis.UniversalClient, friendDB *relation.FriendGorm, options rockscache.Options) *FriendCache { - return &FriendCache{ +func NewFriendCacheRedis(rdb redis.UniversalClient, friendDB *relation.FriendGorm, options rockscache.Options) *FriendCacheRedis { + return &FriendCacheRedis{ friendDB: friendDB, expireTime: friendExpireTime, rcClient: rockscache.NewClient(rdb, options), } } -func (f *FriendCache) getFriendIDsKey(ownerUserID string) string { +func (f *FriendCacheRedis) getFriendIDsKey(ownerUserID string) string { return friendIDsKey + ownerUserID } -func (f *FriendCache) getTwoWayFriendsIDsKey(ownerUserID string) string { +func (f *FriendCacheRedis) getTwoWayFriendsIDsKey(ownerUserID string) string { return TwoWayFriendsIDsKey + ownerUserID } -func (f *FriendCache) getFriendKey(ownerUserID, friendUserID string) string { +func (f *FriendCacheRedis) getFriendKey(ownerUserID, friendUserID string) string { return friendKey + ownerUserID + "-" + friendUserID } -func (f *FriendCache) GetFriendIDs(ctx context.Context, ownerUserID string) (friendIDs []string, err error) { +func (f *FriendCacheRedis) GetFriendIDs(ctx context.Context, ownerUserID string) (friendIDs []string, err error) { getFriendIDs := func() (string, error) { friendIDs, err := f.friendDB.GetFriendIDs(ctx, ownerUserID) if err != nil { @@ -68,14 +77,14 @@ func (f *FriendCache) GetFriendIDs(ctx context.Context, ownerUserID string) (fri return friendIDs, utils.Wrap(err, "") } -func (f *FriendCache) DelFriendIDs(ctx context.Context, ownerUserID string) (err error) { +func (f *FriendCacheRedis) DelFriendIDs(ctx context.Context, ownerUserID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID) }() return f.rcClient.TagAsDeleted(f.getFriendIDsKey(ownerUserID)) } -func (f *FriendCache) GetTwoWayFriendIDs(ctx context.Context, ownerUserID string) (twoWayFriendIDs []string, err error) { +func (f *FriendCacheRedis) GetTwoWayFriendIDs(ctx context.Context, ownerUserID string) (twoWayFriendIDs []string, err error) { friendIDs, err := f.GetFriendIDs(ctx, ownerUserID) if err != nil { return nil, err @@ -92,14 +101,14 @@ func (f *FriendCache) GetTwoWayFriendIDs(ctx context.Context, ownerUserID string return twoWayFriendIDs, nil } -func (f *FriendCache) DelTwoWayFriendIDs(ctx context.Context, ownerUserID string) (err error) { +func (f *FriendCacheRedis) DelTwoWayFriendIDs(ctx context.Context, ownerUserID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID) }() return f.rcClient.TagAsDeleted(f.getTwoWayFriendsIDsKey(ownerUserID)) } -func (f *FriendCache) GetFriend(ctx context.Context, ownerUserID, friendUserID string) (friend *relationTb.FriendModel, err error) { +func (f *FriendCacheRedis) GetFriend(ctx context.Context, ownerUserID, friendUserID string) (friend *relationTb.FriendModel, err error) { getFriend := func() (string, error) { friend, err = f.friendDB.Take(ctx, ownerUserID, friendUserID) if err != nil { @@ -120,7 +129,7 @@ func (f *FriendCache) GetFriend(ctx context.Context, ownerUserID, friendUserID s return friend, utils.Wrap(err, "") } -func (f *FriendCache) DelFriend(ctx context.Context, ownerUserID, friendUserID string) (err error) { +func (f *FriendCacheRedis) DelFriend(ctx context.Context, ownerUserID, friendUserID string) (err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "ownerUserID", ownerUserID, "friendUserID", friendUserID) }() diff --git a/pkg/common/db/cache/group.go b/pkg/common/db/cache/group.go index f6957235b..f7e267360 100644 --- a/pkg/common/db/cache/group.go +++ b/pkg/common/db/cache/group.go @@ -2,8 +2,8 @@ package cache import ( "Open_IM/pkg/common/constant" - "Open_IM/pkg/common/db/localcache" "Open_IM/pkg/common/db/relation" + relationTb "Open_IM/pkg/common/db/table/relation" "Open_IM/pkg/common/db/unrelation" "Open_IM/pkg/common/tracelog" "Open_IM/pkg/utils" @@ -14,7 +14,6 @@ import ( "math/big" "sort" "strconv" - "sync" "time" ) @@ -29,7 +28,14 @@ const ( groupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:" ) -type GroupCache struct { +type GroupCache interface { + GetGroupsInfo(ctx context.Context, groupIDs []string, fn func(ctx context.Context, groupIDs []string) (groups []*relationTb.GroupModel, err error)) (groups []*relationTb.GroupModel, err error) + DelGroupsInfo(ctx context.Context, groupID string) (err error) + GetGroupInfo(ctx context.Context, groupID string, fn func(ctx context.Context, groupID string) (group *relationTb.GroupModel, err error)) (group *relationTb.GroupModel, err error) + DelGroupInfo(ctx context.Context, groupID string) (err error) +} + +type GroupCacheRedis struct { group *relation.GroupGorm groupMember *relation.GroupMemberGorm groupRequest *relation.GroupRequestGorm @@ -39,8 +45,8 @@ type GroupCache struct { rcClient *rockscache.Client } -func NewGroupCache(rdb redis.UniversalClient, groupDB *relation.GroupGorm, groupMemberDB *relation.GroupMemberGorm, groupRequestDB *relation.GroupRequestGorm, mongoClient *unrelation.SuperGroupMongoDriver, opts rockscache.Options) *GroupCache { - return &GroupCache{rcClient: rockscache.NewClient(rdb, opts), expireTime: groupExpireTime, +func NewGroupCacheRedis(rdb redis.UniversalClient, groupDB *relation.GroupGorm, groupMemberDB *relation.GroupMemberGorm, groupRequestDB *relation.GroupRequestGorm, mongoClient *unrelation.SuperGroupMongoDriver, opts rockscache.Options) *GroupCacheRedis { + return &GroupCacheRedis{rcClient: rockscache.NewClient(rdb, opts), expireTime: groupExpireTime, group: groupDB, groupMember: groupMemberDB, groupRequest: groupRequestDB, redisClient: NewRedisClient(rdb), mongoDB: mongoClient, } diff --git a/pkg/discovery_registry/discovery_register.go b/pkg/discovery_registry/discovery_register.go index b1c2a475d..56b2eaf34 100644 --- a/pkg/discovery_registry/discovery_register.go +++ b/pkg/discovery_registry/discovery_register.go @@ -8,7 +8,7 @@ type SvcDiscoveryRegistry interface { Register(serviceName, host string, port int, opts ...grpc.DialOption) error UnRegister() error GetConns(serviceName string, opts ...grpc.DialOption) ([]*grpc.ClientConn, error) - GetConn(serviceName string, strategy func(slice []*grpc.ClientConn) int, opts ...grpc.DialOption) (*grpc.ClientConn, error) + GetConn(serviceName string, opts ...grpc.DialOption) (*grpc.ClientConn, error) //RegisterConf(conf []byte) error //LoadConf() ([]byte, error) }