resolver.go 998 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package resolver
  2. import (
  3. "zero/core/discov"
  4. "google.golang.org/grpc/resolver"
  5. )
  6. type discovResolver struct {
  7. scheme string
  8. etcd discov.EtcdConf
  9. cc resolver.ClientConn
  10. }
  11. func (r *discovResolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (
  12. resolver.Resolver, error) {
  13. sub, err := discov.NewSubscriber(r.etcd.Hosts, r.etcd.Key)
  14. if err != nil {
  15. return nil, err
  16. }
  17. sub.AddListener(func() {
  18. vals := sub.Values()
  19. var addrs []resolver.Address
  20. for _, val := range vals {
  21. addrs = append(addrs, resolver.Address{
  22. Addr: val,
  23. })
  24. }
  25. r.cc.UpdateState(resolver.State{
  26. Addresses: addrs,
  27. })
  28. })
  29. return r, nil
  30. }
  31. func (r *discovResolver) Close() {
  32. }
  33. func (r *discovResolver) ResolveNow(options resolver.ResolveNowOptions) {
  34. }
  35. func (r *discovResolver) Scheme() string {
  36. return r.scheme
  37. }
  38. func RegisterResolver(scheme string, etcd discov.EtcdConf) {
  39. resolver.Register(&discovResolver{
  40. scheme: scheme,
  41. etcd: etcd,
  42. })
  43. }