manual定义了一个解析器,可用于手动将解析后的地址发送到ClientConn
除了balance中的方式,这里提供了一种更简单的注册方式

type Resolver

  1. type Resolver struct {
  2. // ResolveNowCallback is called when the ResolveNow method is called on the
  3. // resolver. Must not be nil. Must not be changed after the resolver may
  4. // be built.
  5. ResolveNowCallback func(resolver.ResolveNowOptions)
  6. // Fields actually belong to the resolver.
  7. CC resolver.ClientConn
  8. // contains filtered or unexported fields
  9. }

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

源码比较简单

  1. // NewBuilderWithScheme creates a new test resolver builder with the given scheme.
  2. func NewBuilderWithScheme(scheme string) *Resolver {
  3. return &Resolver{
  4. ResolveNowCallback: func(resolver.ResolveNowOptions) {},
  5. scheme: scheme,
  6. }
  7. }
  8. // Resolver is also a resolver builder.
  9. // It's build() function always returns itself.
  10. type Resolver struct {
  11. // ResolveNowCallback is called when the ResolveNow method is called on the
  12. // resolver. Must not be nil. Must not be changed after the resolver may
  13. // be built.
  14. ResolveNowCallback func(resolver.ResolveNowOptions)
  15. scheme string
  16. // Fields actually belong to the resolver.
  17. CC resolver.ClientConn
  18. bootstrapState *resolver.State
  19. }
  20. // InitialState adds initial state to the resolver so that UpdateState doesn't
  21. // need to be explicitly called after Dial.
  22. func (r *Resolver) InitialState(s resolver.State) {
  23. r.bootstrapState = &s
  24. }
  25. // Build returns itself for Resolver, because it's both a builder and a resolver.
  26. func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
  27. r.CC = cc
  28. if r.bootstrapState != nil {
  29. r.UpdateState(*r.bootstrapState)
  30. }
  31. return r, nil
  32. }
  33. // Scheme returns the test scheme.
  34. func (r *Resolver) Scheme() string {
  35. return r.scheme
  36. }
  37. // ResolveNow is a noop for Resolver.
  38. func (r *Resolver) ResolveNow(o resolver.ResolveNowOptions) {
  39. r.ResolveNowCallback(o)
  40. }
  41. // Close is a noop for Resolver.
  42. func (*Resolver) Close() {}
  43. // UpdateState calls CC.UpdateState.
  44. func (r *Resolver) UpdateState(s resolver.State) {
  45. r.CC.UpdateState(s)
  46. }