openWebSF 包含两种版本的服务发现与负载均衡:
1: 老版本的
2. experimental API 版本的
详情见github: https://github.com/ybdx/openWebSF
客户端链接方式:
grpc.DialContext -> newCCResolverWrapper -> Build(这个是resolver的build) -> r.cc.NewAddress -> ccr.cc.handleResolvedAddrs -> newCCBalancerWrapper -> ccb.watcher() and Build(这个是balancer的build)
下面将详细解释:
首先,看拨号函数 DialContext:
func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) {
cc := &ClientConn{
target: target,
csMgr: &connectivityStateManager{},
conns: make(map[*addrConn]struct{}),
dopts: defaultDialOptions(),
blockingpicker: newPickerWrapper(),
czData: new(channelzData),
firstResolveEvent: grpcsync.NewEvent(),
}
...
// 初始化opt
...
// 设置resolver, 判断使用哪种resolver是通过注册地址前面的scheme来决定的
if cc.dopts.resolverBuilder == nil {
// Only try to parse target when resolver builder is not already set.
cc.parsedTarget = parseTarget(cc.target)
grpclog.Infof("parsed scheme: %q", cc.parsedTarget.Scheme)
cc.dopts.resolverBuilder = resolver.Get(cc.parsedTarget.Scheme)
if cc.dopts.resolverBuilder == nil {
// If resolver builder is still nil, the parse target's scheme is
// not registered. Fallback to default resolver and set Endpoint to
// the original unparsed target.
grpclog.Infof("scheme %q not registered, fallback to default scheme