etcd源码分析 - 0.搭建学习etcd的环境

简介: 如果要更深入地研究etcd,就需要我们涉及到源码、并结合实践进行学习。那么,接下来,我将基于`v3.4`这个版本,做一期深入的环境搭建。

之前,我在b站视频简单地讲述了etcd的功能与特性,有兴趣的可以参考相关视频

但如果要更深入地研究etcd,就需要我们涉及到源码、并结合实践进行学习。那么,接下来,我将基于v3.4这个版本,做一期深入的环境搭建。

环境准备

  1. Macbook - 为了方便读代码与编译运行,也可自行搭建Ubuntu等可视化系统
  2. Go语言 - v1.17,我选用的是v1.17.11
  3. Goland/VSCode
  4. etcd源码 - 建议用Github Desktop进行下载

基本调试

为了保证etcd可运行,我们先在根目录上运行go mod tidy,保证依赖库没有问题。

接着,我们阅读Makefile文件,发现其提供了make build指令。运行后,在bin目录下生成了etcd/etcdctl/etcdutl三个可执行文件,并且打印出了版本信息。

./bin/etcd --version
etcd Version: 3.4.18
Git SHA: c2c9e7de0
Go Version: go1.17.11
Go OS/Arch: darwin/amd64
./bin/etcdctl version
etcdctl version: 3.4.18
API version: 3.4

我们暂时只关注etcdetcdctl,可以简单地将两者理解为服务端与客户端。我们分别在两个终端进行操作:

# 运行etcd server
./bin/etcd
# 写入一个key
./bin/etcdctl put mykey "this is awesome"

# 读取一个key
./bin/etcdctl get mykey

如果你能读取到对应的信息,那么就证明整个环境已经很好地运行起来了。

从Makefile看Go的编译步骤

在日常开发的过程中,我们对Go程序的编译往往只是一行简单的go build,但在大型工程中往往还不够。我们看看etcd做了什么。

GIT_SHA

GIT_SHA=$(git rev-parse --short HEAD || echo "GitNotFound")
GO_LDFLAGS="$GO_LDFLAGS -X ${REPO_PATH}/version.GitSHA=${GIT_SHA}"

这个参数是取git最新一次的commit的短hash,用来标识源码的版本,比如c2c9e7de0。

然后,将这个相对唯一的值,作为GO_LDFLAGS中的一个参数,打入到go程序中。

ldflags

在Makefile中的编译里,我们会用到-ldflags "$GO_LDFLAGS"这个参数。通过运行go help build,可以看到这么一段说明:

 -ldflags '[pattern=]arg list'
                arguments to pass on each go tool link invocation.

也就是用key=value对的格式,将想要的信息传递给Go程序。

ldflags可以记忆为 load flags,即将标记信息加载到程序中。

传递ldflags中的参数

ldflags传递参数的方式是 package_path.variable_name=new_value

以示例中的build为例,这个值为go.etcd.io/etcd/version.GitSHA=${GIT_SHA},对应到三块:

  1. package_path = go.etcd.io/etcd/version
  2. variable_name = GitSHA
  3. new_value = ${GIT_SHA}

所以,这里所做的就是将go.etcd.io/etcd/version这个package下的GitSHA变量替换为想要的值。我们去对应的代码里看,发现对应的代码:

var (
    // MinClusterVersion is the min cluster version this etcd binary is compatible with.
    MinClusterVersion = "3.0.0"
    Version           = "3.4.18"
    APIVersion        = "unknown"

    // Git SHA Value will be set during build
    GitSHA = "Not provided (use ./build instead of go build)"
)

所以,我们可以通过编译脚本实现代码中变量的替换。

小结

etcd的学习环境搭建并不复杂,主要是有一台Mac电脑。接下来,我们将逐步开始一起阅读代码。

目录
相关文章
Java中整数(负数)的二进制表示
Java中整数(负数)的二进制表示
|
IDE Go 开发工具
etcd源码分析 - 5.【打通核心流程】EtcdServer消息的处理函数
在上一讲,我们梳理了`EtcdServer`的关键函数`processInternalRaftRequestOnce`里的四个细节。 其中,`wait.Wait`组件使用里,我们还遗留了一个细节实现,也就是请求的处理结果是怎么通过channel返回的。
203 0
etcd源码分析 - 5.【打通核心流程】EtcdServer消息的处理函数
|
运维
ETCD系列之一:简介
本文介绍etcd使用场景,工作原理。
77050 4
|
12月前
|
安全 网络协议 网络安全
DDoS攻击的模式
【10月更文挑战第13天】DDoS攻击的模式
455 12
|
SQL 安全 Java
golang为什么不支持可重入锁?
本文对比分析了Java与Go语言中锁机制的不同。在Java中,无论是`synchronized`关键字还是`ReentrantLock`都支持可重入特性,通过维护一个计数器来跟踪锁的嵌套级别,确保同一线程可以多次获取同一把锁而不会造成死锁。然而,Go语言的`sync.Mutex`并不支持这一特性,其设计理念认为可重入锁往往指向代码设计问题,鼓励开发者重构代码以避免此类需求。文章进一步解释了这种设计理念背后的原因,并提供了替代方案示例。总体而言,Go语言试图从设计层面避免潜在的代码问题,尽管这可能会增加一定的开发复杂性。
295 3
golang为什么不支持可重入锁?
|
Kubernetes 监控 容器
etcd源码分析 - 1.【打通核心流程】etcd server的启动流程
在第一阶段,我将从主流程出发,讲述一个`PUT`指令是怎么将数据更新到`etcd server`中的。今天,我们先来看看server是怎么启动的。
302 0
|
关系型数据库 Linux 数据库
【玩转PGSQL】源码安装 pgsql
【玩转PGSQL】源码安装 pgsql
|
存储 Cloud Native NoSQL
etcd 的简介以及发展历史
## 一、简介 etcd 是一个开源、分布式、一致性的键值存储系统。它是由 CoreOS(后来被 Red Hat 收购)开发的,旨在提供一个可靠的分布式协调服务。etcd 通常用于在分布式系统中进行配置管理、服务发现、分布式锁、选举等任务。 etcd 的特点包括: - **分布式一致性**:基于 Raft 共识算法,etcd 确保数据在分布式环境中的一致性和可靠性。 - **键值存储**:提供类似于 NoSQL 数据库的键值对存储功能。 - **高可用性**:通过多节点部署、自动故障转移等方式提高服务的可用性。 - **易于使用**:提供简单的 HTTP 和 gRPC API 进行数据操
303 1
|
存储 关系型数据库 MySQL
C语言/C++实战项目雷霆飞机(代码改进)
C语言/C++实战项目雷霆飞机(代码改进)
136 1
|
XML 安全 Java
如何开发微信公众号后台
如何开发微信公众号后台
456 0