add registry base interface, mdns, noop implementations, add resolver, client

This commit is contained in:
2020-11-08 19:28:33 +01:00
parent 87b947cea3
commit 9f5f03b862
29 changed files with 4341 additions and 41 deletions

86
resolver/resolver.go Normal file
View File

@ -0,0 +1,86 @@
package resolver
import (
"strings"
"google.golang.org/grpc/resolver"
"gitlab.bertha.cloud/partitio/lab/grpc/registry"
)
func New(reg registry.Registry) resolver.Builder {
return &builder{reg: reg}
}
type builder struct {
reg registry.Registry
}
func (r builder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
rslvr := &resolvr{reg: r.reg, target: target, cc: cc}
go rslvr.run()
return rslvr, nil
}
func (r builder) Scheme() string {
return r.reg.String()
}
type resolvr struct {
reg registry.Registry
target resolver.Target
cc resolver.ClientConn
addrs []resolver.Address
}
func (r *resolvr) run() {
if r.reg.String() == "noop" {
return
}
var name, version string
parts := strings.Split(r.target.Endpoint, ":")
name = parts[0]
if len(parts) > 1 {
version = parts[1]
}
svc, err := r.reg.GetService(name)
if err != nil {
return
}
for _, v := range svc {
if v.Name != name || v.Version != version {
continue
}
for _, vv := range v.Nodes {
r.addrs = append(r.addrs, resolver.Address{Addr: vv.Address})
}
}
r.cc.UpdateState(resolver.State{Addresses: r.addrs})
w, err := r.reg.Watch(registry.WatchService(r.target.Endpoint))
if err != nil {
return
}
defer w.Stop()
for {
res, err := w.Next()
if err != nil {
return
}
// TODO(adphi): implement
switch res.Action {
case "create":
case "delete":
}
r.cc.UpdateState(resolver.State{Addresses: r.addrs})
}
}
func (r *resolvr) ResolveNow(options resolver.ResolveNowOptions) {
if r.reg.String() == "noop" {
r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint}}})
}
}
func (r *resolvr) Close() {}