Introduction to Consul

Consul简介

欢迎来到Consul介绍指南!本指南是开始了解Consul的最佳场所。它涵盖了Consul是什么,可以解决什么问题,和现有的软件有那些差异,以及如何开始使用它。
如果您熟悉Consul的基础知识,访问该文档了解更详细的可用功能参考。

Consul是什么?

Consul有多个组件,但是整体来看,它是你基础设施中用于发现和配置服务的一个工具。它提供如下几个关键功能:

  • 服务发现: Consul的客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者(即该consul-client)。使用DNS或者HTTP,应用程序可以轻松找到所依赖的服务。
  • 健康检查: Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(Web服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。操作员可以使用此信息来监视集群健康状况,并由服务发现组件路由用来远离不健康的主机。
  • 键值存储: 应用程序可以使用Consul的分层键/值存储,用于一些目的, 包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
  • 多数据中心: Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。

Consul旨在对DevOps社区和应用程序开发人员友好,使其成为现代的、可伸缩基础设施的完美选择。

Consul的基础架构

Consul是一个分布式、高可用的系统。本节将介绍基础知识,故意省略了一些不需要的细节,这样您可以快速的理解Consul是怎样工作的。对于更多细节,请参阅深入的架构概述

向Consul提供服务的每个节点都会运行一个Agent。发现其他服务或获取/设置键值数据不需要运行AgentAgent负责对节点和节点本身的服务进行健康检查。

Agent与一个或多个Consul Server进行通信,Consul Server会进行数据的存储,多个Server之间会进行复制。Server们会选举一个Leader。虽然一个Server也可以完成Consul的功能,但是为了避免单节点失败导致的数据丢失,建议使用3-5个Server;并且推荐每个数据中心都有一个Consul的集群。

需要发现其他服务或节点的基础架构组件可以查询到任何Consul Server或任何Consul Agent。Agent会自动向Server转发查询。

每个数据中心运行一个Consul Server的集群。当作出一个跨数据中心的服务发现或配置请求时,本地的Consul Server直接转发请求到远程数据中心并返回结果。

下一步

比较Consul和其它软件,以评估它如何融合到您现有的基础设施。

然后继续入门指南,让Consul运行起来。

Consul与其它软件对比

Consul解决的问题有多个,但是每一个单个的问题都已经被许多不同的系统解决。虽然没有一个单个的系统提供Consul的所有功能,但是有其它选择来解决其中的部分问题。

这一节我们将比较Consul和其它软件选择。在大多数情况下,Consul和其它系统并不是互斥的。

CONSUL VS. ZOOKEEPER, DOOZERD, ETCD

参考阅读

CONSUL VS. CHEF, PUPPET, ETC.

参考阅读

CONSUL VS. NAGIOS, SENSU.

参考阅读

CONSUL VS. SKYDNS.

参考阅读

CONSUL VS. SMARTSTACK.

参考阅读

CONSUL VS. SERF.

参考阅读

CONSUL VS. CUSTOM SOLUTIONS.

参考阅读

快速开始

安装Consul

Consul必须首先安装在您的机器上。Consul为所有支持的平台和架构分发一个二进制包
本页面将不介绍如何从源代码编译Consul,但是从源代码编译中可以看到那些想要确保他们将信任的源编译为最终二进制文件的文档。

开始安装

要安装Consul,首先找到适合你的操作系统的,并下载它。Consul被打包成一个zip文档。

下载Consul完毕后,解压压缩包。Consul作为一个名为consul的二进制文件运行。包中的任何其他文件都可以安全删除,Consul仍然可以使用。

最后一步是确保Consul二进制文件在PATH上可用。
有关在Linux和Mac上设置PATH的说明,请参阅此页面。在Windows上设置PATH的说明,请参阅此页面

在Unix系统,~/bin/usr/local/bin是常见的安装目录,这取决于你想限制安装只对单一用户还是面向整个系统。在Windows系统,你可以把它放在任何你想放的地方,只要这个位置在%PATH%变量中。

验证安装

安装Consul完毕之后,验证安装工作可以通过打开一个新的终端会话来检查Consul是否可用。通过执行consul命令你应该可以看到类似于下面这样的帮助输出:

$ consul
usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    event          Fire a new event

# ...

如果您看到无法找到consul的错误,则您的PATH环境变量未正确设置。请返回并确保您的PATH变量包含安装Consul的目录。

运行Consul Agent

Consul安装完毕之后,Agent必须运行。Agent可以运行在Server或者Client模式。每一个数据中心至少要有一个Server,不过一个集群推荐要有3-5个Server。非常不鼓励单个服务器部署,因为在故障情况下数据丢失是不可避免的。

所有其它的Agent运行在Client模式,一个Client是一个非常轻量级的进程,用来注册服务,运行健康检查,以及转发查询到Server。Agent必须运行在集群中的每一个节点。

有关启动数据中心的更多详细信息,请参阅本指南

启动Agent

最简单地,我们先以开发模式来启动Consul Agent。这个模式对于快速容易的创建一个单一节点的Consul环境很有用。不过,不要打算在生产环境这样使用,因为它不会持久化任何状态。

-$ consul agent -dev
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
           Version: 'v0.7.0'
         Node name: 'Armons-MacBook-Air'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2016/09/15 10:21:10 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]
    2016/09/15 10:21:10 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air 127.0.0.1
    2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air.dc1 127.0.0.1
    2016/09/15 10:21:10 [INFO] consul: Adding LAN server Armons-MacBook-Air (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2016/09/15 10:21:10 [INFO] consul: Adding WAN server Armons-MacBook-Air.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (180.708µs) from=127.0.0.1:52369
    2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (15.548µs) from=127.0.0.1:52369
    2016/09/15 10:21:17 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2016/09/15 10:21:17 [DEBUG] raft: Votes needed: 1
    2016/09/15 10:21:17 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 1
    2016/09/15 10:21:17 [INFO] raft: Election won. Tally: 1
    2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2016/09/15 10:21:17 [INFO] consul: cluster leadership acquired
    2016/09/15 10:21:17 [DEBUG] consul: reset tombstone GC to index 3
    2016/09/15 10:21:17 [INFO] consul: New leader elected: Armons-MacBook-Air
    2016/09/15 10:21:17 [INFO] consul: member 'Armons-MacBook-Air' joined, marking health alive
    2016/09/15 10:21:17 [INFO] agent: Synced service 'consul'

您可以看到,Consul Agent已经启动并输出了一些日志数据。从日志数据中,您可以看到我们的Agent正在以服务器模式运行,并且声明为集群中的Leader身份。此外,本地成员已被标记为集群的一个健康成员。

提示OS X用户:Consul使用你的主机名作为默认的节点名称,如果你的主机名是有周期的(比如DHCP自动分配主机名),使用Consul对这个节点的DNS查询将不能工作。为了避免这个问题,请使用-node参数明确的设置你的节点的名称。

集群成员

如果您在另一个终端运行consul members,您可以看到Consul集群的成员。我们将在下一节中介绍如何加入集群,但现在集群中只应该看到一个成员(你自己):

$ consul members
Node                Address            Status  Type    Build     Protocol  DC
Armons-MacBook-Air  172.20.20.11:8301  alive   server  0.6.1dev  2         dc1

输出只有我们自己的节点,它正在运行的地址,它的健康状态,它的集群角色,以及一些版本信息。此外元数据可以通过提供的-detailed参数来查看。

memebrs命令的输出基于流言协议,是最终一致的。因此,在某个时间点,您的本地Agent所看到的世界视图可能与服务器上的状态不完全匹配。要获得一个强一致性的世界视图,使用HTTP API,它会转发请求到Consul Server:

$ curl localhost:8500/v1/catalog/nodes
[{"Node":"Armons-MacBook-Air","Address":"127.0.0.1","TaggedAddresses":{"lan":"127.0.0.1","wan":"127.0.0.1"},"CreateIndex":4,"ModifyIndex":110}]

除了HTTP API,DNS接口也可以用来查询节点。你需要确保你的DNS查询指向Consul Agent的DNS服务器,它默认运行在8600端口。DNS条目的格式(例如“Armons-MacBook-Air.node.consul”)将在后边进行详细介绍。

$ dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul
...

;; QUESTION SECTION:
;Armons-MacBook-Air.node.consul.    IN  A

;; ANSWER SECTION:
Armons-MacBook-Air.node.consul. 0 IN    A   127.0.0.1

停止Agent

你可以使用Ctrl-C(中断信号)来优雅的中止Agent的运行。在中断Agent以后,你可以看到它离开了集群并且已关闭。

通过优雅地离开,Consul通知其它的集群成员这个节点离开了。如果你强制杀死Agent进程,集群中的其它成员会检测到节点失败了。当一个成员离开,它的服务和检查将会从登记目录中移除。当一个成员失败,它的健康状态会简单的标记为critical,但是它不会被从登记目录中移除。Consul将会自动重新连接失败的节点,允许它从一定的网络状态下恢复回来,而离开的节点将不会再进行联系。

此外,如果Agent作为Server运行,优雅地离开是很重要的,可以避免因影响一致性协议导致的可能的可用性中断。对于怎样安全的添加和移除Server,请看指引章节了解详细情况。

注册服务

在上一步中,我们运行了我们的第一个代理,看到了群集成员,并查询了该节点。在本指南中,我们将注册我们的第一个服务并查询该服务。

定义服务

可以通过提供服务定义或通过对HTTP API进行适当的调用来注册服务。

服务定义是注册服务的最常见方式,我们将在这一步使用这个方法。我们将基于上一步中介绍的Agent配置中来构建它。

首先,为Consul配置创建一个目录,Consul会从此目录中加载所有的配置文件。在Unix系统中一个通用的目录命名约定类似于这样:/etc/consul.d(后缀.d表明这个目录包含一组配置文件)。

$ sudo mkdir /etc/consul.d

下一步,我们将编写一个服务定义配置文件。我们假设有一个叫做“web”的服务运行在80端口。此外,我们会给这个服务一个标签,我们可以使用它作为查询服务的附加方式:

$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
    | sudo tee /etc/consul.d/web.json

现在,重启Agent,并提供配置目录:

$ consul agent -dev -config-dir=/etc/consul.d
==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
...

你会注意到输出中Agent已经**Synced**Web服务。这意味着Agent已经从配置文件中加载了服务定义,并且已经成功的注册到服务条目。

如果你想注册多个服务,你可以在Consul配置目录中创建多个服务定义文件。

查询服务

一旦Agent启动并且服务被同步,我们就可以使用DNS或者HTTP API的方式来查询服务。

DNS API

首先使用DNS接口来查询我们的服务。对于DNS接口,服务的DNS名称是NAME.service.consul。默认情况下,所有的DNS名称都在consul命名空间下,当然这也是可配置的。子域名service告诉Consul我们正在查询服务,然后NAME是服务的名字。

对于我们注册的服务,这些约定和设置产出一个完全合格的域名:web.service.consul。

$ dig @127.0.0.1 -p 8600 web.service.consul
...

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
web.service.consul. 0   IN  A   172.20.20.11

正如你看到的,一个A记录返回,带着服务可用节点的IP地址。A记录只能保存IP地址。

您还可以使用DNS API将整个地址/端口对作为SRV记录检索:

$ dig @127.0.0.1 -p 8600 web.service.consul SRV
...

;; QUESTION SECTION:
;web.service.consul.        IN  SRV

;; ANSWER SECTION:
web.service.consul. 0   IN  SRV 1 1 80 Armons-MacBook-Air.node.dc1.consul.

;; ADDITIONAL SECTION:
Armons-MacBook-Air.node.dc1.consul. 0 IN A  172.20.20.11

SVR记录告诉我们web服务运行在80端口,并且存在于节点Armons-MacBook-Air.node.dc1.consul.之上。一个附加的部分被DNS返回,包含这个节点的A记录。

最后,我们还可以在使用DNS接口时通过标签来过滤服务。基于标签的服务查询格式是:TAG.NAME.service.consul。在下边的例子中,我们请求Consul提供具有”rails”标签的所有Web服务。我们会得到一个成功的响应,因为我们已经使用这个标签注册了我们的服务:

$ dig @127.0.0.1 -p 8600 rails.web.service.consul
...

;; QUESTION SECTION:
;rails.web.service.consul.      IN  A

;; ANSWER SECTION:
rails.web.service.consul.   0   IN  A   172.20.20.11
HTTP API

除了API API之外,还可以使用HTTP API来查询服务:

$ curl http://localhost:8500/v1/catalog/service/web
[{"Node":"Armons-MacBook-Air","Address":"172.20.20.11","ServiceID":"web", \
    "ServiceName":"web","ServiceTags":["rails"],"ServicePort":80}]

接口catelog返回指定服务的所有宿主节点。但是你通常只想要获取到通过健康检查的健康实例。这也正是DNS正在做的事情。下边将只查询健康的实例:

$ curl 'http://localhost:8500/v1/health/service/web?passing'
[{"Node":"Armons-MacBook-Air","Address":"172.20.20.11","Service":{ \
    "ID":"web", "Service":"web", "Tags":["rails"],"Port":80}, "Checks": ...}]

更新服务

可以通过更改配置文件,然后发送一个SIGHUP给Agent,来更新服务定义。这样可以更新服务,而无需停机或服务查询不可用。

此外,Http接口还可以动态的添加、移除和修改服务。

Consul集群

我们已经启动了第一个Agent,并且在这个Agent上注册和查询了一个服务。这已经显示出使用Consul是相当的容易,但是还没有展现出这如何扩展为一个可伸缩的、生产级的服务发现基础设施。在这一步,我们将使用多个成员创建第一个真正的集群。

当一个Consul Agent启动后,它没有任何其它节点的知识:它是一个孤立的集群。想了解其它的集群成员,Agent必须加入一个已经存在的集群。要加入已经存在的集群,它只需要知道一个已经存在的成员。Agent加入后,它将通过流言协议和这个成员进行交流,并很快的发现集群中的其它成员。Consul Agent可以加入任何一个其它的Agent,不只是Server模式的Agent。

启动Agent

为了模拟一个更真实的集群,我们将通过Vagrant启动一个有两个节点的集群。我们使用的Vagrantfile可以在Consul源码库的示例章节找到。

我们首先启动我们的两个节点:

$ vagrant up

一旦系统可用了,我们可以SSH进入他们,以开始对我们的集群进行配置。我们首先登录到第一个节点:

$ vagrant ssh n1

在前面的例子中,我们使用-dev标志来快速设置开发服务器。但是,这不足以在集群环境中使用。从现在起我们将不再使用-dev参数,取而代之的是下边列出的集群参数。

集群中的每个节点必须要有一个唯一的名字。默认情况下,Consul使用机器的主机名,但是我们可以通过使用-node命令行选项来手动的设置它。

我们将指定一个绑定地址:这是Consul的监听地址,它必须可以被集群中的其它所有节点访问。虽然绑定地址不是绝对必要的,但最好总是提供一个。Consul将默认尝试在系统上的所有IPv4接口上侦听,但如果找到多个专用IP,则抛出错误无法启动。生产服务器通常有多个接口,所以指定一个绑定地址可以确保你没有绑定Consul到一个错误的接口。

第一个节点将作为我们在该集群中的唯一服务器,并且我们将使用server开关来标识它。

-bootstrap-expect参数告诉Consul Server预定将要加入的其它服务节点的数量。这个参数的目的是延迟复制日志的启动直到预期数量的Server节点已经成功加入。你可以在bootstrapping指南了解更多关于这个的内容。

最后,我们添加一个config-dir参数,标识可以在哪里找到服务和检查的定义。

这些设置集合起来将产生一个consul agent命令,像这样:

vagrant@n1:~$ consul agent -server -bootstrap-expect=1 \
    -data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
    -config-dir=/etc/consul.d
...

现在,使用另一个终端,我们可以连接到第二个节点:

$ vagrant ssh n2

这次,我们设置绑定地址切换到匹配第二个节点的IP(Vagrantfile指定的),并且这个节点名字agent-two。因为这个节点将不是一个Consul Server,所以我们不需要提供server开关

这些设置集合起来将产生一个consul agent命令,像这样:

vagrant@n2:~$ consul agent -data-dir=/tmp/consul -node=agent-two \
    -bind=172.20.20.11 -config-dir=/etc/consul.d
...

在这个节点,你已经有两个Consul Agent在运行:一个Server和一个Client。这两个Agent仍旧相互不知,只是他们各自单节点集群的一部分。你可以通过在每个Agent上运行consul members命令来进行验证,并注意到对每个Agent只有一个成员可见。

加入集群

现在,我们将告诉第一个Agent来加入第二个Agent,通过在一个新的终端运行如下的命令:

$ vagrant ssh n1
...
vagrant@n1:~$ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.

你应该在每个Agent日志中看到一些日志输出,如果你细心阅读,你将会看到他们收到join的一些信息。如果你在每个Agent运行consul members命令,你将会看到所有节点现在是互知的了:

vagrant@n2:~$ consul members
Node       Address            Status  Type    Build  Protocol
agent-two  172.20.20.11:8301  alive   client  0.5.0  2
agent-one  172.20.20.10:8301  alive   server  0.5.0  2

记住:要加入一个集群,Consul agent只需要知道一个已经存在的成员。加入集群后,这个Agent将和其它节点聊天来传播完整的成员信息。

启动时自动加入集群

理想情况下,无论何时在数据中心内建立新节点,它都应自动加入Consul集群而无需人为干预。Consul通过启用自动发现AWS或Google Cloud中的实例并使用给定的标记键/值来实现自动加入。要使用集成,请将retry_join_ec2retry_join_gce嵌套对象添加到您的Consul配置文件中,这将允许新节点加入群集而无需任何硬编码配置。或者,您可以在启动时使用-join标志start_join设置加入其他已知consul agents的硬编码地址。

查询节点

就像查询服务,Consul有一个API来查询节点。你可以通过DNS或者HTTP API来干这件事。

对于DNS API,名称的结构是NAME.node.consulNAME.node.DATACENTER.consul。如果省略datacenter,Consul只会搜索本地数据中心。

举个例子,在“agent-one”,我们可以查询节点“agent-two”的地址:

vagrant@n1:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul
...

;; QUESTION SECTION:
;agent-two.node.consul. IN  A

;; ANSWER SECTION:
agent-two.node.consul.  0 IN    A   172.20.20.11

除了服务查找之外,查找节点的能力对于系统管理任务来说非常有用。例如,知道该节点的地址进行SSH登入将像标记该节点作为Consul集群的一部分并查询它一样容易。

离开集群

要离开集群,你既可以优雅地退出一个Agent(使用Ctrl-C),也可以强制杀死一个Agent。优雅地离开允许节点转变为离开状态;否则,其他节点会将其检测为失败状态。这两点不同的详细介绍在这里

健康检查

我们现在已经看到运行Consul、添加节点和服务,以及查询这些节点和服务是如此的简单。这一章,我们将通过为节点和服务添加健康检查来继续我们的旅程。健康检查对于服务发现是一个关键的组件,它可以防止使用不健康的服务。

这一步建立在之前创建的Consul集群上。因此,你应该有一个包含两个节点的集群在运行。

定义健康检查

和服务类似,一个检查可以通过提供一个检查定义来注册,还可以通过调用适当的HTTP API来注册。

我们将使用检查定义的方法,就像服务,定义的方法是设置检查的最常用方式。

在第二个节点的Consul配置目录中创建两个定义文件:

vagrant@n2:~$ echo '{"check": {"name": "ping",
  "script": "ping -c1 google.com >/dev/null", "interval": "30s"}}' \
  >/etc/consul.d/ping.json

