manual定义了一个解析器,可用于手动将解析后的地址发送到ClientConn
除了balance中的方式,这里提供了一种更简单的注册方式
type Resolver
type Resolver struct {// ResolveNowCallback is called when the ResolveNow method is called on the// resolver. Must not be nil. Must not be changed after the resolver may// be built.ResolveNowCallback func(resolver.ResolveNowOptions)// Fields actually belong to the resolver.CC resolver.ClientConn// contains filtered or unexported fields}
func NewBuilderWithScheme(scheme string) *Resolver
func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error)
- Build为解析器返回自身,因为它既是一个构建器也是一个解析器
- 这个函数其实啥有没做,只负责将InitialState的s做一个UpdateState
func (*Resolver) Close() Resolver的空实现
func (r *Resolver) InitialState(s resolver.State)
- InitialState向解析器添加初始状态,这样就不需要在拨号后显式调用UpdateState
- 源码比较简单,可以看出NewBuilderWithScheme后,再调用InitialState就可以实现手动解析了
func (r *Resolver) ResolveNow(o resolver.ResolveNowOptions) Resolver的空实现
func (r *Resolver) Scheme() string 返回scheme
func (r *Resolver) UpdateState(s resolver.State) UpdateState会调用CC.UpdateState
源码比较简单
// NewBuilderWithScheme creates a new test resolver builder with the given scheme.func NewBuilderWithScheme(scheme string) *Resolver {return &Resolver{ResolveNowCallback: func(resolver.ResolveNowOptions) {},scheme: scheme,}}// Resolver is also a resolver builder.// It's build() function always returns itself.type Resolver struct {// ResolveNowCallback is called when the ResolveNow method is called on the// resolver. Must not be nil. Must not be changed after the resolver may// be built.ResolveNowCallback func(resolver.ResolveNowOptions)scheme string// Fields actually belong to the resolver.CC resolver.ClientConnbootstrapState *resolver.State}// InitialState adds initial state to the resolver so that UpdateState doesn't// need to be explicitly called after Dial.func (r *Resolver) InitialState(s resolver.State) {r.bootstrapState = &s}// Build returns itself for Resolver, because it's both a builder and a resolver.func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {r.CC = ccif r.bootstrapState != nil {r.UpdateState(*r.bootstrapState)}return r, nil}// Scheme returns the test scheme.func (r *Resolver) Scheme() string {return r.scheme}// ResolveNow is a noop for Resolver.func (r *Resolver) ResolveNow(o resolver.ResolveNowOptions) {r.ResolveNowCallback(o)}// Close is a noop for Resolver.func (*Resolver) Close() {}// UpdateState calls CC.UpdateState.func (r *Resolver) UpdateState(s resolver.State) {r.CC.UpdateState(s)}
