基于zookeeper和grpc的服务注册与发现(go)

本文介绍了如何使用Zookeeper和gRPC进行服务注册与发现,重点讲解了在Go中实现的openWebSF项目,该项目包含老版本和experimental API版本的服务发现。在老版本中,通过DialContext函数处理服务地址,如果是注册中心地址,则在balancer中进行地址发现。而在实验性API版本中,直接在resolver Build阶段实现ZK客户端和服务发现。详细步骤和代码示例可在GitHub项目中查看。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值