vagrant@n2:~$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
  "check": {"script": "curl localhost >/dev/null 2>&1", "interval": "10s"}}}' \
  >/etc/consul.d/web.json

第一个定义添加了一个名字为“ping”的主机级别的检查。这个检查每隔30秒运行一次,调用ping -c1 google.com。在基于脚本的健康状况检查中,检查使用和启动Consul进程相同的用户进行运行。如果这个命令返回一个非零退出代码,这个节点将被标记为不健康的。对于基于脚本的健康检查,这是约定。

第二个命令修改名为”web”的服务,添加一个检查,每10秒钟通过curl发送请求,以验证Web服务器是否可访问。与主机级运行状况检查一样,如果脚本以非零退出代码退出,则该服务将被标记为不健康。

现在,重启第二个Agent或者发送一个SIGHUP信号。你应该可以看到如下的日志行:

==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
    [INFO] agent: Synced check 'service:web'
    [INFO] agent: Synced check 'ping'
    [WARN] Check 'service:web' is now critical

前几行表明Agent已经同步了新的定义。最后一行表明我们添加的web服务是critical状态。这是因为我们实际没有运行Web服务,所以curl测试是失败的。

检查健康状态

现在我们添加了一些简单的检查,我们可以使用HTTP API来检查它们。首先,我们可以使用此命令查找任何失败的检查(注意,这可以在任一节点上运行):

