分布式系統(tǒng)如何尋址?
通過(guò) RPC 框架,能夠解決服務(wù)之間的跨網(wǎng)絡(luò)通信問(wèn)題,是微服務(wù)改造的基礎(chǔ)。
服務(wù)拆分之后,需要維護(hù)更多細(xì)粒度的服務(wù),這樣就涉及到 RPC 客戶端服到服務(wù)端的 部署地址問(wèn)題,如何維護(hù)? 這個(gè)時(shí)候就需要服務(wù)注冊(cè)和發(fā)現(xiàn)。
什么叫服務(wù)發(fā)現(xiàn)?
所謂的服務(wù)發(fā)現(xiàn),就是讓服務(wù)調(diào)用方知道服務(wù)提供方的地址是啥? 比如 Ngnix 作為反向代理器,可以這樣當(dāng)請(qǐng)求到來(lái)時(shí),可以通過(guò) Nginx 知道應(yīng)用服務(wù)器的地址是什么。這個(gè)就叫:服務(wù)發(fā)現(xiàn)。
Nginx 是怎么做服務(wù)發(fā)現(xiàn)的?
答案:Nginx 是將應(yīng)用服務(wù)器的地址放在配置文件中。
vi nginx.conf
location / {
proxy_pass http://39.107.125.254:8080/springwebdemo/loginaction.do?op=tologin;
proxy_set_header Host $host:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
#刷新配置
./nginx -s reload
proxy_pass 配置的就是對(duì)應(yīng)的 url .
配置proxy_pass代理轉(zhuǎn)發(fā)時(shí),如果在proxy_pass后面的url加/,表示絕對(duì)根路徑;如果沒(méi)有/,表示相對(duì)路徑,把匹配的路徑部分也給代理走。
但是這樣存在一些問(wèn)題:
- 需要擴(kuò)容的時(shí)候,需要修改客戶端配置,重啟客戶端進(jìn)程,操作起來(lái)比較麻煩。
- 一旦一個(gè)服務(wù)器出故障,需要修改配置,然后重啟,無(wú)法自動(dòng)修復(fù)
- RPC 服務(wù)端上線無(wú)法提前摘除流量,也就是說(shuō),發(fā)往服務(wù)端的請(qǐng)求流量依然會(huì)存在,客戶端被重啟服務(wù)端的請(qǐng)求還沒(méi)有返回,會(huì)造成客戶端請(qǐng)求失敗。
注冊(cè)中心是怎么解決這些問(wèn)題的?
注冊(cè)中心兩點(diǎn)功能:
- 提供服務(wù)地址的存儲(chǔ)
- 當(dāng)存儲(chǔ)內(nèi)容發(fā)生變化時(shí),可以將變更的內(nèi)容推送給客戶端
有了第二個(gè)內(nèi)容,當(dāng)需要緊急擴(kuò)容時(shí),當(dāng)服務(wù)器發(fā)生故障時(shí),需要快速摘除節(jié)點(diǎn),都不用重啟就可以實(shí)現(xiàn)。
使用注冊(cè)中心后,RPC 的通信:
- 客戶端與注冊(cè)中心建立連接,告訴注冊(cè)中心。
- 服務(wù)端向注冊(cè)中心注冊(cè)服務(wù)后,注冊(cè)中心會(huì)將最新的服務(wù)注冊(cè)信息通知給客戶端。
- 客戶端拿到服務(wù)端的地址之后,就可以向服務(wù)端發(fā)起調(diào)用請(qǐng)求。
服務(wù)端的增加減少對(duì)于客戶端來(lái)說(shuō)是透明的,這樣可以實(shí)現(xiàn)不重啟客戶端,就可以動(dòng)態(tài)地變更服務(wù)節(jié)點(diǎn),并且實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)。
什么是優(yōu)雅關(guān)機(jī)
優(yōu)雅關(guān)機(jī)的相對(duì)面是暴力關(guān)機(jī),暴力停止服務(wù),已經(jīng)發(fā)送的請(qǐng)求還沒(méi)有來(lái)得及處理,就被殺掉,這樣會(huì)造成部分請(qǐng)求失敗。因此需要在服務(wù)端退出的時(shí)候,先停止掉流量,不再受理新的請(qǐng)求,當(dāng)服務(wù)處理完之后再關(guān)閉。