1 Star 0 Fork 0

东海苍月/etcd_service_discovery

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
discovery.go 2.18 KB
一键复制 编辑 原始数据 按行查看 历史
东海苍月 提交于 2021-08-05 15:30 +08:00 . 移除日志记录
package discovery
import (
"context"
"fmt"
"sync"
"time"
"go.etcd.io/etcd/api/v3/mvccpb"
clientv3 "go.etcd.io/etcd/client/v3"
)
// ServiceDiscovery 服务发现
type ServiceDiscovery struct {
cli *clientv3.Client // etcd client
serverList map[string]string // 服务列表
mtx sync.Mutex
}
// NewServiceDiscovery 新建发现服务
func NewServiceDiscovery(endpoints []string) *ServiceDiscovery {
cli, err := clientv3.New(clientv3.Config{
Endpoints: endpoints,
DialTimeout: 5 * time.Second,
})
if err != nil {
panic(fmt.Errorf("new service discovery err:%v", err))
}
return &ServiceDiscovery{
cli: cli,
serverList: make(map[string]string),
}
}
// WatchService 初始化服务列表和监视
func (s *ServiceDiscovery) WatchService(prefix string) error {
// 根据前缀获取现有的key
resp, err := s.cli.Get(context.Background(), prefix, clientv3.WithPrefix())
if err != nil {
return err
}
for _, ev := range resp.Kvs {
s.SetServiceList(string(ev.Key), string(ev.Value))
}
// 监视前缀,修改变更的server
go s.watcher(prefix)
return nil
}
// watcher 监听前缀
func (s *ServiceDiscovery) watcher(prefix string) {
watchChan := s.cli.Watch(context.Background(), prefix, clientv3.WithPrefix())
for watch := range watchChan {
for _, ev := range watch.Events {
switch ev.Type {
case mvccpb.PUT: // 修改或者新增
s.SetServiceList(string(ev.Kv.Key), string(ev.Kv.Value))
case mvccpb.DELETE: // 删除
s.DelServiceList(string(ev.Kv.Key))
}
}
}
}
// SetServiceList 新增服务地址
func (s *ServiceDiscovery) SetServiceList(key, val string) {
s.mtx.Lock()
defer s.mtx.Unlock()
s.serverList[key] = val
}
// DelServiceList 删除服务地址
func (s *ServiceDiscovery) DelServiceList(key string) {
s.mtx.Lock()
defer s.mtx.Unlock()
delete(s.serverList, key)
fmt.Printf("del key:%s", key)
}
// GetServices 获取服务地址
func (s *ServiceDiscovery) GetServices() []string {
s.mtx.Lock()
defer s.mtx.Unlock()
addrs := make([]string, 0)
for _, v := range s.serverList {
addrs = append(addrs, v)
}
return addrs
}
// Close 关闭服务
func (s *ServiceDiscovery) Close() error {
return s.cli.Close()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/dhcy/etcd_service_discovery.git
git@gitee.com:dhcy/etcd_service_discovery.git
dhcy
etcd_service_discovery
etcd_service_discovery
v0.1.0

搜索帮助