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.ClientConn
bootstrapState *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 = cc
if 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)
}