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  }