服務(wù)發(fā)現(xiàn)的定義:
服務(wù)發(fā)現(xiàn)是伴隨著微服務(wù)體系而產(chǎn)生的暂衡。在微服務(wù)誕生以前声畏,又或者我們的網(wǎng)絡(luò)應(yīng)用沒有那么大的并發(fā)請求量,單體應(yīng)用完全可以滿足網(wǎng)絡(luò)服務(wù)的設(shè)計要求桐猬。在微服務(wù)體系中撑蚌,單體應(yīng)用被按照功能模塊拆分成了許多的個體應(yīng)用上遥,這些應(yīng)用之間由原本的進(jìn)程內(nèi)通訊變成了進(jìn)程間甚至是網(wǎng)絡(luò)間通訊,如何彼此的相互感知就成了一個技術(shù)問題争涌,服務(wù)發(fā)現(xiàn)由此而生粉楚。
服務(wù)發(fā)現(xiàn)通常包含三個角色:
服務(wù)中介—— 服務(wù)中介是聯(lián)系服務(wù)提供者與服務(wù)消費者的橋梁,為服務(wù)消費者指供服務(wù)提供者的感知服務(wù)亮垫。
服務(wù)提供者—— 向服務(wù)中介注冊自己的地址和身份信息模软,供服務(wù)消費者發(fā)現(xiàn)和訪問。
服務(wù)消費者—— 從服務(wù)中介查詢服務(wù)提供者地址和身份信息饮潦,根據(jù)策略選擇其中一個進(jìn)行訪問燃异。
引用網(wǎng)絡(luò)上的描述圖:
最簡單的服務(wù)發(fā)現(xiàn):
DNS應(yīng)該算是最經(jīng)典的服務(wù)發(fā)現(xiàn)應(yīng)用之一了。
上世紀(jì)60年末代害晦,美國國防部高級研究計劃署(ARPA特铝,后來的DARPA)資助試驗性廣域計算機(jī)網(wǎng)絡(luò)暑中,稱為ARPAnet壹瘟,其初衷是將電腦主機(jī)連接起來,共享計算機(jī)資源鳄逾。70年代時稻轨,ARPAnet只是一個擁有幾百臺主機(jī)的小網(wǎng)絡(luò),僅需要一個HOSTS文件就可以容納所需要主機(jī)信息雕凹,HOSTS提供的是主機(jī)名和IP地址的映射關(guān)系殴俱,也就是說可以用主機(jī)名進(jìn)行網(wǎng)絡(luò)信息的共享政冻,而不需要記住IP地址。HOSTS.TXT文件是由SRI的網(wǎng)絡(luò)信息中心(Network Information Center线欲,簡稱NIC)負(fù)責(zé)維護(hù)明场,并且從一臺主機(jī)SRI-NIC上分發(fā)到整個網(wǎng)絡(luò)。ARPAnet的管理員通常是通過電子郵件通知NIC李丰,同時定期FTP到SRI-NIC上獲得最新的HOSTS.TXT文件苦锨。但是隨著ARPAnet的增長,這種方法行不通了趴泌。每臺主機(jī)的變更都會導(dǎo)致HOSTS.TXT 的變化舟舒,導(dǎo)致所有主機(jī)需要到SRI-NIC上獲得更新文件。當(dāng)ARPAnet 采用TCP/IP協(xié)議后嗜憔,網(wǎng)絡(luò)上的主機(jī)爆炸性的增長秃励,出現(xiàn)了許多問題,其中最主要的是頻繁更新導(dǎo)致的維護(hù)工作量和一致性問題吉捶。
這時候的HOSTS文件其本質(zhì)就是一個服務(wù)中介夺鲜,只不這個服務(wù)中介的性能實在是太低了。于是1983年在美國南加州大學(xué)工作的保羅·莫卡派喬斯發(fā)明和設(shè)計了DNS系統(tǒng)帚稠。DNS是一個分布式的域名數(shù)據(jù)庫谣旁,如果把它當(dāng)成一個整體來看的話,它相當(dāng)于一個域名系統(tǒng)的中介滋早,一方面它對外提供域名的注冊服務(wù)榄审,另一方面又對外提供域名到IP的查詢服務(wù)。
服務(wù)發(fā)現(xiàn)系統(tǒng)的條件:
現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)首先需要滿足分布式CAP理論杆麸。
CAP理論闡述了在上圖的三個特性中搁进,一個正常工作的分布式系統(tǒng)最多只能同時滿足其中兩個。而在大部分的分布式系統(tǒng)中昔头,設(shè)計者都考慮犧牲一致性饼问,來換取整個系統(tǒng)的可用性和分區(qū)容錯性,盡可能地使系統(tǒng)高可用揭斧。所以莱革,一個合格的現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)應(yīng)該是可以多點布署的,并且在發(fā)生網(wǎng)絡(luò)或節(jié)點故障的時候能夠自動進(jìn)行故障隔離讹开。
現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)其次需要具備友好的開發(fā)接口≈咽樱現(xiàn)代開發(fā)語言呈現(xiàn)五花八門,在很多公司的微服務(wù)團(tuán)隊中旦万,采用不同語言開發(fā)微服務(wù)單元也是所見不鮮∧只鳎現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)需要為開發(fā)者著想,提供語種比較全面的開發(fā)者接口成艘。除此之外赏半,開發(fā)者接口內(nèi)部還應(yīng)屏蔽服務(wù)發(fā)現(xiàn)實現(xiàn)過程中復(fù)雜的技術(shù)細(xì)節(jié)贺归,確保較高的性能和較低的系統(tǒng)資源占用,以及較強(qiáng)的數(shù)據(jù)一致性断箫。
現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)還應(yīng)支持對服務(wù)提供者進(jìn)行健康檢測拂酣。服務(wù)中介不能簡單地依賴服務(wù)提供者進(jìn)行啟動時注冊和退出時注銷,因為當(dāng)服務(wù)提供者發(fā)生故障時仲义,注銷操作將沒法進(jìn)行踱葛,這時需要服務(wù)中介具備健康檢測能力,淘汰故障的服務(wù)提供者光坝。
此外尸诽,現(xiàn)代服務(wù)發(fā)現(xiàn)系統(tǒng)大多還支持分布式KV存儲,KV存儲被廣泛地應(yīng)用于分布式服務(wù)配置場景盯另。雖然KV存儲不是服務(wù)發(fā)現(xiàn)的本職性含,但是從抽象角度來看,服務(wù)發(fā)現(xiàn)的分發(fā)特性非常適合網(wǎng)絡(luò)服務(wù)配置鸳惯,其內(nèi)部工作原理與分發(fā)服務(wù)提供者是相似的商蕴。
服務(wù)發(fā)現(xiàn)系統(tǒng)的選擇:
如果條件允許,我們可以選擇自研服務(wù)發(fā)現(xiàn)系統(tǒng)芝发,使用這種方法的收益和風(fēng)險都是極端的绪商。不少中大型互聯(lián)網(wǎng)公司,由于多方面的原因辅鲸,并沒有選擇開源的服務(wù)發(fā)現(xiàn)系統(tǒng)格郁,但是可以想到的是開發(fā)運維的過程中肯定也沒有少填坑。所以独悴,建議不想趟水的朋友們例书,還是盡量選擇現(xiàn)成穩(wěn)定的解決方案。
目前領(lǐng)域內(nèi)比較知名的有eureka刻炒、zookeeper决采、etcd、consul坟奥,使用java技術(shù)棧的朋友都可以選树瞭,使用c++和golang的朋友建議選用后二者,可以省去不少java運行環(huán)境的搭建和運維時間爱谁。
這里重點提一下etcd和consul晒喷,這倆位做為服務(wù)發(fā)現(xiàn)的新秀,都基于golang開發(fā)管行,列舉兩點差異:
- etcd是Apache許可厨埋,consul是MPL許可邪媳,雖然兩者都可以用于商用捐顷,但etcd更寬松荡陷。
- etcd偏向于分布式KV,拿來做服務(wù)發(fā)現(xiàn)的話需要進(jìn)行二次開發(fā)迅涮。consul則直接面向服務(wù)發(fā)現(xiàn)废赞,而且功能十分強(qiáng)大,真正的開箱即用叮姑。
如何選擇唉地,請讀者自行取舍。下面簡單地講一講Consul的基本用法传透。
Consul的安裝:
下載地址:https://www.consul.io/downloads.html
官網(wǎng)提供各個系統(tǒng)平臺的二進(jìn)制壓縮包耘沼,下載后解壓可直接使用,建議配置好PATH環(huán)境變量群嗤。
Consul的工作原理:
官方提供的架構(gòu)圖如下:
上圖顯示了兩個數(shù)據(jù)中心兵琳,分別標(biāo)注為DATACENTER1和DATACENTER2,Consul對多數(shù)據(jù)中心有非常友好的支持躯肌。在兩個數(shù)據(jù)中心分別布署有許多SERVER和CLIENT節(jié)點者春,節(jié)點之間通過GOSSIP流行病協(xié)議通信钱烟,每個節(jié)點有兩個GOSSIP池(LAN池和WAN池),LAN池用于數(shù)據(jù)中心內(nèi)部通訊嫡丙,WAN池則對所有數(shù)據(jù)中心共享忠售,用于跨數(shù)據(jù)中心通訊迄沫。
關(guān)于SERVER和CLIENT節(jié)點羊瘩,Consul規(guī)定了所有的節(jié)點一律稱為Agent,SERVER和CLIENT分別是Agent的兩個模式逝她。在CLIENT模式下睬捶,Agent不保存數(shù)據(jù)擒贸,主要面向服務(wù)提供者和服務(wù)消費者觉渴, 提供服務(wù)注冊案淋、服務(wù)查詢险绘、健康檢測等功能宦棺。在SERVER模式下,Agent除了支持CLIENT的所有功能外旨涝,還負(fù)責(zé)節(jié)點主從選舉白华、數(shù)據(jù)存儲贩耐,并維護(hù)數(shù)據(jù)一致性潮太。通常在單個數(shù)據(jù)中心,SERVER的布署數(shù)量在3~5個更鲁,而CLIENT節(jié)點奇钞,要求在除布署SERVER的機(jī)器外景埃,每臺都布署CLIENT。
關(guān)于多數(shù)據(jù)中心拒啰,通常情況下谋旦,不同的數(shù)據(jù)中心之間是不會同步數(shù)據(jù)的拴孤,但是當(dāng)對另一個數(shù)據(jù)中心的資源進(jìn)行請求時指蚜,本地SERVER會將該資源的RPC請求轉(zhuǎn)發(fā)給SERVER摊鸡,并返回結(jié)果蚕冬。
Consul命令說明:
consul命令輸出囤热,格式如下:
選取常用子命令及相應(yīng)選項旁蔼,描述如下:
agent—— 啟動代理實例棺聊,常用子命令及選項包括:
-dev
以開發(fā)者模式運行葵诈,這主要用于快速布署開發(fā)祟同,此時不支持任何持久化存儲晕城。
-server
未指明本選項的情況下,節(jié)點以CLIENT模式運行暇矫,此時僅支持服務(wù)注冊李根、健康檢測房轿、查詢和臨時狀態(tài)存儲囱持。指明本選項后,節(jié)點以SERVER模式運行盔几,此時除支持CLIENT模式的所有功能外逊拍,節(jié)點還負(fù)責(zé)參與主從選舉缨恒、數(shù)據(jù)存儲。
-ui
啟動自帶的UI管理界面辨赐。
-datacenter=<value>
指定本代理所屬的數(shù)據(jù)中心名稱,默認(rèn)為dc1。
-node=<value>
指定本代理的節(jié)點名稱,若不指定則為主機(jī)名还蹲。
-node-id=<value>
指定本代理的節(jié)點ID楣号,若不指定則自動生成归敬。
-advertise=<value>
建議設(shè)置用于集群通訊時的綁定地址呀舔,包括raft通訊地址、LAN和WAN的gossip通訊地址琳拭。
-advertise-wan=<value>
額外建議設(shè)置用于集群通訊時WAN口的gossip通訊地址。
-bind=<value>
明確設(shè)置用于集群通訊時的綁定地址耕魄,包括raft通訊地址吸奴、LAN和WAN的gossip通訊地址则奥。
-server-port=<value>
設(shè)置raft工作端口,默認(rèn)為8300糊治。
-allow-write-http-from=<value>
指定允許HTTP寫操作的許可地址井辜,格式為192.168.1.0/24粥脚,可多次指定不同的地址渐北,若不指定表示不限制赃蛛。
-serf-lan-bind=<value>
明確設(shè)置gossip LAN地址呕臂,默認(rèn)與advertise/bind指定的相同。
-serf-lan-port=<value>
設(shè)置gossip LAN工作端口土砂,默認(rèn)為8301萝映。
-serf-lan-allowed-cidrs=<value>
指定gossip LAN接入許可地址序臂,格式為192.168.1.0/24,可多次指定不同的地址逊彭,若不指定表示不限制侮叮。
-serf-wan-bind=<value>
明確設(shè)置gossip WAN地址囊榜,默認(rèn)與advertise/bind指定的相同锦聊。
-serf-wan-port=<value>
設(shè)置gossip WAN工作端口箩绍,默認(rèn)為8302材蛛。
-serf-wan-allowed-cidrs=<value>
指定gossip WAN接入許可地址怎抛,格式為192.168.1.0/24马绝,可多次指定不同的地址富稻,若不指定表示不限制椭赋。
-bootstrap
設(shè)置為啟動模式,此時節(jié)點可以選舉自己為Leader宣蔚,建議一個數(shù)據(jù)中心只啟動一個此模式的節(jié)點胚委。
-bootstrap-expect=<value>
設(shè)置當(dāng)前數(shù)據(jù)中心實際布署的SERVER節(jié)點數(shù)亩冬,選舉時達(dá)成多數(shù)派需要鉴未。
-client=<value>
設(shè)置用于查詢的綁定地址,包括HTTP和DNS淹真,默認(rèn)為127.0.0.1核蘸。
-http-port=<value>
另行設(shè)置HTTP服務(wù)端口客扎,默認(rèn)為8500徙鱼。
-dns-port=<value>
另行設(shè)置DNS服務(wù)端口针姿,默認(rèn)8600距淫。
-config-file=<value>
指定配置文件路徑榕暇。
-config-dir=<value>
指定配置文件目錄彤枢,在此目錄下的*.json文件將在啟動時被加載堂污。
-data-dir=<value>
指定數(shù)據(jù)存儲目錄盟猖,用于節(jié)點內(nèi)部的數(shù)據(jù)狀態(tài)存儲换棚。
-enable-script-checks
允許腳本類型的健康檢測固蚤,出于安全考慮默認(rèn)禁止夕玩。
-join=<value>
指定集群的其它節(jié)點地址燎孟,申請加入集群揩页,可多次設(shè)置指定多個地址烹俗。
-join-wan=<value>
額外指定集群的WAN節(jié)點地址幢妄,申請加入集群蕉鸳,可多次設(shè)置指定多個地址置吓。
-rejoin
設(shè)置節(jié)點支持?jǐn)噙B后重新加入集群衍锚。
-retry-interval=<value>
設(shè)置加入集群失敗時的重試時間間隔戴质,默認(rèn)30S告匠。
-retry-interval-wan=<value>
額外設(shè)置加入集群WAN口失敗時的重試時間間隔后专,默認(rèn)30S输莺。
-retry-max=<value>
設(shè)置加入集群失敗時的重試次數(shù),默認(rèn)0表示無限次丈冬。
-retry-max-wan=<value>
設(shè)置加入集群WAN口失敗時的重試次數(shù)埂蕊,默認(rèn)0表示無限次蓄氧。
-log-file=<value>
指定日志文件的前綴匀们,默認(rèn)日志不輸出到文件泄朴。
-log-rotate-bytes=<value>
指定日志回滾的大小限制祖灰。
-log-rotate-duration=<value>
指定日志回滾的時間限制局扶。
-log-rotate-max-files=<value>
指定保留的日志文件數(shù)三妈。
-max-query-time=<value>
指定查詢請求的最大超時時間畴蒲。
-encrypt=<value>
指定加密通訊的KEY对室,KEY由consul keygen命令產(chǎn)生掩宜。
info—— 輸出節(jié)點的版本和狀態(tài)信息牺汤,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址,默認(rèn)值為http://127.0.0.1:8500固该。
members—— 輸出已知的集群成員信息伐坏,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址桦沉,默認(rèn)值為http://127.0.0.1:8500纯露。
-detailed
輸出詳細(xì)信息埠褪。
-wan
明確指定已知的來自WAN池的成員信息钞速。
catalog—— 輸出目錄服務(wù)信息渴语,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址驾凶,默認(rèn)值為http://127.0.0.1:8500调违。
datacenters
列出已知的數(shù)據(jù)中心名稱技肩。
nodes
列出本數(shù)據(jù)中心已知的節(jié)點信息亩鬼。
services
列出本數(shù)據(jù)中心已知的服務(wù)名稱。
services—— 向節(jié)點注冊/注銷服務(wù)實例羡洁,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址筑煮,默認(rèn)值為[http://127.0.0.1:8500]
register
注冊服務(wù)實例袋马。
deregister
注銷服務(wù)實例虑凛。
reload—— 重新加載配置桑谍,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址锣披,默認(rèn)值為[http://127.0.0.1:8500]
join—— 控制節(jié)點加入指定地址所在的集群雹仿,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址盅粪,默認(rèn)值為[http://127.0.0.1:8500]
-wan
指定該地址為WAN口地址票顾,默認(rèn)為LAN口奠骄。
leave—— 控制節(jié)點優(yōu)雅地退出當(dāng)前集群含鳞,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址蝉绷,默認(rèn)值為[http://127.0.0.1:8500]
force-leave—— 控制指定故障節(jié)點強(qiáng)制從集群中移除熔吗,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址,默認(rèn)值為[http://127.0.0.1:8500]
-wan
指定該地址為WAN口地址佳晶,默認(rèn)為LAN口桅狠。
maint—— 控制節(jié)點/服務(wù)實例進(jìn)入/結(jié)束維護(hù)狀態(tài),常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址,默認(rèn)值為[http://127.0.0.1:8500]
-disable
結(jié)束維護(hù)狀態(tài)中跌。
-enable
進(jìn)入維護(hù)狀態(tài)咨堤。
-reason=<string>
指定維護(hù)操作的描述說明。
-service=<string>
指定維護(hù)的是服務(wù)實例而非代理節(jié)點漩符,明確服務(wù)ID。
kv—— 分布式KV操作嗜暴,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址凸克,默認(rèn)值為[http://127.0.0.1:8500]
put
寫入/更新指定KV。
get
讀取指定KV灼伤。
delete
刪除指定KV触徐。
monitor—— 監(jiān)聽節(jié)點的工作日志,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址狐赡,默認(rèn)值為[http://127.0.0.1:8500]
snapshot—— 控制節(jié)點執(zhí)行快照操作撞鹉,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址,默認(rèn)值為[http://127.0.0.1:8500]
save
保存快照颖侄。
restore
恢復(fù)快照鸟雏。
operator—— 提供集群級的操作工具,常用子命令及選項包括:
-http-addr=<address>
指定http的請求地址览祖,默認(rèn)值為[http://127.0.0.1:8500]
raft list-peers
顯示raft節(jié)點列表及工作狀態(tài)孝鹊。
開發(fā)模式運行:
執(zhí)行命令:
./consul agent -dev
輸出:
==> Starting Consul agent...
Version: '1.11.1'
Node ID: '3689ee75-2f1d-4c63-2bf9-548ffcdbfd72'
Node name: 'localhost.localdomain'
Datacenter: 'dc1' (Segment: '<all>')</all>
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
可以看到數(shù)據(jù)中心名稱、節(jié)點名稱展蒂、節(jié)點ID又活、各工作端口均為默認(rèn)或自動生成。
查看成員锰悼,執(zhí)行命令:
./consul members -detailed
輸出:
Node Address Status Tags
localhost.localdomain 127.0.0.1:8301 alive acls=0,ap=default,build=1.11.1:2c56447e,dc=dc1,ft_fs=1,ft_si=1,id=f4498061-1866-8061-3255-0bfcaf00e32a,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302</all>
查看raft工作狀態(tài)柳骄,執(zhí)行命令:
./consul operator raft list-peers
輸出:
Node ID Address State Voter RaftProtocol
localhost.localdomain f4498061-1866-8061-3255-0bfcaf00e32a 127.0.0.1:8300 leader true 3
集群模式運行:
集群模式下,建議使用3~5臺機(jī)器來做為SERVER節(jié)點箕般,由于手頭沒有那么多機(jī)器耐薯,暫時用單個實例來模擬,執(zhí)行命令:
./consul agent -server -datacenter=dc1 -node=192.168.56.101 -bootstrap -bootstrap-expect=1 -bind=192.168.56.101 -config-dir=./conf -data-dir=./data -enable-script-checks=true
查看成員丝里,執(zhí)行命令:
./consul members -detailed
輸出:
Node Address Status Tags
192.168.56.101 192.168.56.101:8301 alive acls=0,ap=default,bootstrap=1,build=1.11.1:2c56447e,dc=dc1,ft_fs=1,ft_si=1,id=ec3c13cf-6c38-7643-3305-44fe559fea3c,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302</all>
查看raft工作狀態(tài)曲初,執(zhí)行命令:
./consul operator raft list-peers
輸出:
Node ID Address State Voter RaftProtocol
192.168.56.101 ec3c13cf-6c38-7643-3305-44fe559fea3c 192.168.56.101:8300 leader true 3
與其他節(jié)點連接,組成集群杯聚,執(zhí)行命令:
./consul join 其它節(jié)點IP
操作成功后臼婆,可繼續(xù)查看成員和raft狀態(tài)。
停止代理:
如果agent是以終端前臺方式運行械媒,可以操作CTRL+C目锭,此時程序會安全退出评汰。
否則纷捞,可以執(zhí)行命令:
./consul leave
效果是一樣的痢虹。
如果某個代理發(fā)生了長時間故障,集群中的其他節(jié)點會一直重試與之恢復(fù)主儡,為了避免資源長時間消耗奖唯,此時建議從集群中移除故障節(jié)點,并添加新的節(jié)點進(jìn)行代替糜值。
移除節(jié)點的命令:
./consul force-leave 故障節(jié)點名稱
注冊服務(wù):
可以使用配置文件和HTTP調(diào)用兩種方法來注冊服務(wù)丰捷。
配置文件方法:
在conf目錄下添加web.json,輸入內(nèi)容:
{
"service": {
"name": "web",
"id":"web1",
"tags": ["rails"],
"port": 80
}
}
然后執(zhí)行命令重新加載:
./consul reload
HTTP調(diào)用方法:
這種方法又包括手動調(diào)用和程序自動調(diào)用寂汇,兩者的本質(zhì)是一樣的病往。程序自動調(diào)用可以更有效地控制服務(wù)實例的生存周期,跟隨程序的啟動和退出自動發(fā)起注冊和注銷操作骄瓣。
調(diào)用格式:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/service/register?replace-existing-checks=true
payload.json的文件內(nèi)容如下:
{
"name": "web",
"id":"web1",
"tags": ["rails"],
"port": 80
}
對應(yīng)的命令為:
./consul services register web.json
注意:這里payload.json停巷、web.json兩個文件的格式是不一樣的,不留意的話很容易弄混榕栏。
注銷服務(wù):
同樣可以使用配置文件和HTTP調(diào)用兩種方法來注銷服務(wù)畔勤。
配置文件方法:
刪除對應(yīng)的配置文件,然后執(zhí)行命令重新加載:
./consul reload
HTTP調(diào)用方法:
調(diào)用格式:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/service/deregister/服務(wù)實例ID
對應(yīng)的命令為:
./consul services register web.json
對于程序發(fā)起的HTTP調(diào)用扒磁,需要注意的是庆揪,如果程序發(fā)生異常退出,并且沒有相應(yīng)的恢復(fù)機(jī)制妨托,為避免人工干預(yù)的不及時性缸榛,建議為每一個注冊的服務(wù)實例增加健康檢測。
健康檢測:
支持系統(tǒng)級和應(yīng)用級健康檢測的管理兰伤。
如果健康檢測與服務(wù)相關(guān)聯(lián)内颗,則認(rèn)為它是應(yīng)用級,否則為系統(tǒng)級医清。系統(tǒng)級健康檢測主要關(guān)注節(jié)點的健康狀態(tài)起暮,而應(yīng)用級則主要關(guān)注服務(wù)實例的健康狀態(tài)。
健康檢測可以在配置文件中定義会烙,也可以在運行時通過HTTP接口添加负懦。通過HTTP接口創(chuàng)建的健康檢測也會在該結(jié)點進(jìn)行持久化。
支持多種健康檢測類型柏腻,包括:
1. 定時腳本檢測
調(diào)用外部應(yīng)用程序來執(zhí)行健康狀況檢測纸厉,以適當(dāng)?shù)耐顺龃a退出,并可能產(chǎn)生一些輸出五嫂。輸出限制為4KB颗品,大于4kb的輸出將被截斷肯尺。
默認(rèn)情況下,腳本檢查將配置30秒的超時時間躯枢,超時后Consul將嘗試強(qiáng)制終止檢測腳本和它產(chǎn)生的任何子進(jìn)程则吟。
在Consul 0.9.0和更高版本中,代理必須配置-enable-script-checks=true以啟用腳本檢測锄蹂。
2. 定時HTTP檢測
調(diào)用HTTP向指定的URL發(fā)送請求氓仲,服務(wù)的狀態(tài)取決于HTTP響應(yīng)代碼:任何2xx代碼都被視為檢測通過,429是太多請求的警告得糜,其他任何狀態(tài)碼都代表檢測失敗敬扛。
默認(rèn)情況下,HTTP檢查是GET請求朝抖,除非method字段指定了不同的方法啥箭。可以通過header字段來設(shè)置其它header字段信息治宣,以字符串列表映射的形式設(shè)置急侥。
同樣的,輸出限制為4KB炼七,大于4kb的輸出將被截斷缆巧。HTTP檢查也支持SSL。默認(rèn)要求有效的SSL證書豌拙,可以通過設(shè)置TLSSkipVerify為true關(guān)閉證書檢查陕悬。
3. 定時TCP檢測
調(diào)用TCP連接對指定的IP:PORT地址進(jìn)行檢測,服務(wù)的狀態(tài)取決于連接嘗試是否成功按傅。
4. 定時TTL檢測
TTL檢測會在TTL時間內(nèi)保留上次的檢測狀態(tài)捉超,檢測狀態(tài)必須通過HTTP接口定期更新,如果外部系統(tǒng)無法在給定的TTL內(nèi)更新狀態(tài)唯绍,則檢查設(shè)置為失敗狀態(tài)拼岳。
這個檢測機(jī)制依靠應(yīng)用程序直接報告其健康狀況。例如况芒,健康的應(yīng)用程序可以定期向HTTP端點發(fā)送狀態(tài)更新惜纸,如果應(yīng)用程序失敗,TTL將過期绝骚,健康檢查進(jìn)入危險狀態(tài)耐版。
系統(tǒng)級和應(yīng)用級健康檢測注冊方法與服務(wù)注冊相似,也包括配置文件和HTTP調(diào)用兩種方法压汪。這里主要講應(yīng)用級健康檢測的使用粪牲,系統(tǒng)級的與之相似,主要差異在于配置文件格式和調(diào)用接口有所區(qū)別止剖。
應(yīng)用級配置文件方法:
修改web.json腺阳,加入check部分落君,這里加入了HTTP檢測:
{
"service": {
"name": "web",
"id":"web1",
"tags": ["rails"],
"port": 80,
"check": {
"HTTP":"http://localhost:8080",
"Interval": "10s",
"Timeout": "5s"
}
}
}
然后執(zhí)行命令重載配置:
./consul reload
應(yīng)用級HTTP調(diào)用方法:
修改payload.json,加入check部分亭引,內(nèi)容如下:
{
"name": "web",
"id":"web1",
"tags": ["rails"],
"port": 80,
"check": {
"HTTP":"http://localhost:8080",
"Interval": "10s",
"Timeout": "5s"
}
}
然后發(fā)起調(diào)用:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/service/register?replace-existing-checks=true
查詢服務(wù):
支持HTTP和DNS查詢兩種方法绎速,對于DNS方法,域名以 TAG.NAME.service.consul 格式給定的痛侍。
HTTP方法:
例如查詢上面注冊的web服務(wù)實例朝氓,執(zhí)行命令:
curl \
http://127.0.0.1:8500/v1/health/service/web?passing \
| python -m json.tool
輸出:
[
{
"Checks": [
{
"CheckID": "serfHealth",
"CreateIndex": 92440,
"Definition": {},
"ExposedPort": 0,
"Interval": "",
"ModifyIndex": 92440,
"Name": "Serf Health Status",
"Node": "192.168.56.101",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Status": "passing",
"Timeout": "",
"Type": ""
}
],
"Node": {
"Address": "192.168.56.101",
"CreateIndex": 5,
"Datacenter": "dc1",
"ID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"Meta": {
"consul-network-segment": ""
},
"ModifyIndex": 92466,
"Node": "192.168.56.101",
"TaggedAddresses": {
"lan": "192.168.56.101",
"lan_ipv4": "192.168.56.101",
"wan": "192.168.56.101",
"wan_ipv4": "192.168.56.101"
}
},
"Service": {
"Address": "",
"Connect": {},
"CreateIndex": 96810,
"EnableTagOverride": false,
"ID": "web1",
"Meta": null,
"ModifyIndex": 96810,
"Port": 80,
"Proxy": {
"Expose": {},
"MeshGateway": {},
"Mode": ""
},
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
]
DNS方法:
例如魔市,查詢上面注冊的web服務(wù)主届,執(zhí)行命令:
dig @127.0.0.1 -p 8600 web.service.consul
輸出:
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @127.0.0.1 -p 8600 web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39228
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul. IN A
;; ANSWER SECTION:
web.service.consul. 0 IN A 192.168.56.101
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: 六 12月 25 20:45:18 CST 2021
;; MSG SIZE rcvd: 63
也可以進(jìn)一步查詢指定標(biāo)簽的服務(wù)實例,執(zhí)行命令:
dig @127.0.0.1 -p 8600 rails.web.service.consul
Web UI:
在啟動命令中加入-ui選項即可開啟Consul的自帶Web管理界面待德,執(zhí)行命令:
./consul agent -server -datacenter=dc1 -node=192.168.56.101 -bootstrap -bootstrap-expect=1 -bind=192.168.56.101 -config-dir=./conf -data-dir=./data -enable-script-checks=true -ui
在網(wǎng)頁中輸入網(wǎng)址:http://127.0.0.1:8500/ui
由于Consul HTTP默認(rèn)只在127.0.0.1上提供服務(wù)君丁,不方便遠(yuǎn)程查詢,可以使用-client參數(shù)修改将宪,如:
./consul agent -server -datacenter=dc1 -node=192.168.56.101 -bootstrap -bootstrap-expect=1 -bind=192.168.56.101 -config-dir=./conf -data-dir=./data -enable-script-checks=true -ui -client=0.0.0.0