gitee.com/h79/goutils@v1.22.10/discovery/resolver/grpc/builder.go (about) 1 package grpc 2 3 import ( 4 "fmt" 5 "gitee.com/h79/goutils/common/logger" 6 "gitee.com/h79/goutils/discovery/resolver/builder" 7 grpcresolver "google.golang.org/grpc/resolver" 8 ) 9 10 // priBuilder 为grpc桥接 11 type priBuilder struct { 12 myBuilder builder.Builder 13 } 14 15 func Register(builder builder.Builder) { 16 b := &priBuilder{ 17 myBuilder: builder, 18 } 19 20 // 注册到GRPC中 21 grpcresolver.Register(b) 22 } 23 24 // Build 25 // grpc interface 26 func (cb *priBuilder) Build(target grpcresolver.Target, 27 cc grpcresolver.ClientConn, opts grpcresolver.BuildOptions) (grpcresolver.Resolver, error) { 28 29 if cc == nil { 30 return nil, fmt.Errorf("GRPC: client connect is nil") 31 } 32 logger.Info("GRPC: Build target: %+v", target) 33 34 // - "dns://some_authority/foo.bar" 35 // Target{Scheme: "dns", Authority: "some_authority", Endpoint: "foo.bar"} 36 // - "foo.bar" 37 // Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "foo.bar"} 38 // - "unknown_scheme://authority/endpoint" 39 // Target{Scheme: resolver.GetDefaultScheme(), Endpoint: "unknown_scheme://authority/endpoint"} 40 endpoints := target.URL.Path 41 if len(endpoints) <= 0 { 42 endpoints = target.URL.Opaque 43 } 44 tar := builder.Target{ 45 Scheme: target.URL.Scheme, 46 Authority: target.URL.Host, 47 Endpoint: endpoints, 48 } 49 50 cr := &connector{ 51 cc: cc, 52 } 53 54 rr, err := cb.myBuilder.Build(tar, cr) 55 if err != nil { 56 return nil, err 57 } 58 59 return &priResolver{myResolver: rr}, nil 60 } 61 62 // Scheme 63 // grpc interface 64 func (cb *priBuilder) Scheme() string { 65 return cb.myBuilder.Scheme() 66 } 67 68 type priResolver struct { 69 myResolver builder.Resolver 70 } 71 72 func (cr *priResolver) ResolveNow(grpcresolver.ResolveNowOptions) { 73 cr.myResolver.ResolveNow() 74 } 75 76 func (cr *priResolver) Close() { 77 cr.myResolver.Close() 78 }