Ai
1 Star 0 Fork 0

monobytes/gcore

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
builder.go 2.05 KB
一键复制 编辑 原始数据 按行查看 历史
null 提交于 2025-01-22 18:29 +08:00 . first commit
package discovery
import (
"context"
"gitee.com/monobytes/gcore/gcluster"
"gitee.com/monobytes/gcore/glog"
"gitee.com/monobytes/gcore/gregistry"
cli "github.com/smallnest/rpcx/client"
"net/url"
"sync"
"time"
)
const scheme = "discovery"
const defaultTimeout = 10 * time.Second
type Builder struct {
dis gregistry.Discovery
ctx context.Context
cancel context.CancelFunc
watcher gregistry.Watcher
rw sync.RWMutex
instances []*gregistry.ServiceInstance
resolvers map[string]*Resolver
}
func NewBuilder(dis gregistry.Discovery) *Builder {
b := &Builder{}
b.dis = dis
b.ctx, b.cancel = context.WithCancel(context.Background())
b.resolvers = make(map[string]*Resolver)
if err := b.init(); err != nil {
glog.Fatalf("init client builder failed: %v", err)
}
go b.watch()
return b
}
func (b *Builder) Scheme() string {
return scheme
}
func (b *Builder) Build(target *url.URL) (cli.ServiceDiscovery, error) {
r := newResolver(b, target.Host)
b.rw.Lock()
instances := b.instances
b.resolvers[target.Host] = r
b.rw.Unlock()
r.updateInstances(instances)
return r, nil
}
func (b *Builder) init() error {
ctx, cancel := context.WithTimeout(b.ctx, defaultTimeout)
services, err := b.dis.Services(ctx, gcluster.Mesh.String())
cancel()
if err != nil {
return err
}
ctx, cancel = context.WithTimeout(b.ctx, defaultTimeout)
watcher, err := b.dis.Watch(ctx, gcluster.Mesh.String())
cancel()
if err != nil {
return err
}
b.watcher = watcher
b.updateInstances(services)
return nil
}
func (b *Builder) watch() {
for {
select {
case <-b.ctx.Done():
return
default:
// exec watch
}
instances, err := b.watcher.Next()
if err != nil {
continue
}
b.updateInstances(instances)
}
}
func (b *Builder) updateInstances(instances []*gregistry.ServiceInstance) {
b.rw.Lock()
defer b.rw.Unlock()
b.instances = instances
for _, r := range b.resolvers {
r.updateInstances(instances)
}
}
func (b *Builder) removeResolver(servicePath string) {
b.rw.Lock()
delete(b.resolvers, servicePath)
b.rw.Unlock()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/monobytes/gcore.git
git@gitee.com:monobytes/gcore.git
monobytes
gcore
gcore
v1.0.1

搜索帮助