说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
代码为github.com/coreos/go-etcd/etcd
注: 此版本为k8s v1.1.1 中所使用的etcd client。
首先我看下k8s中是如何使用的。位置在k8s.io\kubernetes\cmd\kube-apiserver\app\server.go
代码目录,从这里来看,代码还是非常清晰的
那么我们就从此处入口,先看client.go
先看结构体
结构体里面,比较重要的东西
1、cluster,集群管理
2、httpclient,这个将是最终的入口
我们继续
这里面主要是初始化了cluster,httpclient
其中cluster后面再详细介绍,这里我们接着看httpclient
很明显这里就是构造了一个标准库net/http中的Client
大致的初始化很简单。其实还有一个tls的初始化。为NewTLSClient,对应的httpclient初始化为initHTTPSClient
下面我们看看etcd client都提供了那些操作。
Get操作
我们看get.go
很明显,我们看到Get调用了RawGet,而RawGet调用了get
我们再跟踪get
在request.go中
继续getCancelable
还是在request.go中
主要有NewRawRequest。request.go中
其实就是对request的一些包装,包含了一些参数
我们继续看SendRequest。这个才是整个代码的核心
在下面我们看到这里当RawRequest中的Cancel不为nil的时候,会启动一个协程来接收cancel消息。 但目前我们分析的Get是没有设置的
我们继续这里有个for循环,attempt为尝试次数统计,当成功则会退出for循环,失败则会继续尝试。其中有个变量为httpPath是个关键
我们现在跟进去看看 requet.go中
我们看到了cluster,我们继续跟进去看看
从上面的cluster的代码来看其实pick就是返回cluster中的一台主机,而pick的机器则是一个随机的主机,在初始化的时候有随机,在failure的时候,又会重新随机
我们回到之前的sendrequest
这里主要的地方就是构造一个标准库net/http中的Request
再继续
我们看到我们之前提到的httpclient,接收刚刚构建的Request,然后Do。就是发起了http的请求。
进行校验头部,如果是正常的,则退出for循环
退出for循环之后,返回了一个RawResponse结构体
最后我们返回到
我们看到了结果
其实就是一个解码的过程
至此Get操作就解析完了
还有一些操作如:
AddChildDir
其实跟踪进去,最后也是到了SendRequest函数中
还有一些其他的操作,就不一一介绍了,其代码的流程是基本一致的。