mirror of
https://github.com/zhufuyi/sponge.git
synced 2025-10-05 16:57:07 +08:00
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
// Package resolve is setting grpc client-side load balancing policy.
|
|
package resolve
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"sync"
|
|
|
|
"google.golang.org/grpc/resolver"
|
|
)
|
|
|
|
var mutex = &sync.Mutex{}
|
|
|
|
// Register address and serviceName
|
|
func Register(scheme string, serviceName string, address []string) string {
|
|
mutex.Lock()
|
|
defer mutex.Unlock()
|
|
|
|
endpoint := fmt.Sprintf("%s:///%s", scheme, serviceName)
|
|
u, _ := url.Parse(endpoint)
|
|
|
|
resolver.Register(&ResolverBuilder{
|
|
scheme: scheme,
|
|
serviceName: serviceName,
|
|
addrs: address,
|
|
path: u.Path,
|
|
})
|
|
|
|
return endpoint
|
|
}
|
|
|
|
// ResolverBuilder resolver struct
|
|
type ResolverBuilder struct {
|
|
scheme string
|
|
serviceName string
|
|
addrs []string
|
|
path string
|
|
}
|
|
|
|
// Build resolver
|
|
func (r *ResolverBuilder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) {
|
|
blr := &blResolver{
|
|
target: target,
|
|
cc: cc,
|
|
addrsStore: map[string][]string{
|
|
r.path: r.addrs,
|
|
},
|
|
}
|
|
blr.start()
|
|
return blr, nil
|
|
}
|
|
|
|
// Scheme get scheme
|
|
func (r *ResolverBuilder) Scheme() string {
|
|
return r.scheme
|
|
}
|
|
|
|
type blResolver struct {
|
|
target resolver.Target
|
|
cc resolver.ClientConn
|
|
addrsStore map[string][]string
|
|
}
|
|
|
|
func (b *blResolver) start() {
|
|
addrStrs := b.addrsStore[b.target.URL.Path]
|
|
addrs := make([]resolver.Address, len(addrStrs))
|
|
for i, s := range addrStrs {
|
|
addrs[i] = resolver.Address{Addr: s}
|
|
}
|
|
_ = b.cc.UpdateState(resolver.State{Addresses: addrs})
|
|
}
|
|
|
|
// ResolveNow Resolve now
|
|
func (*blResolver) ResolveNow(_ resolver.ResolveNowOptions) {}
|
|
|
|
// Close resolver
|
|
func (*blResolver) Close() {}
|