etcd/init.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
}