vagrant@n1:~$ curl http://localhost:8500/v1/health/state/critical
[{"Node":"agent-two","CheckID":"service:web","Name":"Service 'web' check","Status":"critical","Notes":"","ServiceID":"web","ServiceName":"web"}]

我们可以看到只有一个检查,我们的web服务检查处于critical状态。

此外,我们可以尝试使用DNS查询Web服务。Consul将不会返回任何结果,因为服务是不健康的:

dig @127.0.0.1 -p 8600 web.service.consul
...

;; QUESTION SECTION:
;web.service.consul.        IN  A

在这个章节,你已经了解到添加健康检查是如何的容易。检查定义可以通过更改配置文件和对Agent发送SIGUP来进行更新。此外,HTTP API可以动态的用来添加、移除,以及修改检查。该API还允许一个“死人开关”,一个基于TTL的检查。TTL检查可以使Consul更紧密的集成到一个应用,使业务逻辑评估成为检查状态评定的一部分。

键值存储

Consul除提供服务发现和综合健康检查外,还提供易于使用的键值存储。这可以用于保持动态配置,协助服务协调,建立领导者选举,以及开发人员想构建的任何其他内容。此步骤假定您至少有一名Consul Agent已经在运行。

简单用法

为了展示使用它是如何的简单,我们将在键值存储中处理一些Keys。有两种方式可以与Consul KV存储进行交互:通过HTTP API和Consul KV CLI进行交互。
以下示例显示使用Consul KV CLI,因为它是最容易入手的。对于更高级的集成,您可能需要使用Consul KV HTTP API

