分布式系統如何尋址?
通過 RPC 框架,能夠解決服務之間的跨網絡通信問題,是微服務改造的基礎。
服務拆分之后,需要維護更多細粒度的服務,這樣就涉及到 RPC 客戶端服到服務端的 部署地址問題,如何維護? 這個時候就需要服務注冊和發現。
什么叫服務發現?
所謂的服務發現,就是讓服務調用方知道服務提供方的地址是啥? 比如 Ngnix 作為反向代理器,可以這樣當請求到來時,可以通過 Nginx 知道應用服務器的地址是什么。這個就叫:服務發現。
Nginx 是怎么做服務發現的?
答案:Nginx 是將應用服務器的地址放在配置文件中。
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 配置的就是對應的 url .
配置proxy_pass代理轉發時,如果在proxy_pass后面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走。
但是這樣存在一些問題:
- 需要擴容的時候,需要修改客戶端配置,重啟客戶端進程,操作起來比較麻煩。
- 一旦一個服務器出故障,需要修改配置,然后重啟,無法自動修復
- RPC 服務端上線無法提前摘除流量,也就是說,發往服務端的請求流量依然會存在,客戶端被重啟服務端的請求還沒有返回,會造成客戶端請求失敗。
注冊中心是怎么解決這些問題的?
注冊中心兩點功能:
- 提供服務地址的存儲
- 當存儲內容發生變化時,可以將變更的內容推送給客戶端
有了第二個內容,當需要緊急擴容時,當服務器發生故障時,需要快速摘除節點,都不用重啟就可以實現。
使用注冊中心后,RPC 的通信:
- 客戶端與注冊中心建立連接,告訴注冊中心。
- 服務端向注冊中心注冊服務后,注冊中心會將最新的服務注冊信息通知給客戶端。
- 客戶端拿到服務端的地址之后,就可以向服務端發起調用請求。
服務端的增加減少對于客戶端來說是透明的,這樣可以實現不重啟客戶端,就可以動態地變更服務節點,并且實現優雅關機。
什么是優雅關機
優雅關機的相對面是暴力關機,暴力停止服務,已經發送的請求還沒有來得及處理,就被殺掉,這樣會造成部分請求失敗。因此需要在服務端退出的時候,先停止掉流量,不再受理新的請求,當服務處理完之后再關閉。






