微服务系列(4)Consul介绍
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架构
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
可以看到我们集群中已经有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}
可以看到我们的服务已经注册上来,并且是健康状态。
查询服务
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
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/2020-03-15-Microservice_Consul/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。