微服務帶來最大的好處就是把整個大項目分割成不同的服務,運行在不同服務器上,實現解耦和分布式處理。微服務雖然有很多好處,但是也會有不好的一方面。任何事物都會有兩面性,在微服務里面運維會是一個很大的難題,如果有一天我們的服務數量非常的多,然后我們又不知道哪一個服務在什么機器上。可能會有人說這部分直接寫在程序的配置里面就好了,當我們服務少的時候是可以這么做的,也允許這么做,但是在實際當中我們要盡量避免這么做,比如說我們某一個服務,地址換了,那么我們設計的相關代碼就得修改重新部署;又或者說我們有一天上線一個新服務或者下線一個服務,這時候我們又得修改程序代碼,這是非常不合理的做法。那么有沒有什么可以解決這樣的問題呢?這里就需要用到我們的服務注冊和發現了。
沒有服務注冊發現的結構
上面圖片我們可以看到在沒有服務注冊發現的時候一個調用者需要維護多個服務的ip和端口,這是非常不好的做法,當我們服務進行調整的時候就有可能導致服務調用失敗,還有服務器更換服務器,上下新服務,都會受到影響。將來某一個服務節點出現問題,排查對於程序和運維人員來說都是一場很大的災難,因為不知道哪一個節點出了問題,需要每一台服務器的去排查。
而當我們有使用服務注冊發現之后的結構體是什么樣子的呢?
我們從上圖可以發現,當我們有注冊中心之后調用者不需要自己去維護所有服務的信息了,僅需要向注冊中心請求獲取服務,就可以拿到想要的服務信息。這樣當我們的服務有所調整,或者上線下線服務,都要可以輕松操作,並且可以在注冊中間檢查到服務的健康情況,幫助運維人員快速定位到故障的服務器。
在Swoft這個框架里面推薦我們使用的就是consul,consult是一個使用go寫的服務注冊、發現、配置管理系統。
Agent:Agent是Consul集群中一個常駐后台的程序。Agent有兩種模式,一種是服務端,一種是客戶端。所有Agent都可以運行DNS或者HTTP接口,並且負責檢查服務是否存活,和保持服務同步。
Client:Client是一種Agent的運行模式,把所有RPC轉發到Agent服務器的代理者,客戶端會在后台有一個用最小帶寬消耗把請求轉發到后端的Agent服務,減輕Agent服務器的壓力。
Server:Server是另一種Agent的運行模式,包括使用Raft算法處理數據,維護集群狀態,響應RPC的請求,與其他集群的server交換數據或者遠程數據中心。
RPC:遠程過程調用,這是一種允許客戶端發出服務器請求的請求/響應機制。
在consult里面有很多組件,在這里我們暫時使用一個組件就夠了就是agent,對於consul的安裝也是非常簡單的畢竟只有一個二進制文件包,所以直接下載就可以使用了。
安裝步驟
1、登錄官網進行下載,https://www.consul.io/downloads.html
wget https://releases.hashicorp.com/consul/1.2.1/consul_1.2.1_linux_amd64.zip
unzip consul_1.2.1_linux_amd64.zip
2、設置環境變量,如果不設置可以直接把consul執行文件移動到/usr/bin目錄下
mv consul /usr/bin
3、Server配置
單機配置
服務器1,IP 192.168.1.100
這種方式適合用於搭建服務調試使用
consul agent -bootstrap-expect 1 -server -data-dir /data/consul -node=swoft01 -bind=0.0.0.0 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=sunny -client=0.0.0.0 -ui
可以通過 http://192.168.1.100:8500 查看服務信息
集群配置
這種方式適用於生產環境
服務器1,IP 192.168.1.100
consul agent -bootstrap-expect 2 -server -data-dir /data/consul -node=swoft01 -bind=0.0.0.0 -client=0.0.0.0 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=sunny -client=0.0.0.0
上面這個命令是以服務端模式啟動一個代理,進群有兩個擴展機器,設置集群持久化數據存放在/data/consul0下面,節點名稱是swoft01,綁定0.0.0.0地址,服務配置文件存放在/etc/consul.d,開啟檢查心跳,數據中心的名稱是dc1,可訪問的客戶端地址是0.0.0.0
服務器2,IP 192.168.1.110
consul agent -server -data-dir /data/consul -node=swoft02 -bind=0.0.0.0 -client=0.0.0.0 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=sunny -join 192.168.1.100
服務器3,IP 192.168.1.120
consul agent -server -data-dir /data/consul -node=swoft03 -bind=0.0.0.0 -client=0.0.0.0 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=sunny -join 192.168.1.100
以上服務器2和服務3使用 -join 加入集群,並且使用同一個數據名稱sunny
4、Client配置
服務器4,IP 192.168.1.130
consul agent -ui -data-dir /data/consul -node=swoft04 -bind=0.0.0.0 -config-dir /etc/consul.d -enable-script-checks=true -datacenter=sunny -ui -client=0.0.0.0 -join 192.168.1.100
客戶端如果不使用-server就是客戶端模式運行,其他參數同上,服務端和客戶端都啟動了之后可以在瀏覽器輸入 http://192.168.1.130:8500 來查看信息
查看集群成員
consul members
查看集群信息
consul info
命令解析
更多https://www.consul.io/docs/agent/options.html
-bootstrap-expect 數據中心中預期的服務器數。不應提供此值,或者該值必須與群集中的其他服務器一致。提供后,Consul將等待指定數量的服務器可用,然后引導群集。這允許自動選擇初始領導者。這不能與傳統-bootstrap標志一起使用。此標志需要在服務端模式下運行。
-server 以服務端模式啟動
-data-dir 數據存放位置,這個用於持久化保存集群狀態
-node 群集中此節點的名稱。這在群集中必須是唯一的。默認情況下,這是計算機的主機名。
-bind 綁定服務器的ip地址
-config-dir 指定配置文件服務,當這個目錄下有 .json 結尾的文件就會加載進來,更多配置可以參考https://www.consul.io/docs/agent/options.html#configuration_files
-enable-script-checks 檢查服務是否處於活動狀態,類似開啟心跳
-datacenter 數據中心名稱
-client 客戶端可訪問ip,包括HTTP和DNS服務器。默認情況下,這是“127.0.0.1”,僅允許環回連接。
-ui 開啟web的ui界面
-join:加入到已有的集群中
關於consul更多的信息請大家移步到https://www.consul.io/