etcd3.5.1-clientv3部署实践

1.基本介绍

本文讲解如何使用etcd自带的clientv3连接服务端并使用,以及C++的相关调用,适合新手参考。

选用etcd的最新版本3.5.1(2021年10月15日发布),etcd3.5版本更新内容的介绍可参考这篇文章:

一篇文章带你搞懂 etcd 3.5 的核心特性

摘自这篇文章,在etcd3.5版本中,重大的改动如下:

首先,在我看来,在etcd 3.5版本,最令开发者期待的当属对 Go Module 的版本号语义的支持,并将之前大的 etcd 模块按功能进行了拆分,实现了 etcd 的模块化等,解决了饱受社区吐槽的 “go get fail”、依赖复杂、循环依赖、强制依赖过低的 gRPC 版本等痛点,将大大提升 etcd 开发者幸福度。

其次,从性能及稳定性上看,etcd 3.5版本包含了若干对etcd读写性能优化、启动耗时优化、重要 Bug修复、内存占用优化等特性,将显著提升集群稳定性、吞吐量、延时,将更好的支撑大规模 kubernetes 集群。

最后,从运维、安全上,etcd 3.5 版本包含了 etcd 日志轮转/压缩、集群降级、etcdutl、expensive request定位、本地 trace 及分布式 trace OpenTelemetry 等特性支持,以及一系列安全问题优化,将显著提升问题定位效率。

由此可见,etcd3.5在易用性、性能、可维护性上都得到了比较高的提升,能够大大降低二次开发的难度。

首先来部署安装必要的工具,go和git。为了支持go module,go选用1.16版本,git选用最新版本。

本次测试选用的操作系统是win10,CentOS7.4。

2.golang1.16部署安装

在golang官网下载:https://golang.google.cn/dl/

在这里插入图片描述

2.1windows环境

windows环境下载msi直接安装,安装完毕后,可以看到默认添加了如下环境变量(选择安装在E盘):

GOPATH:%USERPROFILE%\go
PATH中添加了一项:E:\Program Files\Go\bin

对环境变量做一些调整,调整后如下:

GOPATH: D:\3rd\go\download
GOROOT:E:\Program Files\Go
GOPROXY: https://goproxy.cn
PATH不调整

GOPATH指向go get下载内容的存储目录可自行定义,GOROOT指向安装根目录,GOPROXY指向代理服务器提高下载速度。

打开cmd,执行go version,看到版本号:

C:\Users\Thinkpad>go version
go version go1.16.12 windows/amd64
C:\Users\Thinkpad>

执行go env,查看go相关环境变量:

C:\Users\Thinkpad>go env
set GO111MODULE=auto
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Thinkpad\AppData\Local\go-build
set GOENV=C:\Users\Thinkpad\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\3rd\go\download\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\3rd\go\download
set GOPRIVATE=
set GOPROXY=https://goproxy.cn
set GOROOT=E:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=E:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.16.12
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\Thinkpad\AppData\Local\Temp\go-build3385456369=/tmp/go-build -gno-record-gcc-switches

C:\Users\Thinkpad>

可以看到默认开启了GO111MODULE,以及GOPATH、GOROOT、GOPROXY的相关设置是正确的。

2.2Linux环境

将压缩包go1.16.12.linux-amd64.tar.gz上传到/usr/local目录,解压,得到/usr/local/go目录。在/usr/local下创建goget目录。增加如下环境变量并使其生效:

export GOROOT=/usr/local/go
export GOPATH=/usr/local/goget
export GOBIN=/usr/local/go/bin
export GOPROXY=https://goproxy.cn
export PATH=$PATH:$GOBIN

测试go版本号及环境变量:

[root@localhost go]# go version
go version go1.16.12 linux/amd64
[root@localhost go]# go env
GO111MODULE="auto"
GOARCH="amd64"
GOBIN="/usr/local/go/bin"
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/usr/local/goget/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/usr/local/goget"
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.12"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1040893730=/tmp/go-build -gno-record-gcc-switches"
[root@localhost go]# 

3.git部署安装

在git官网下载:https://www.git-scm.com/downloads

在这里插入图片描述

3.1Windows环境

下载得到Git-2.34.1-64-bit.exe,直接运行安装即可。安装完毕后,可以看到默认添加了如下环境变量(选择安装在E盘):

PATH中添加了一项:E:\Program Files\Git\cmd

打开cmd,执行git version,看到版本号:

C:\Users\Thinkpad>git version
git version 2.34.1.windows.1
C:\Users\Thinkpad>

3.2Linux环境

git官网推荐使用yum自动安装git,在终端执行命令yum install git即可。

安装完毕后,测试git版本号:

[root@localhost go]# git version
git version 1.8.3.1
[root@localhost go]# 

4.etcd3.5.1-clientv3

从github上下载etcd最新版本3.5.1的源码包:https://github.com/etcd-io/etcd/releases

在这里插入图片描述

4.1Windows环境

解压到D:\3rd\go\download\src\go.etcd.io目录下(此目录为手动根据GOPATH所在目录创建),并将文件夹etcd-3.5.1重命名为etcd。

由于etcd3.5以后进行了模块拆分,因此我们只需要下载clientv3相关的依赖即可。

进入到D:\3rd\go\download\src\go.etcd.io\etcd\client\v3目录下,看到有一个README.md的文档以及go.mod文件。README.md中描述了使用go get下载依赖包的命令及代码示例,go.mod中定义了包依赖关系。

