// value 是当前服务的地址 _, err = client.Put(client.Ctx(), p.fullKey, p.value, clientv3.WithLease(lease))
client
在 grpc.DialContext 函数中会调用 newCCResolverWrapper 函数
1 2 3 4 5 6 7 8 9 10 11 12
// newCCResolverWrapper uses the resolver.Builder to build a Resolver and // returns a ccResolverWrapper object which wraps the newly built resolver. // rb 和 scheme 有关 funcnewCCResolverWrapper(cc *ClientConn, rb resolver.Builder) (*ccResolverWrapper, error) { // .... // build ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, rbo) if err != nil { returnnil, err } return ccr, nil }
build 接口
1 2 3 4 5 6 7 8 9 10 11
// Builder creates a resolver that will be used to watch name resolution updates. type Builder interface { // Build creates a new resolver for the given target. // // gRPC dial calls Build synchronously, and fails if the returned error is // not nil. Build(target Target, cc ClientConn, opts BuildOptions) (Resolver, error) // Scheme returns the scheme supported by this resolver. // Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md. Scheme() string }
resolver 接口
1 2 3 4 5 6 7 8 9 10 11
// Resolver watches for the updates on the specified target. // Updates include address updates and service config updates. type Resolver interface { // ResolveNow will be called by gRPC to try to resolve the target name // again. It's just a hint, resolver can ignore this if it's not necessary. // // It could be called multiple times concurrently. ResolveNow(ResolveNowOptions) // Close closes the resolver. Close() }