第一部分:Consul 基礎
1,Consul 介紹
官網文檔描述:Consul 是一個網絡工具,提供功能齊全的服務網格和服務發現。html
它能夠作什麼:自動化網絡配置,發現服務並啓用跨任何雲或運行時的安全鏈接。node
那麼,咱們對 Consul 的理解,就是服務網格、服務發現,官網文檔說的這兩個特徵,究竟是啥意思?跨什麼雲?linux
下面,咱們將經過實踐操做,逐漸瞭解 Consul,搭建出一個真實的 Consul 服務來體驗。git
2,安裝 Consul
兩臺服務器上都須要安裝 Consul,具體步驟能夠參考下面的說明。github
Ubuntu/Debian 系統
# 添加 GPG key curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - # 添加 倉庫 # 若是執行後提示 apt-add-repository: command not found # 可先安裝:apt-get install software-properties-common sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" # 更新源以及安裝 consul sudo apt-get update && sudo apt-get install consul
Centos/RHEL 系統
# 使用 yum-config-manager 管理倉庫 sudo yum install -y yum-utils # 鏈接倉庫 sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo # 安裝 sudo yum -y install consul
檢查安裝
可輸入 consul
檢查是否安裝成功,若是有信息輸出即說明安裝成功。web
root@50skbjiynxyxkcfh:~# consul Usage: consul [--version] [--help] <command> [<args>] Available commands are: acl Interact with Consul's ACLs agent Runs a Consul agent catalog Interact with the catalog config Interact with Consul's Centralized Configurations connect Interact with Consul Connect debug Records a debugging archive for operators event Fire a new event exec Executes a command on Consul nodes ... ...
3,運行 Consul Agent
文章通常都會說一個 Consul 服務或者一個 Consul 實例,官網文檔稱爲 Agent,這個要記住。爲了不誤解,本文提到的代理指 proxy,通常使用 proxy 和 agent 單詞說明。redis
Agent 能夠以服務器模式(server mode)或客戶端模式(client mode)運行,多個Agent 組成一個 Consul datacenter,每一個 Consul datacenter 至少有一個 Agent 屬於 服務器模式。json
官方不建議單服務器部署。bootstrap
啓動 agent
前面說到過,agent 表示一個 Consul 實例。api
由於如今處於探索實踐階段,爲了不各類加密安全問題等,咱們須要使用 -dev
參數,以開發模式啓動。
# $> consul agent # Runs a Consul agent consul agent -dev
執行這個命令後,consul 會被啓動起來,而且佔用終端。
啓動過程當中注意留意信息,若是啓動失敗,須要自行根據提示解決問題。如端口衝突:
發現數據中心成員
執行 consul members
命令能夠發現數據中心成員。
root@50skbjiynxyxkcfh:~# consul members Node Address Status Type Build Protocol DC Segment 50skbjiynxyxkcfh 172.31.0.6:8301 alive client 0.5.2 2 dc1 <default>
意思是檢查當前 Consul 服務的成員組成,目前是單服務器,因此只有一個成員。
這裏不須要留意有什麼用途,只要記得這個命令就行,後面咱們會使用到這個命令查看信息。
查看 UI
假如服務器 IP 是 172.31.0.6 ,則能夠經過 http://172.31.0.6:8500 訪問 consul 的 UI服務(http apis)。
4,在 Consul Service Discovery 中註冊服務
本小節將介紹 Consul 中的一些網絡知識,端口與dns的說明;
而後經過實例講解如何定義服務以及註冊服務到 Consul 中 -- Consul 服務發現。
端口
這裏先說明一些 Consul 的端口。
官網文檔:Before running Consul, you should ensure the following bind ports are accessible.
翻譯:在運行 Consul 以前,須要確保如下端口都是能夠訪問的。
文檔地址:https://www.consul.io/docs/install/ports.html
對於一些重要的配置,要查看官方文檔原版,別百度,不少文章只是機器翻譯或者 copy 命令,會讓你進坑的。
Use | Default Ports |
---|---|
DNS: The DNS server (TCP and UDP) | 8600 |
HTTP: The HTTP API (TCP Only) | 8500 |
HTTPS: The HTTPs API | disabled (8501)* |
gRPC: The gRPC API | disabled (8502)* |
LAN Serf: The Serf LAN port (TCP and UDP) | 8301 |
Wan Serf: The Serf WAN port (TCP and UDP) | 8302 |
server: Server RPC address (TCP Only) | 8300 |
Sidecar Proxy Min: Inclusive min port number to use for automatically assigned sidecar service registrations. | 21000 |
Sidecar Proxy Max: Inclusive max port number to use for automatically assigned sidecar service registrations. | 21255 |
*For HTTPS
and gRPC
the ports specified in the table are recommendations.
8500(http)、8501(https)、8502(gRPC) 三個接口能夠經過遠程請求調用相關的服務,或者直接訪問。
8501,8502 兩個端口都是 disabled,因此咱們能夠先看一下 8500 端口的做用,其餘端口後面慢慢用到再解釋。
打開你的瀏覽器,訪問 http://{你的ip}:8500
,會發現跳到了一個 UI 界面。
若是要查看端口被哪一個進程佔用,可使用
lsof -i:8081
命令,8081 是要查詢的端口。
定義服務
本小節講解如何經過配置文件以及命令形式,定義服務並向 Consul 註冊服務。
打開或新建(若是不存在) /etc/consul.d
目錄,後面使用此目錄做爲 Consul 配置文件的存放位置。
在目錄中新建一個 web.json 文件,用於定義服務。
touch web.json
編輯文件,修改其內容爲:
{ "service": { "name": "web", "tags": [ "rails" ], "port": 8080 } }
端口可自由設置;這裏定義了一個名稱爲 web 的服務,其端口爲 8080。
使用配置啓動服務
咱們定義配置目錄和配置文件後,可使用配置文件從新啓動節點:
consul agent -dev -enable-script-checks -config-dir=/etc/consul.d
-enable-script-checks
能夠開啓配置文件檢查,加強安全性,由於配置文件能夠啓用腳本,致使可能會引入一個遠程執行漏洞。固然,本文的實踐步驟還用不上,這裏先預熱。
如無心外,會提示如下信息:
2020/11/21 10:09:25 [INFO] agent: Synced service "web" 2020/11/21 10:09:25 [DEBUG] agent: Node info in sync 2020/11/21 10:09:25 [DEBUG] agent: Service "web" in sync 2020/11/21 10:09:25 [DEBUG] agent: Node info in sync
如何從新加載配置文件
若是你修改了配置文件,可使用命令讓 Consul 從新加載配置文件,而無需重啓。
$ consul reload Configuration reload triggered
5,查詢服務
咱們將服務添加到 Consul 後,可使用 DNS接口 或 HTTP API 對其進行查詢,其它應用能夠經過 Consul 網絡接口查詢到 Consul 提供了什麼服務,這就是服務發現(不知道個人理解對不對)。
經過 HTTP API
經過 Consul HttpAPI 服務,咱們能夠查詢到服務列表,其 URL 爲 /v1/catalog/service/web
。
經過命令查詢:
curl http://localhost:8500/v1/catalog/service/web
也可使用瀏覽器訪問。
返回的 json 中列出了全部服務節點,以及每一個服務實例的信息、狀態,根據 json 信息,能夠發現服務。
當你發現服務後,能夠經過 json 中的信息,獲取服務的 ip 和端口,這樣就能夠正式鏈接到這個服務了。
經過 UI 查詢
訪問 http://{你的ip}:8500
,在 UI 上會發現註冊了一個叫 web 的服務。
6,DNS 知識與查詢
基礎知識
Linux 中,dig 命令用於查詢一個域名的 DNS 信息,使用示例:
dig baidu.com
... ... baidu.com. 375 IN A 220.181.38.148 baidu.com. 375 IN A 39.156.69.79 ... ...
DNS 查詢的標準端口號是 53,經過這個端口號,能夠向 DNS 服務器查詢更多的域名信息。
DNS 有 A 記錄(解析到 IP)、CNAME(別名,解析到域名)等類型,有興趣的話自行查找資料瞭解。
dig 命令請參考 https://linux.die.net/man/1/dig
dig 的其中一個查詢格式爲:
dig [@server] [-p {port}] [name]
dig @127.0.0.1 -p 8600
是指定 8600 端口做爲 DNS 服務查詢的端口;name 名稱則表示要指定查詢的資源名稱。
記住這個查詢格式。
經過 DNS 查詢 Consul 服務信息
前面已經註冊了 web 服務,那麼 如何經過 Consul 的 DNS 接口(8600端口)查詢 web 服務的信息?
可在在默認主機上執行:
dig @127.0.0.1 -p 8600 web.service.consul
關於 dig 命令,前面已經講解了,web.service.consul
就是 [name]
部分。Consul 會將註冊的服務名稱加上 .service.consul
作爲命名。
那麼,查詢這個 DNS 有啥用?這裏先記下來,後面咱們繼續搗鼓。
小結
目前咱們已經學會使用 命令註冊服務,可是由於只是 「配置」 了一下,web(8080端口)服務,壓根不存在真正的服務。後面咱們將經過部署真實的 web 服務,而後註冊到 Consul 中。
7,將數據存儲在Consul KV 中
打開你的 Consul UI 界面,如圖:
你能夠經過 UI 界面建立鍵值數據,也能夠經過命令行形式 CURD 鍵值數據。命令行示例以下:
增長或修改:
consul kv put {key} {value}
獲取值:
consul kv get {key}
刪除鍵:
consul kv delete {key}
示例:
consul kv put name 癡者工良
第二部分:深刻 Consul
本章內容介紹如何使用 Consul Service Mesh 鏈接服務、代理服務;創建數據中心,部署多個實例;
8,Consul Service Mesh
瞭解 Consul Service Mesh
Consul Service Mesh 是經過基於身份的受權、L7流量管理和服務對服務加密,爲現代應用程序網絡和安全性建立一致的平臺。
它有什麼用處?
例如,在多個集羣和環境之間聯合領事,建立一個全球服務網格。跨平臺一致地應用策略和安全。以下圖所示:
筆者注:envoy 是第三方開源邊緣和服務代理,並非 Consul 的功能,Consul 自帶的是 Consul connect。
Consul Service Mesh 應用場景可參考:https://www.consul.io/use-cases/multi-platform-service-mesh
Consul Service Mesh 能夠經過代理將多臺服務器中的服務關聯起來,使得其可以經過專用網絡相互訪問。
詳細請點擊 https://www.consul.io/docs/connect/gateways/mesh-gateway
部署真實服務
在 Consul 官網文檔,使用了 socat 來演示一個服務,並註冊到 Consul 中,,筆者以爲過於麻煩,這裏筆者爲了更好地學習 Consul ,使用 rust 編寫了一個輕量的 web 服務,Windows 大小 4MB,Linux 下 8MB,無需安裝任何依賴。
建議讀者使用筆者寫的這個 Web demo 做爲真實服務部署,這個 demo 已開源,下載地址:
https://github.com/whuanles/consulweb/releases
下載文件完畢後,上傳到服務器空目錄中。
爲了自定義綁定 web 服務地址,須要新建一個 option.txt 文件,其內容以下:
0.0.0.0:8081
快速建立文件命令:
echo "0.0.0.0:8081" > option.txt
Web 服務支持部署靜態文件,你能夠新建靜態網頁文件如 index.html,放到程序目錄下,而後經過綁定的 ip 和端口便可訪問。
記得給 web 賦予權限:
chmod +x web
執行 ./web
啓動 web 服務,執行 nohup ./web &
後臺 運行 web 服務。
這樣咱們就有一個真實的 web 服務了,你們可使用瀏覽器訪問測試。
真實註冊服務
使用筆者或者自定義編寫的服務後,須要將這個服務註冊到 Consul 中。
在 /etc/consul.d 目錄,新建 realweb.json
文件。
{ "service": { "name": "realweb", "port": 8081, "connect": { "sidecar_service": {} } } }
而後執行 consul reload
從新加載配置文件。
註冊代理
爲啥要註冊代理呢?
前面通過實踐,咱們已經學會了註冊服務以及服務發現,一開始介紹 Consul 時,咱們還看到 「Consul 提供功能強大的 服務網格」、「安全的鏈接」 等,那麼咱們經過這裏的步驟(代理),就是體會 Consul 的這個特徵功能。
前面已經註冊了 realweb
這個服務,如今咱們開啓代理,在新的終端窗口,執行:
consul connect proxy -sidecar-for realweb
能夠看到,Consul 使用 21000 端口來代理 realweb 服務。
這個代理功能稱爲 Consul Connect。
可是這個端口是不能訪問的,其基本結構以下:
源 代理後 ------------------ ------------------ |8081 <---> 21000| <----> |21001 <---> 9191| ------------------ ------------------
8081(源) 和 9191(代理的端口) 均可以訪問,21000 和 21001 都是屬於橋接端口,不能訪問。
代理服務
前面註冊 realweb 代理服務後(8081 <---> 21000
),咱們開始對其進行代理(21001 <---> 9191
)。
這裏的代理,是經過 Consul Service Mesh 使用 Sidecar 代理將服務相互鏈接,這種功能就叫 服務網格。
源 代理後 -------------------------- -------------------------- |8081 <-----------> 21000| <--------> |21001 <-----------> 9191| | Consul Connect | Sidecar | Consul Connect | -------------------------- --------------------------
爲了實現代理,須要建立新的配置文件,註冊服務。
新建一個終端窗口,在 /etc/consul.d/
目錄新建一個 proxyweb.json 文件。
其內容以下:
{ "service": { "name": "proxyweb", "connect": { "sidecar_service": { "proxy": { "upstreams": [ { "destination_name": "realweb", "local_bind_port": 9191 } ] } } } } }
能夠將 Connect 代理的每一個上游配置爲經過網狀網關進行路由。local_bind_port
表示代理服務後,使用哪一個端口做爲代理端口。
綁定的代理端口多是如下幾種狀況(這裏直接搬文檔):
local
-在這種模式下,Connect代理創建與同一數據中心中運行的網關的出站鏈接。而後,該網關負責確保將數據轉發到目標數據中心中的網關。remote
-在此模式下,Connect代理創建與目標數據中心中運行的網關的出站鏈接。而後,該網關將數據轉發到最終目標服務。none
-在此模式下,不使用網關,而且Connect代理將其出站鏈接直接鏈接到目標服務。
建立配置完畢後(註冊服務),執行 consul reload
從新加載配置文件。
而後執行命令開始代理服務。
consul connect proxy -sidecar-for proxyweb
驗證代理
建立代理完畢後,咱們檢查代理是否正常。
新建一個終端窗口,執行訪問目錄:
curl http://127.0.0.1:9191
root@50skbjiynxyxkcfh:~# curl http://127.0.0.1:9191 <h3>恭喜你,部署 Consul 服務成功!</h3><br><br><br><br>記得給筆者 癡者工良 點一下贊喲~~~
本來 realweb
服務暴露的端口爲 8081
,而後建立一個叫 proxyweb 的代理,其端口變成 9191
,以後咱們可使用 9191
來訪問這個 realweb
服務。
下圖是從官網淘過來的,你們能夠根據圖片理解一下
假如搭建了一個微服務,其中一臺主機有個服務是 redis,端口是 9003,你會把 redis 暴露到公網上麼?確定不能呀,因而經過代理功能,將 redis 服務代理到另外一臺 web 服務器,端口變成 5000,web 程序能夠訪問 redis 服務,可是外界不能訪問。
而後 web 提供 9002 端口給用戶,用戶能夠訪問 web 網頁服務。
UI 界面查看
打開 Consul 界面,能夠看到代理服務。
9,Consul 集羣/數據中心
本章內容將介紹如何將兩臺服務器的 Agent 關聯起來,創建數據中心。
開始準備
這裏須要兩臺服務器才行,固然官方文檔提供了使用虛擬機的方法部署另外一個系統,可是這裏不提倡,仍是老老實實搞兩臺服務器實際,否則你學啥集羣和微服務。。。
在 Linux 快速部署虛擬機:https://learn.hashicorp.com/tutorials/consul/get-started-create-datacenter?in=consul/getting-started
切換到副服務器/虛擬機中,按照前面第二小節的安裝教程,安裝 consul。
在 主服務器上,中止 Consul,並關閉其它終端窗口,只留一個終端窗口就行。
root@50skbjiynxyxkcfh:~# top | grep consul 32318 root 20 0 785168 66096 49008 S 1.3 3.2 13:52.93 consul root@50skbjiynxyxkcfh:~# kill 32318
啓動 Consul 中心
在主服務器中執行如下命令,啓動 Consul 實例。
# -bind 填寫子網ip或公網ip,另外一臺服務器能夠訪問的ip consul agent \ -dev -server \ -bootstrap-expect=1 \ -node=agent-one \ -bind=172.31.0.6 \ -data-dir=/tmp/consul \ -config-dir=/etc/consul.d
server
-提供此標誌表示您但願代理以服務器模式啓動。-bootstrap-expect
-這告訴 Consul datacenter 總共應該有多少臺服務器。-node
-數據中心中的每一個節點必須具備惟一的名稱。-bind
-這是該代理將偵聽其餘 Consul 成員進行通訊的地址。填子網ip或公網ip。data-dir
-此標誌告訴 Consul Agent 他們應將狀態存儲在哪裏,其中能夠包括服務器和客戶端的敏感數據(如ACL令牌)。config-dir
-此標誌告訴Consul在哪裏尋找其配置。
啓動成功後,會提示:
2020-11-21T07:46:59.903+0800 [INFO] agent.server: federation state anti-entropy synced 2020-11-21T07:46:59.903+0800 [INFO] agent: Synced node info 2020-11-21T07:46:59.911+0800 [INFO] agent: Synced service: service=web 2020-11-21T07:46:59.923+0800 [INFO] agent: Synced service: service=proxyweb 2020-11-21T07:46:59.939+0800 [INFO] agent: Synced service: service=proxyweb-sidecar-proxy 2020-11-21T07:46:59.961+0800 [INFO] agent: Synced service: service=realweb 2020-11-21T07:46:59.971+0800 [INFO] agent: Synced service: service=realweb-sidecar-proxy
若是有報 realweb、proxy 代理錯誤的信息,能夠忽略掉。
啓動客戶端
在副服務器上,執行如下命令啓動一個新的 Agent。
consul agent \ -node=agent-two \ -bind=172.31.0.7 \ -enable-script-checks=true \ -data-dir=/tmp/consul \ -config-dir=/etc/consul.d
檢查成員信息
到目前爲止,咱們有兩臺服務器,每臺服務器都部署了 Consul 實例,可是他們都是獨立的,尚未被關聯起來。
咱們能夠在每臺服務器上執行如下命令檢查其成員信息:
consul members
# consul server 1 Node Address Status Type Build Protocol DC Segment agent-one 172.31.0.6:8301 alive server 1.8.6 2 dc1 <all> # consul server 2 Node Address Status Type Build Protocol DC Segment agent-two 172.31.0.7:8301 alive client 1.8.6 2 dc1 <default>
關聯服務器
如今,咱們把副服務器(172.31.0.7)加入到主服務器(172.31.0.6)中。
在副服務器上執行如下命令:
consul join 172.31.0.6
從新在每臺服務器下執行 consul members
命令查當作員信息:
# consul server 1 Node Address Status Type Build Protocol DC Segment agent-one 172.31.0.6:8301 alive server 1.8.6 2 dc1 <all> agent-two 172.31.0.7:8301 alive client 1.8.6 2 dc1 <default> # consul server 2 Node Address Status Type Build Protocol DC Segment agent-one 172.31.0.6:8301 alive server 1.8.6 2 dc1 <all> agent-two 172.31.0.7:8301 alive client 1.8.6 2 dc1 <default>
打開 UI 查看服務節點信息
打開 Consul UI 界面(8500端口),點擊 Nodes ,便可看到 Consul 全部服務器節點。
10,集羣代理服務
本章內容講述如何經過代理功能,將一臺主機的服務在代理到另外一臺服務器中訪問。
提供代理服務
在主服務器上把 proxyweb 終端關掉(已關掉請忽略),進入 /etc/consul.d 目錄把 proxyweb.json
刪除,從新加載配置:
consul reload
而後啓動代理功能(Consul connect):
consul connect proxy -sidecar-for realweb
另外一臺服務器代理
在副服務器的 /etc/consul.d/
目錄中,新建一個 proxyweb.json 文件,其內容以下:
{ "service": { "name": "proxyweb", "connect": { "sidecar_service": { "proxy": { "upstreams": [ { "destination_name": "realweb", "local_bind_port": 9191 } ] } } } } }
從新加載配置:
consul reload
啓動代理服務
consul connect proxy -sidecar-for proxyweb
驗證代理
在副服務器打開新的窗口,執行:
curl http://127.0.0.1:9191
發現
<h3>恭喜你,部署 Consul 服務成功!</h3><br><br><br><br>記得給筆者 癡者工良 點一下贊喲~~~
說明經過代理服務,能夠將一臺主機的服務(端口),在另外一臺主機上使用別的端口(相同端口也能夠)訪問這個服務。
關於 Consul 入門的教程就到這裏爲止~後面筆者會繼續寫 Consul ,歡迎關注~