代码拉取完成,页面将自动刷新
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()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。