k8s源码分析------第三方库etcd client分析

说明:此文章为腾讯云机器自动从本人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函数中

还有一些其他的操作,就不一一介绍了,其代码的流程是基本一致的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏地方网络工作室的专栏

Shell 命令行批量处理图片文件名

Shell 命令行批量处理图片文件名 从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的。并且文件名有长有短,很是糟心。因此,我想把这些文件给全部整...

26410
来自专栏www.96php.cn

[ecshop模板]ecshop会员中心点击查询包裹报错修改方法

会员中心中点击跟踪包裹,显示链接错误。您是否遇到过这个问题呢,修改方法其实很简单,操作如下: ? 修改themes/68ecshop_XXX/user_tran...

2944
来自专栏友弟技术工作室

文件同步rsync

rsync 远程同步 rsync(remote sync) 备份 完全备份 增量备份(差异备份) rsync 优点: 支持增量备份 选择性保持:符号链接,...

5439
来自专栏维C果糖

详述 IntelliJ IDEA 中恢复代码的方法

在咱们正常开发项目的时候,难免遇到在开发过程中由于某种原因,想要将代码恢复到前一版本的情景。特别是在咱们删除了某些代码,想要恢复之前删除的代码的时候,了解这个在...

1938
来自专栏java一日一条

Java Socket 编程原理及教程

对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进...

521
来自专栏编程

Java从入门到放弃

1,http是什么(超文本传输协议)? hypertext transfer protocol由w3c制订的一种网络应用层协议,它规定了浏览器与web服务器之...

1925
来自专栏24K纯开源

使用Qt installer framework制作安装包

一、介绍     使用Qt库开发的应用程序,一般有两种发布方式: (1)静态编译发布。这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中。其优...

2558
来自专栏上善若水

016 进程内缓存和进程外缓存的对比

在java应用中,对于访问频率比较高,又不怎么变化的数据,常用的解决方案是把这些数据加入缓存。相比DB,缓存的读取效率快好不少。java应用缓存一般分两种,一是...

1373
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数

在java程序与数据库连接的编程中,mysql jdbc url格式如下: jdbc:mysql://[host:port],[host:port].../[d...

2765
来自专栏Rgc

redis权限认证及登录

881

扫码关注云+社区