Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用

的、可横向扩展的。它具备以下特性 :

服务发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas

提供的也可以一样注册。

健康检测:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到

故障的服务上面。

键值存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。

多数据中心:无需复杂的配置,即可支持任意数量的区域。

Consul安装

下载地址:https://www.consul.io/downloads.html

linux下安装

1wget https://releases.hashicorp.com/consul/1.7.1/consul_1.7.1_linux_amd64.zip
2unzip consul_1.7.1_linux_amd64.zip -d /usr/bin/

验证安装

1consul version
2Consul v1.7.1
3Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

Consul 角色

Client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群.

Server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数

据中心的 server 数量推荐为 3 个或是 5 个.

Consul架构

consul-arch

Client:表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到server(通过HTTP和DNS接口请求server),本身是不持久化这些信息。

Server:server表示consul的server模式,表这个consul是个server,这种模式下,功能和client都一样,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障时,信息是可以被保留的

SERVER-LEADER:中间那个server下面有leader字眼,表明这个server是它们的老大,它和其他server不一样的一点是,它需要负责同步注册的信息给其它server,同时也要负责各个节点的健康监测。

运行Consul

运行Consul Server

 1consul agent -server -bootstrap-expect 2 -bind 172.16.10.10 -data-dir /opt/consul
 2==> Starting Consul agent...
 3           Version: 'v1.7.1'
 4           Node ID: '186a802d-f0b3-0163-b994-dd55085eb189'
 5         Node name: 'node0'
 6        Datacenter: 'dc1' (Segment: '<all>')
 7            Server: true (Bootstrap: false)
 8       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
 9      Cluster Addr: 172.16.10.10 (LAN: 8301, WAN: 8302)
10           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
11
12==> Log data will now stream in as it occurs:
13
14    2020-03-14T01:56:30.938Z [INFO]  agent.server.raft: initial configuration: index=0 servers=[]
15    2020-03-14T01:56:30.938Z [INFO]  agent.server.raft: entering follower state: follower="Node at 172.16.10.10:8300 [Follower]" leader=
16    2020-03-14T01:56:30.940Z [INFO]  agent.server.serf.wan: serf: EventMemberJoin: node0.dc1 172.16.10.10
17    2020-03-14T01:56:30.942Z [INFO]  agent.server.serf.lan: serf: EventMemberJoin: node0 172.16.10.10
18    2020-03-14T01:56:30.946Z [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=udp
19    2020-03-14T01:56:30.950Z [INFO]  agent.server: Adding LAN server: server="node0 (Addr: tcp/172.16.10.10:8300) (DC: dc1)"
20    2020-03-14T01:56:30.951Z [INFO]  agent.server: Handled event for server in area: event=member-join server=node0.dc1 area=wan
21    2020-03-14T01:56:30.953Z [INFO]  agent: Started DNS server: address=127.0.0.1:8600 network=tcp
22    2020-03-14T01:56:30.955Z [INFO]  agent: Started HTTP server: address=127.0.0.1:8500 network=tcp
23    2020-03-14T01:56:30.956Z [INFO]  agent: started state syncer
24==> Consul agent running!
25    2020-03-14T01:56:38.149Z [ERROR] agent.anti_entropy: failed to sync remote state: error="No cluster leader"
26    2020-03-14T01:56:40.037Z [WARN]  agent.server.raft: no known peers, aborting election

参数说明:

  • -server: 指定以server模式启动

  • -bootstrap-expect : 在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直

    等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用

  • -data-dir: 提供一个目录用来存放agent的状态,所有的agent都需要该目录,目录必须是稳定的,每次重启都继续存在

  • -node: 节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

  • -bind: 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的。

  • -ui: 启动web界面

  • -config-dir: 配置文件目录,所有以.json结尾的文件都会被加载。

  • rejoin: 使consul忽略先前的离开,在再次启动后仍旧尝试加入到集群中。

  • -client: consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是在127.0.0.1,所以不对外提供服务。

加入到集群

1consul agent -server -bootstrap-expect 2 --data-dir $PWD/consul -node macos -ui -bind 172.16.10.1 -rejoin -join 172.16.10.10

consul-dashboard

可以看到我们集群中已经有2个节点,并且默认是dc1数据中心

启动Consul Client

1consul agent -data-dir /opt/consul -node node3 -bind 172.16.10.11 -rejoin -join 172.16.10.10

查看成员

1consul members
2Node   Address            Status  Type    Build  Protocol  DC   Segment
3macos  172.16.10.1:8301   alive   server  1.7.1  2         dc1  <all>
4node0  172.16.10.10:8301  alive   server  1.7.1  2         dc1  <all>
5node3  172.16.10.11:8301  alive   client  1.7.1  2         dc1  <default>

单机运行

默认consul是以集群方式运行的,但是开发的时候通常在自己装个consul方便调试,这时可以单机运行

1consul agent -dev

停止agent

你可以使用Ctrl-C关闭Agent. 中断Agent之后你可以看到他离开了集群并关闭.

此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免引起潜在的可用性故障影响达成一致性

协议。consul优雅的退出

1consul leave

注册服务

搭建好conusl集群后,用户或者程序就能到consul中去查询或者注册服务。可以通过提供服务定义文件或者调用

HTTP API来注册一个服务.

首先,为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件.在Unix系统中通常类似

/etc/consul.d (.d 后缀意思是这个路径包含了一组配置文件).

1 mkdir /etc/consul.d

然后,我们将编写服务定义配置文件.假设我们有一个名叫web的服务运行在 10000端口.另外,我们将给他设置一个标

签,这样我们可以使用他作为额外的查询方式:

 1{
 2    "service":{
 3        "name":"web",
 4        "tags":[
 5            "master"
 6        ],
 7        "address":"127.0.0.1",
 8        "port":10000,
 9        "checks":[
10            {
11                "http":"http://localhost:10000/health",
12                "interval":"10s"
13            }
14        ]
15    }
16}

测试程序

 1package main
 2
 3import (
 4	"net/http"
 5	"io"
 6)
 7
 8func sayHello(w http.ResponseWriter, r *http.Request) {
 9	io.WriteString(w, "hello")
10}
11
12func main() {
13	http.HandleFunc("/", sayHello)
14	http.ListenAndServe(":10000", nil)
15}

consul-web

可以看到我们的服务已经注册上来,并且是健康状态。

查询服务

 1dig @127.0.0.1 -p 8600 web.service.consul
 2
 3; <<>> DiG 9.10.6 <<>> @127.0.0.1 -p 8600 web.service.consul
 4; (1 server found)
 5;; global options: +cmd
 6;; Got answer:
 7;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6969
 8;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
 9;; WARNING: recursion requested but not available
10
11;; OPT PSEUDOSECTION:
12; EDNS: version: 0, flags:; udp: 4096
13;; QUESTION SECTION:
14;web.service.consul.		IN	A
15
16;; ANSWER SECTION:
17web.service.consul.	0	IN	A	127.0.0.1
18
19;; Query time: 6 msec
20;; SERVER: 127.0.0.1#8600(127.0.0.1)
21;; WHEN: Sat Mar 14 21:27:20 CST 2020
22;; MSG SIZE  rcvd: 63