这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
今天学习Kitex的官方实例项目easynote的时候看到了项目中使用了etcd进行服务发现和注册,于是顺便去学习了一下etcd的使用,在这里记录一下。
学习资料
- 官方文档
什么是etcd
etcd基于Go语言编写,提供强一致性、分布式键值存储,为存储需要通过分布式系统或机器集群访问的数据提供了可靠的解决方案,主要用来存储分布式系统中的一些重要数据,比如可以用于服务发现与注册、共享配置、分布式锁以及集群监控等场景。
easynote项目中使用etcd进行服务发现和注册:
先来看一下项目的架构图:
![]()
其中demonote和demouser服务分别向etcd中心注册服务,然后上层的demoapi负责处理用户的请求,该层通过etcd服务注册中心调用已有服务。
体验一下etcd
linux下安装etcd
- 从官方仓库Releases · etcd-io/etcd (github.com)下载预编译好的二进制包。
- 使用如下命令解压文件
tar -zxvf 文件名.tar.gz - 将解压后的二进制文件移动到
/usr/local/bin目录,或者,将该目录添加到环境变量,这样就可以在任意目录下执行etcd命令。 - 使用
etcd --version查看是否安装成功。
创建集群
-
静态创建方式
首先应当明确集群的节点数量以及集群中每个设备的ip地址和端口号,然后在每个设备中执行如下命令:$ etcd --name 节点名称 --initial-advertise-peer-urls http://ip地址:端口号 \ --listen-peer-urls http://ip地址:端口号 \ --listen-client-urls http://ip地址:端口号,http://ip地址:端口号 \ --advertise-client-urls http://ip地址:端口号 \ --initial-cluster 节点名称=http://ip地址:端口号,节点名称=http://ip地址:端口号,节点名称=http://ip地址:端口号 \ --initial-cluster-state new参数说明:
参数 说明 --name节点名称 --listen-client-urls监听客户端的请求的url列表 --advertise-client-urls用于通知集群中的其他节点,客户端通过 advertise-client-urls中的url访问本机服务,是listen-client-urls的子集--listen-peer-urls节点之间通信使用的url,监听列表 --initial-advertise-peer-urls告诉其他节点使用哪个url与本机通讯,是 listen-peer-urls的子集--initial-cluster集群节点列表 initial-cluster-state集群初始状态, new或existing
2.动态创建
Discovery service protocol
该协议使用一个新的发现令牌(discovery token)来引导一个唯一的集群,一个发现令牌只能表示一个集群,它的主要思想是用一个内部集群的discovery service来引导一个新集群的构建,如果没有内部集群,则可以使用官方提供的公共服务discovery.etcd.io/,每个节点都与disvocery service交互并产生一个成员列表。
步骤:
- 产生一个唯一的token用于标识一个集群,后续用这个token访问
discovery service服务;- 告知
discovery service集群的节点数量,discovery service返回一个url,称为discovery url;- 每个节点使用
--discovery (discovery url)运行etcd命令- 每个成员向
discovery service进行注册,方式为发送一个成员id(作为url参数)- 根据
discovery service返回的信息,每个节点会等待其他节点的加入,直到节点数量等于预期的节点数量。
使用如下命令:
curl https://discovery.etcd.io/new?size=集群大小
然后将返回的结果作为--discovery的参数。
基本命令
使用etcdctl命令可以访问etcd节点存储的键值对,具体的用法可以查看文档使用。