[译] Java 和 etcd: 由于 jetcd 最终走到了一块儿

可靠的键值存储为分布式系统提供了一致性配置和协调的公共基础。etcd 项目就是一个这样的系统,这是一个由 CoreOS 建立的开源键值存储系统。它是许多生产级分布式系统的核心组件和 Kubernetes 等项目的数据存储中心。html

Java 已经经过在包括 Hadoop 生态系统、Cassandra 数据存储和云基础设施技术栈中的使用而证实了本身是一种流行的分布式系统语言。此外,它仍然是一种很是流行的语言。能够看看在谷歌趋势的统计数据中,Java 仍然占据主导地位: 前端

就谷歌搜索结果而言,Java 仍然比 Microsoft 的 .Net 甚至 JavaScript 语言更受欢迎java

面对着 Java 的流行及其在分布式系统中的广泛使用,咱们认为对于 Java 开发来讲,etcd 也应该做为后端基础被使用到。jetcd 这个新的 etcd 客户端的出现,将 etcd v3 API 带到了 Java 中。android

经过使用 jetcd,Java 应用程序可使用包装了 etcd 的原生 gRPC 协议的智能 API 来与 etcd 进行纯粹的交互。该 API 提供了仅在 etcd 上可用的表达性分布式特性。更重要的是,经过直接支持更多的语言,使用新的使用模式更容易为 etcd 编写新的应用程序,从而帮助 etcd 变得更加稳定和可靠。ios

初级入门

你能够经过构建并运行一个名为 jetcdctl小例子程序来试用 jetcd,该程序使用了 jetcd 去访问 etcd。对于更进一步的 jetcd 项目来讲,jetcdctl 示例也是一个很好的起点。要继续学习,你还须要同时安装 Git 和 Java。git

首先,克隆 jetcd 库来获取 jetcd 源码,而后使用 Maven 来构建 jetcd-simple-ctl 吧:github

$ git clone https://github.com/coreos/jetcd.git
$ cd jetcd/jetcd-examples/jetcd-simple-ctl
$ ./mvnw clean package
复制代码

构建并准备好运行 jetcdctl 以后,下载一个 etcd 发行版并在本地启动一个 etcd 服务。(译者注:若如下 “go get” 命令没法正常运行,能够参考这里的资料):apache

# build with “go get github.com/coreos/etcd/cmd/etcd”
$ etcd &
复制代码

接下来,使用 jetcdctl123 写入 abc,与本地 etcd 服务器进行通讯:后端

$ java -jar target/jetcdctl.jar put abc 123
21:39:06.126|INFO |CommandPut - OK
复制代码

你能够经过读取 abc 来确认写入 etcd 的 put 命令的正确性:api

$ java -jar target/jetcdctl.jar get abc 21:41:00.265|INFO |CommandGet - abc 21:41:00.267|INFO |CommandGet - 123
复制代码

咱们已经经过 get 和 put keys 演示了 jetcd 的基本功能。如今,让咱们进一步研究如何在代码中使用 jetcd 吧。

更好的 watches(观察)特性

jetcd API 能够方便地管理 etcd 的底层 gRPC 协议。一个例子是 streaming key 事件,其中客户端观察 key,etcd 服务端不断地往客户端发回更新信息。jetcd 客户端管理着一个低级别的 gRPC 流,用来优雅地处理断开链接,并向用户呈现一个无缝的事件流。

若是 jetcd 应用程序但愿接收到一个 key 的全部更新,它将使用 watch API 来建立一个 Watcher

Watcher watch(ByteSequence key) 复制代码

Watcherlisten 方法从 etcd 中读取 WatchResponse 消息。每一个 WatchResponse 包含被监视 key 上的最新事件序列。若是没有任何事件,则 listen 被阻塞,直到有更新为止。listen 方法是可靠的;它不会在调用之间删除任何事件,即便在断开链接的状况下:

WatchResponse listen() throws InterruptedException 复制代码

总之,客户端建立一个 Watcher,而后使用 listen 来等待事件。下面是在 key abc 上进行观察的代码,打印观察到的 key 和 value,直到 listen 抛出异常:总之,客户端建立一个 Watcher,而后使用 listen 来等待事件。下面是观察 key abc 的代码,打印 key 和 value,直到 listen 抛出异常:

Client client = Client.builder().endpoints(“http://127.0.0.1:2379).build();
Watcher watcher = client.getWatchClient().watch(ByteSequence.fromString("abc"));
while (true) {
    for (WatchEvent event : watcher.listen().getEvents()) {
        KeyValue kv = event.getKeyValue();
        System.out.println(event.getEventType());
        System.out.println(kv.getKey().toStringUtf8());
        System.out.println(kv.getValue().toStringUtf8());
    }
}
复制代码

将此特性与 Apache 基金会中与 etcd 对标的 ZooKeeper 进行比较。从 ZooKeeper 3.4.10 开始,watch 就已是一次性触发器,这意味着一旦收到一个 watch 事件,您必须设置一个新的 watch,以便在未来发生更改时获得通知。要传输密钥事件,可会断必须与集群联系,为每一个新事件注册一个新的观察者。

要在 key 更新时连续打印 key 的内容,ZooKeeper 应用程序首先建立一个 Watcher 来侦听 WatchedEvent 消息。观察程序实现了一个事件回调方法 process,当 key 发生更改时就会调用该方法。要在事件中注册兴趣,观察程序须要添加到 exists 方法中,该方法获取 key 的元数据(若是有的话)。当 key 发生变化时,观察者的 process 方法就会调用 getData 来检索 key 的值,而后再次注册相同的观察者来接收将来的更改,以下所示:

key = “/abc”;
Watcher w = new Watcher() {
  public void process(WatchedEvent event) {
    try {
      System.out.println(event.getType());
      System.out.println(event.getPath());
      if (event.getType() != EventType.NodeDeleted) {
        System.out.println(new String(zk.getData(event.getPath(), false, null)));
      }
      zk.exists(key, this);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
};
zk.exists(key, w);
复制代码

与 jetcd 示例不一样,ZooKeeper 代码不能保证它观察全部更改,由于在监视程序接收事件和发送请求以获取新监视之间存在延迟。例如,在执行 process 和调用 exists 以注册新监视程序之间发生了一个事件。因为没有注册任何观察程序,所以该事件永远不会被触发,而且会丢失。

即便假设全部事件都已触发,代码仍然可能破坏事件流。没有 etcd 提供的多版本并发控制,就没法访问历史 key。若是 key value 在接收事件和获取数据之间发生了变化,代码将打印出最新的值,而不是与 watch 事件关联的值。更糟的是,事件没有附带修订信息;没法肯定 key 是来自事件仍是来自 future 返回。

v0.0.1 版本以及将来计划

从 v0.0.1 开始,jetcd 支持大多数应用程序须要的键值存储。这些原语能够做为复杂模式(如分布式队列、barriers 等)的构建块。在将来,jetcd 将可以使用 etcd 的本地锁和领导人选举 rpc 进行集群范围的标准化分布式协调。

jetcd 设计目的是易于使用,同时还可以利用 etcd 的先进功能。它是开源的,而且正在活跃开发中,欢迎社区的贡献和反馈。咱们能够在 GitHub 上找到它,地址是github.com/coreos/jetc…

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索