122 lines
2.5 KiB
Go
122 lines
2.5 KiB
Go
// Package etcd ...
|
|
//
|
|
// Description : etcd ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 2021-11-23 10:53 上午
|
|
package etcd
|
|
|
|
import (
|
|
"errors"
|
|
clientv3 "go.etcd.io/etcd/client/v3"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
// Client 客户端
|
|
Client *client
|
|
)
|
|
|
|
func init() {
|
|
Client = &client{
|
|
table: make(map[string]*WrapperClient),
|
|
lock: &sync.RWMutex{},
|
|
}
|
|
}
|
|
|
|
type client struct {
|
|
// table 实例表
|
|
table map[string]*WrapperClient
|
|
lock *sync.RWMutex
|
|
}
|
|
|
|
// AddEtcdClient 初始化etcd连接
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 10:53 上午 2021/11/23
|
|
func (c *client) AddEtcdClient(flag string, cfg clientv3.Config) error {
|
|
if nil == cfg.Endpoints || len(cfg.Endpoints) == 0 {
|
|
return errors.New("endpoints is empty")
|
|
}
|
|
|
|
// 连接超时
|
|
if cfg.DialTimeout == 0 {
|
|
cfg.DialTimeout = DefaultDialTimeout
|
|
}
|
|
|
|
// ping 时间间隔
|
|
if cfg.DialKeepAliveTime == 0 {
|
|
cfg.DialKeepAliveTime = DefaultDialKeepAliveTime
|
|
}
|
|
|
|
// ping 响应超时时间
|
|
if cfg.DialKeepAliveTimeout == 0 {
|
|
cfg.DialKeepAliveTimeout = DefaultDialKeepAliveTimeout
|
|
}
|
|
|
|
// 客户端发送的最大请求体大小
|
|
if cfg.MaxCallSendMsgSize <= 0 {
|
|
cfg.MaxCallSendMsgSize = DefaultMaxCallSendMsgSize
|
|
}
|
|
|
|
// 客户端接受的最大响应体大小
|
|
if cfg.MaxCallRecvMsgSize <= 0 {
|
|
cfg.MaxCallRecvMsgSize = DefaultMaxCallRecvMsgSize
|
|
}
|
|
var (
|
|
flagClient *clientv3.Client
|
|
err error
|
|
)
|
|
if flagClient, err = clientv3.New(cfg); nil != err {
|
|
return errors.New("etcd连接失败 : " + err.Error())
|
|
}
|
|
c.lock.Lock()
|
|
defer c.lock.Unlock()
|
|
c.table[flag] = &WrapperClient{client: flagClient}
|
|
return nil
|
|
}
|
|
|
|
// GetClient ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 12:44 2023/8/15
|
|
func (c *client) GetClient(flag string) *WrapperClient {
|
|
flagClient, _ := c.GetClientWithError(flag)
|
|
return flagClient
|
|
}
|
|
|
|
// GetClientWithError ...
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 12:44 2023/8/15
|
|
func (c *client) GetClientWithError(flag string) (*WrapperClient, error) {
|
|
c.lock.RLock()
|
|
defer c.lock.RUnlock()
|
|
if _, exist := c.table[flag]; !exist {
|
|
return nil, errors.New(flag + " client instance not found")
|
|
}
|
|
return c.table[flag], nil
|
|
}
|
|
|
|
// RemoveClient 删除client连接
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 14:37 2023/8/15
|
|
func (c *client) RemoveClient(flag string) {
|
|
c.lock.RLock()
|
|
defer c.lock.RUnlock()
|
|
if _, exist := c.table[flag]; !exist {
|
|
return
|
|
}
|
|
// 关闭连接
|
|
_ = c.table[flag].Close()
|
|
// 清除实例
|
|
delete(c.table, flag)
|
|
return
|
|
}
|