首先让我们探索KV存储。我们可以向Consul询问名为redis/config/minconns的key所对应的值:

$ consul kv get redis/config/minconns
Error! No key exists at: redis/config/minconns

如您所见,我们没有得到任何结果,这是正确的,因为目前KV存储中没有任何数据。接下来我们可以在KV存储中”put”一些示例Keys。

$ consul kv put redis/config/minconns 1
Success! Data written to: redis/config/minconns

$ consul kv put redis/config/maxconns 25
Success! Data written to: redis/config/maxconns

$ consul kv put -flags=42 redis/config/users/admin abcd1234
Success! Data written to: redis/config/users/admin

现在我们可以查询各个键的值:

$ consul kv get redis/config/minconns
1

Consul保留有关该字段的其他元数据,该元数据可使用-detailed标志检索:

$ consul kv get -detailed redis/config/minconns
CreateIndex      207
Flags            0
Key              redis/config/minconns
LockIndex        0
ModifyIndex      207
Session          -
Value            1

对于键“redis/config/users/admin”,我们设置了一个值为42的标志。所有键都支持设置一个64位整数标志值。这不是由Consul内部使用,客户端可以使用它来向任何KV添加有意义的元数据。

可以使用recurse选项列出KV存储中的所有键。结果将以字典顺序返回:

