面試官:Nacos有幾種負載均衡策略?
Nacos 作為目前主流的微服務中間件,包含了兩個頂級的微服務功能:配置中心和注冊中心。
1、配置中心掃盲
配置中心是一種集中化管理配置的服務,通俗易懂的說就是將本地配置文件“云端化”。 這樣做的好處有以下幾個:
- 集中管理配置信息:配置中心將不同服務的配置信息集中放在一起進行管理,實現了配置信息的集中存儲。
- 動態更新配置:配置中心中的配置信息可以通過操作界面或 API 進行動態更新,無需重啟服務就可以應用最新的配置信息。
- 配置信息共享:將配置集中在配置中心中,不同的服務實例可以共享同一套配置信息。
- 配置信息安全:配置中心可以對配置信息提供安全管理、權限控制等管理功能。
- 信息追溯:支持配置版本管理、歷史記錄等管理功能。
當然,配置中心不可能有負載均衡的功能,所以略過,咱們直接來看注冊中心。
2、注冊中心掃盲
注冊中心(Registry)是分布式系統中的一個組件,用于實現服務的注冊與發現。注冊中心用于管理服務實例的元數據信息,并提供服務發現和路由的功能。
在微服務架構中,服務之間經常需要互相調用和通信。注冊中心的作用是為服務提供一個集中管理和協調的中心,默認情況下,服務將自己的信息注冊到注冊中心,其他服務可以通過查詢注冊中心的信息來發現和調用目標服務。
注冊中心的核心功能包括以下幾個:
- 服務注冊:服務提供者在啟動時將自己的信息(比如 IP 地址、端口號、服務名稱等)注冊到注冊中心。注冊中心維護著一張服務實例的清單。
- 服務發現:服務消費者通過向注冊中心查詢服務信息,獲取可用的服務實例列表。通過注冊中心,服務消費者能夠找到并連接到目標服務。
- 健康檢查:注冊中心可以定時檢查服務實例的健康狀態,并根據服務的狀態更新服務實例的可用性。
- 負載均衡:注冊中心可以根據負載均衡策略,將請求分發給不同的服務實例,以實現負載均衡和服務高可用。
- 服務路由:在一些高級注冊中心中,還可以定義服務路由規則,將請求路由到不同的服務實例,實現更靈活的流量控制和管理。
3、注冊中心與負載均衡
負載均衡嚴格的來說,并不算是傳統注冊中心的功能。?般來說服務發現的完整流程應該是先從注 冊中心獲取到服務的實例列表,然后再根據自身的需求,來選擇其中的部分實例或者按照?定的流 量分配機制來訪問不同的服務提供者,因此注冊中心本身?般不限定服務消費者的訪問策略。
例如 Eureka、Zookeeper 包括 Consul,本身都沒有去實現可配置及可擴展的負載均衡機制,Eureka 的 負載均衡是由 Ribbon 來完成的,而 Consul 則是由 Fabio 做負載均衡。
也就是說注冊中心和負載均衡,其實完全屬于兩個不同的東西,注冊中心主要提供服務的注冊,以及將服務注冊的列表交給消費者,至于消費者要使用哪種負載均衡策略?完全可以由自己決定。此時消費者可以通過客戶端負載均衡器來實現服務的選擇和調用,例如客戶端負載均衡器 Ribbon 或 Spring Cloud LoadBalancer。
4、客戶端與服務端負載均衡
客戶端負載均衡器通常位于服務的消費者端,主要負責將請求合理地分發給不同的服務提供者。工作原理是客戶端在發起請求前,通過負載均衡算法選擇一個合適的服務實例進行請求。客戶端根據服務實例的健康度、負載狀況等指標來決定選擇哪個服務實例。常見的客戶端負載均衡器有 Ribbon、Feign 等。
服務端負載均衡器通常被稱為反向代理服務器或負載均衡器,它位于服務的提供者端,接收客戶端的請求,并根據一定的負載均衡策略將請求分發給后端的多個服務實例。工作原理是將客戶端的請求集中到負載均衡器,由負載均衡器將請求分發給多臺服務提供者。常見的服務器端負載均衡器有 Nginx、HAProxy 等。
客戶端負載均衡 VS 服務端負載均衡
- 客戶端負載均衡器的優點是可以實現本地的負載均衡算法,避免了對注冊中心的頻繁調用,降低了網絡開銷。它的缺點是每個客戶端都需要集成負載均衡器,導致代碼冗余和維護復雜性。
- 服務器負載均衡器的優點是可以集中管理請求流量,提供一致的負載均衡策略和配置,對客戶端透明。它的缺點是服務器端負載均衡器通常需要獨立部署和配置,增加了系統的復雜性和維護成本。并且它很可能成為整個系統的瓶頸(因為客戶端需要頻繁的調用),所以此時需要考慮其性能和可靠性等問題。
5、Nacos和負載均衡
然而 Nacos 的注冊中心和傳統的注冊中心不太一樣,例如 Eureka、Zookeeper、Consul 等。因為 Nacos 在 0.7.0 之后(包含此版本),它內置了以下兩種負載均衡策略:
基于權重的負載均衡策略,這個在 Nacos 服務編輯的時候也可以看到其設置:
基于第三方 CMDB(地域就近訪問)標簽的負載均衡策略,這個可以參考官方說明文檔:https://nacos.io/zh-cn/blog/cmdb.html
小結
注冊中心和負載均衡器嚴格意義上來說是兩個東西,但 Nacos 注冊中心中,內置了兩種負載均衡策略:基于權重和基于 CMDB(低于就近訪問)的負載均衡策略。
思考
那么問題來了,既然 Nacos 中內置了基于權重的負載均衡策略,那為什么修改 Nacos 中的權重值,在服務端調用時,卻沒看到任何變化?