使用kitex v0.9.1版本
用法
以etcd为例
r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
panic(err)
}
cli, err = service.NewClient(
serviceName,
client.WithResolver(r),
)
源码解析
withReslover
可以看到NewClient之后Reslover最后被放到了kClient中的opt里面
以etcd为例,服务发现的关键代码如上,服务发现是依赖于network、address、tags等实现的
reslover的使用
接下来我们一一看一下哪里使用了这个reslover
第一处
可以发现负载均衡的时候也使用到了resolver
第二处
第二处使用到resolver的地方是proxy
middlewares
在mdw初始化的时候会把lbf也注册进去。
- WithResolver接收参数添加到ops中,初始化时NewBalancerFactory赋值给kClient.lbf
- kClient.lbf通过newResolveMWBuilder添加到kClient.mws,
- kClient.mws到endpoint.Endpoint,待后续 RPC 调用时顺序执行
- lbf.Get(ctx, dest)得到负载均衡器
- lb.GetPicker()从负载均衡器得到一个实例选择算法,默认是负载均衡算法
- Picker.Next则是实例选择具体的算法执行,拿到具体的一个服务实例