$ consul kv get -recurse
redis/config/maxconns:25
redis/config/minconns:1
redis/config/users/admin:abcd1234

要从Consul KV存储删除一个key,可通过发出”delete”请求来完成:

$ consul kv delete redis/config/minconns
Success! Deleted key: redis/config/minconns

也可以使用recurse选项递归删除包含指定前缀的所有键:

$ consul kv delete -recurse redis
Success! Deleted keys with prefix: redis

要更新现有key的值,请在同一路径上”put”新值:

$ consul kv put foo bar

$ consul kv get foo
bar

$ consul kv put foo zip

$ consul kv get foo
zip

Consul可以使用Check-And-Set操作提供原子key更新。要执行CAS操作,请指定-cas标志:

$ consul kv put -cas -modify-index=123 foo bar
Success! Data written to: foo

$ consul kv put -cas -modify-index=123 foo bar
Error! Did not write to foo: CAS failed

在这个例子中,第一个CAS更新成功,因为modify-index的值是123。然后第二次操作失败,因为modify-index的值不再是123。

这些只是API支持的几个例子。有关完整的文档,请参阅Consul KV HTTP APIConsul KV CLI文档。

Web界面

Consul自带一个漂亮的、多种功能的Web用户界面。用户界面可以用来浏览所有的服务和节点,浏览所有的健康检查和他们的最新状态,以及读写键值数据。用户界面还自动支持多数据中心。

Consul Web UI

要设置自宿主用户界面,启动Consul agent时使用-ui参数。

$ consul agent -ui
...

用户界面使用与Agent HTTP API相同的端口,在ui/路径下。默认地址是http://localhost:8500/ui

你可以点击这里查看一个活生生的例子。

了解更多关于如何继续Consul旅程信息, 请移步到下一步

参考链接: Introduction to Consul & Consul中文翻译计划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值