resolver.go 1.0 KB

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