微服务架构系列 - 注册中心篇:Etcd 简介与使用入门

- 1 min

微服务架构系列(二十四)

基本介绍

除了 Consul 之外,在 Go 生态中,还可以选择基于 Etcd 作为注册中心,Etcd 是由 CoreOS 团队维护的、高可用分布式键值存储数据库,可用于为集群提供配置和服务发现功能,Google 开源的容器管理工具 Kuberbetes 就是基于 Etcd 的,国内也有很多公司在用,比如华为、七牛等,该项目的 Github 地址是:https://github.com/etcd-io/etcd。

和 Consul 一样,Etcd 也是基于 Raft 协议作为分布式一致性算法来解决领导者选举和日志复制问题,同样也是基于 Go 语言编写。

Etcd 也支持代理模式(proxy),只不过在 Etcd 中,代理模式和 Consul 的客户端代理模式类似,安装在部署服务的节点上,用来转发请求到 Etcd 集群,本身不存储任何数据,Etcd 集群相当于 Consul 中以服务端模式运行的 Consul 集群,通常要求配置三个及以上节点(不要太多,3~5就够了,以便可用性和性能上达到平衡),负责真正的请求处理 —— 服务注册与发现。

在目前最新版本的 Etcd v3中,通过网关模式(gateway)取代了 V2 版本中的代理模式(proxy)。

Etcd 也是支持以 HTTP API 的方式与其进行交互,比如服务节点的注册与查询都是通过这些 API 完成的:https://etcd.io/docs/v3.3.12/learning/api/,客户端会通过与 Etcd 集群保持长连接,Etcd 提供 watch 机制监听某个目录或键,一旦发生变化,Etcd 就通过长连接通知客户端,从而让客户端及时直到节点的变更。

从服务发现的实现原理上来说,Consul 和 Etcd 的基本设计思路是一致的,Etcd 更简单,Consul 则更像一个全栈的解决方案,功能比 Etcd 要更丰富,比如支持可视化的 Web UI 管理界面、支持多数据库中心、安全层面除了 HTTPS 外还支持 ACL、更加全面的健康检查功能、内置 DNS Server 等,这些都是 Etcd 所不具备的,但是更全面的功能往往意味着更高的复杂性,针对微服务的服务注册和发现场景,Etcd 完全够用了。

本地测试

关于 Etcd 的更多细节我们这里不做深入介绍,感兴趣的同学可以去阅读官方文档,接下来我们将演示如何与 Etcd 进行交互实现简单的键值存储和读取。

首先我们需要在本地安装 Etcd,你可以在 https://github.com/etcd-io/etcd/releases 这个页面中根据自己的操作系统选择一个压缩包下载:

img

Mac 对应的平台是 darwin-amd64,所以我这里下载是这个 zip 文件。下载完成后解压到指定目录,进入解压后的目录,通过运行该目录下的 etcd 脚本即可启动 Etcd(系统需要安装过 Golang 运行时环境):

    cd /path/to/etcd-v3.3.13-darwin-amd64
    ./etcd

img

在启动日志中我们可以看到这个唯一节点被选举为 Leader 节点,并且默认在 localhost:2379 端口监听客户端请求。

和 Consul 开发者模式类似,这种情况下启动的是 Etcd 独立集群(只有一台服务器),该 Etcd 节点承载着 proxy 与 server 的功能于一身,我们可以通过同一目录下的 etcdctl 命令与 Etcd 集群进行交互,比如要查看 Etcd 版本可以这么做:

img

> 注:通过 ETCDCTL_API=3 指定 Etcd API 的版本,默认是 2。

为了简化后续交互命令,我们通过 export 命令将 ETCDCTL_API=3 设置到环境变量中,如果想要在任意位置访问到 etcdetcdctl,需要将这两个脚本所在目录添加到系统环境变量 PATH 中:

img

如果要进行键值的存储和读取的话,对应的交互指令如下,操作指令和 Consul 类似:

img

读取键的时候,默认会返回键和值,如果只想返回值,带上 --print-value-only 选项。要删除这个键可以通过 del 指令完成:

img

删除完成后,再次获取返回就是空了。你还可以通过新开一个终端窗口通过 watch 指令监听上述键值变更:

img

好了,关于 Etcd 的基本原理和交互我们就简单介绍到这里,Etcd 还支持一些更加复杂的交互指令,你可以在官方文档中查看。

下篇分享,我们将结合 Go Micro 微服务来演示如何通过 Etcd 作为注册中心进行服务注册和发现。

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora