SpringCloud框架Consul一站式註冊與發現
1. Consul介紹
Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配
置。與其他分散式服務註冊與發現的方案,Consul的方案更“一站式”,內建了服務
註冊與發現框 架、分佈一致性協議實現、健康檢查、Key/Value儲存、多資料中心
方案,不再需要依賴其他工具(比如ZooKeeper等)。使用起來也較 為簡單。
Consul使用Go語言編寫,因此具有天然可移植性(支援Linux、windows和Mac OS
X);安裝包僅包含一個可執行檔案,方便部署,與Docker等輕量級容器可無縫配合
。
下面以Consul 在CentOS 7系統下為例,講解Consul的安裝及使用,其他平臺的安
裝也是類似的,所使用的Consul 版本為v0.7.0。
Consul下載頁面:
2.Consul安裝與使用
準備工作
一臺CentOS 7 機器,輸入 ifconfig ,檢視網絡卡資訊如下:
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 150
0
inet 192.168.11.143 netmask 255.255.255.0 broadcast 19
2.168.11.255
inet6 fe80::20c:29ff:fe89:6b91 prefixlen 64 scopeid 0x
20<link>
ether 00:0c:29:89:6b:91 txqueuelen 1000 (Ethernet)
RX packets 752526 bytes 705406371 (672.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 142062 bytes 18646825 (17.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions
0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10< host>
loop txqueuelen 0 (Local Loopback)
RX packets 172 bytes 1003766 (980.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 172 bytes 1003766 (980.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions
0
我們可以看到,該機器有兩個IP:
192.168.11.143
127.0.0.1
安裝Consul(以CentOS7為例):
cd /usr/local/bin/
wget https://releases.hashicorp.com/consul/0.7.0/consul_0.7.0_linux_amd64.zip
unzip consul0.7.0linux_amd64.zip
得到 consul 檔案,這樣就完成了安裝。
./consul agent -dev # -dev表示開發模式執行,另外還有-server表示服務模式執行
輸入 http://127.0.0.1:8500/ui/ 訪問Consul,可檢視到如下介面:
我們嘗試訪問 http://192.168.11.143/ui/ ,會發現無法訪問。說明Consul
還不能被遠端訪問。那麼如何設定才能被遠端訪問呢?Consul如何高可用呢?
3.Consul常用命令
consul agent 命令詳解
consul agent 命令的常用選項,如下:
-data-dir
作用:指定agent儲存狀態的資料目錄
這是所有agent都必須的
對於server尤其重要,因為他們必須持久化叢集的狀態
-config-dir
作用:指定service的配置檔案和檢查定義所在的位置
通常會指定為"某一個路徑/consul.d"(通常情況下,.d表示一系列配置文
件存放的目錄)
-config-file
作用:指定一個要裝載的配置檔案
該選項可以配置多次,進而配置多個配置檔案(後邊的會合並前邊的,相
同的值覆蓋)
-dev
作用:建立一個開發環境下的server節點
該引數配置下,不會有任何持久化操作,即不會有任何資料寫入到磁碟
這種模式不能用於生產環境(因為第二條)
-bootstrap-expect
作用:該命令通知consul server我們現在準備加入的server節點個數,該
2.1.5 Consul常用命令
引數是為了延遲日誌複製的啟動直到我們指定數量的server節點成功的加
入後啟動。
-node
作用:指定節點在叢集中的名稱
該名稱在叢集中必須是唯一的(預設採用機器的host)
推薦:直接採用機器的IP
-bind
作用:指明節點的IP地址
有時候不指定繫結IP,會報 Failed to get advertise address:
Multiple private IPs found. Please configure one. 的異常
-server
作用:指定節點為server
每個資料中心(DC)的server數推薦至少為1,至多為5
所有的server都採用raft一致性演算法來確保事務的一致性和線性化,事務修
改了叢集的狀態,且叢集的狀態儲存在每一臺server上保證可用性
server也是與其他DC互動的門面(gateway)
-client
作用:指定節點為client,指定客戶端介面的繫結地址,包括:HTTP、
DNS、RPC
預設是127.0.0.1,只允許迴環介面訪問
若不指定為-server,其實就是-client
-join
作用:將節點加入到叢集
-datacenter(老版本叫-dc,-dc已經失效)
作用:指定機器加入到哪一個資料中心中
如上,大家應該可以猜到,
使用 -client 引數可指定允許客戶端使用什麼ip去訪問,例如 -client
192.168.11.143 表示可以使用 http://192.168.11.143:8500/ui 去訪問。
我們嘗試一下:
consul agent -dev -client 192.168.11.143
發現果然可以使用 http://192.168.11.143:8500/ui 訪問了。
參考文件
官方文件:https://www.consul.io/docs/agent/options.html
Consul系列部落格:http://www.cnblogs.com/java-zhao/p/5378876.html
4.Consul 的高可用
這邊準備了三臺CentOS 7的虛擬機器,主機規劃如下,供參考:
搭建步驟:
- 啟動node0機器上的Consul(node0機器上執行):
consul agent
-data-dir /tmp/node0
-node=node0
-bind=192.168.11.143
-datacenter=dc1 -ui
-client=192.168.11.143
-server -bootstrap
-expect 1
- 啟動node1機器上的Consul(node1機器上執行):
consul agent -data-dir /tmp/node1
-node=node1 -bind=192.168.11.144
-datacenter=dc1 -ui
- 啟動node2機器上的Consul(node2機器上執行):
consul agent -data-dir /tmp/node2 -node=node2
-bind=192.168.11.145 -datacenter=dc1 -ui -client=192.168.11.145
- 將node1節點加入到node0上(node1機器上執行):
consul join 192.168.11.143
- 將node2節點加入到node0上(node2機器上執行):
consul join -rpc-addr=192.168.11.145:8400 192.168.11.143
- 這樣一個簡單的Consul叢集就搭建完成了,在node1上檢視當前叢集節點:
consul members -rpc-addr=192.168.11.143:8400
結果如下:
Node Address Status Type Build Protocol DC
node0 192.168.11.143:8301 alive server 0.7.0 2 dc1
node1 192.168.11.144:8301 alive client 0.7.0 2 dc1
node2 192.168.11.145:8301 alive client 0.7.0 2 dc1
說明叢集已經搭建成功了。
我們分析一下,為什麼第5步和第6步需要加 -rpc-addr
選項,而第4步不需要加
任何選項呢?原因是-client
指定了客戶端介面的繫結地址,包括:HTTP、
DNS、RPC,而 consul join
、 consul members
都是通過RPC與Consul交
互的。
訪問叢集
如上,我們三個節點都加了 -ui 引數啟動了內建的介面。我們可以通
過: http://192.168.11.143:8500/ui/ 或
者 http://192.168.11.145:8500/ui/ 進行訪問,也可以在node1機器上通
過 http://127.0.0.1:8500/ui/ 進行訪問,原因是node1沒有開啟遠端訪問 ,
三種訪問方式結果是一致的,如下:
參考文件:
Consul官方文件:https://www.consul.io/intro/getting-started/install.html
Consul 系列博文:http://www.cnblogs.com/javazhao/
archive/2016/04/13/5387105.html
使用consul實現分散式服務註冊和發
現:http://www.tuicool.com/articles/M3QFven