在go get之前穿插一个小操作,否则下载依赖包时会报个小错:

D:\3rd\go\download\src\go.etcd.io\etcd\tests\integration\clientv3\examples目录下所有文件拷贝到

D:\3rd\go\download\src\go.etcd.io\etcd\client\v3目录下替换。

打开cmd,进入D:\3rd\go\download\src\go.etcd.io\etcd\client\v3目录目录。

执行命令:go get go.etcd.io/etcd/client/v3

C:\Users\Thinkpad>d:
D:\>cd D:\3rd\go\download\src\go.etcd.io\etcd\client\v3
D:\3rd\go\download\src\go.etcd.io\etcd\client\v3>go get go.etcd.io/etcd/client/v3
go: downloading go.uber.org/zap v1.17.0
go: downloading google.golang.org/grpc v1.38.0
go: downloading github.com/gogo/protobuf v1.3.2
go: downloading github.com/golang/protobuf v1.5.2
go: downloading google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
go: downloading github.com/coreos/go-semver v0.3.0
go: downloading github.com/coreos/go-systemd/v22 v22.3.2
go: downloading go.uber.org/atomic v1.7.0
go: downloading go.uber.org/multierr v1.6.0
go: downloading golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4
go: downloading google.golang.org/protobuf v1.26.0
go: downloading golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
go: downloading golang.org/x/text v0.3.5

D:\3rd\go\download\src\go.etcd.io\etcd\client\v3

等待片刻,依赖包全部下载完成,并存储在D:\3rd\go\download\pkg目录下。

D:\3rd\go\download\pkg\mod目录下的所有文件夹拷贝到D:\3rd\go\download\src目录下。同时需要将这些文件夹下目录名称中的版本号去掉,否则编译代码时会报错,找不到对应目录。

例如:

D:\3rd\go\download\src\github.com\coreos\go-semver@v0.3.0需要重命名为

D:\3rd\go\download\src\github.com\coreos\go-semver

D:\3rd\go\download\src\github.com\gogo\protobuf@v1.3.2需要重命名为

D:\3rd\go\download\src\github.com\gogo\protobuf

依此类推,所有文件夹名称中的@版本号部分全部去掉。

在此提供一个处理后的src包供直接使用,可以跳过本节之前的所有步骤。请在资源里下载。下载链接:https://download.csdn.net/download/tianwaimmmm/72280458

接下来编写一个连接etcd服务端的代码例子。

新建D:\3rd\go\download\proj\src\main目录,在此目录下新建一个mian.go文件,代码如下:

package main

import clientv3 "go.etcd.io/etcd/client/v3"
import "time"
import "fmt"

func main() {
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		fmt.Println("Error!")
	}
	defer cli.Close()
	fmt.Println("conn end")
}

打开cmd,进入到D:\3rd\go\download\proj\src\main目录,编译main.go并执行:

C:\Users\Thinkpad>d:
D:\>cd D:\3rd\go\download\proj\src\main
D:\3rd\go\download\proj\src\main>go build main.go
D:\3rd\go\download\proj\src\main>main
conn end
D:\3rd\go\download\proj\src\main>

4.2Linux环境

创建/usr/local/goget/src/go.etcd.io目录,将etcd-3.5.1.zip上传到此目录并解压。将文件夹etcd-3.5.1重命名为etcd。

与Windows环境操作相同,在go get之前穿插拷贝文件的操作,避免下载依赖包时的报错。

打开终端,进入/usr/local/goget/src/go.etcd.io/etcd/client/v3目录。

执行命令:go get go.etcd.io/etcd/client/v3

[root@localhost v3]# go get go.etcd.io/etcd/client/v3
go: downloading go.uber.org/zap v1.17.0
go: downloading google.golang.org/grpc v1.38.0
go: downloading github.com/gogo/protobuf v1.3.2
go: downloading github.com/golang/protobuf v1.5.2
go: downloading google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
go: downloading github.com/coreos/go-semver v0.3.0
go: downloading github.com/coreos/go-systemd/v22 v22.3.2
go: downloading go.uber.org/atomic v1.7.0
go: downloading go.uber.org/multierr v1.6.0
go: downloading golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4
go: downloading google.golang.org/protobuf v1.26.0
go: downloading golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
go: downloading golang.org/x/text v0.3.5
[root@localhost v3]# 

相关依赖包被下载到/usr/local/goget/pkg目录。

同样参考Windows,将/usr/local/goget/pkg目录下的所有文件夹拷贝到/usr/local/goget/src目录下。同时需要将这些文件夹下目录名称中的版本号去掉,否则编译代码时会报错,找不到对应目录。

同样提供一个处理后的goget包供直接使用,可以跳过本节之前的所有步骤。请在资源里下载。下载链接:https://download.csdn.net/download/tianwaimmmm/72280566

同样参考Windows,将代码上传后编译运行:

[root@localhost main]# go build main.go
[root@localhost main]# ./main
conn end
[root@localhost main]# pwd
/usr/local/goget/proj/src/main
[root@localhost main]# 

5.C++调用go

go源码编译为so供C++调用,参考了这篇文章:

go随聊-go编译so库让C++引用

比较简单,就不再赘述了,已经在centos7.4上验证通过,可直接参考。

下次计划先使用go编写相关接口,再封装成.so供C++程序直接调用。

etcd本身提供了etcd-cpp-apiv3,但受应用环境gcc版本的影响无法使用(要求gcc7以上),只好退而求其次。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你们虫姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值