1. 程式人生 > >SpringCloud框架Consul一站式註冊與發現

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下載頁面:

https://www.consul.io/downloads.html

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 joinconsul 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