Nacos有幾種負載均衡策略?

2023-10-31 18:02:14

Nacos 作為目前主流的微服務中介軟體,包含了兩個頂級的微服務功能:設定中心和註冊中心。

1.設定中心掃盲

設定中心是一種集中化管理設定的服務,通俗易懂的說就是將本地組態檔「雲端化」。
這樣做的好處有以下幾個:

  1. 集中管理設定資訊:設定中心將不同服務的設定資訊集中放在一起進行管理,實現了設定資訊的集中儲存。
  2. 動態更新設定:設定中心中的設定資訊可以通過操作介面或 API 進行動態更新,無需重啟服務就可以應用最新的設定資訊。
  3. 設定資訊共用:將設定集中在設定中心中,不同的服務範例可以共用同一套設定資訊。
  4. 設定資訊保安:設定中心可以對設定資訊提供安全管理、許可權控制等管理功能。
  5. 資訊追溯:支援設定版本管理、歷史記錄等管理功能。

當然,設定中心不可能有負載均衡的功能,所以略過,咱們直接來看註冊中心。

2.註冊中心掃盲

註冊中心(Registry)是分散式系統中的一個元件,用於實現服務的註冊與發現。註冊中心用於管理服務範例的後設資料資訊,並提供服務發現和路由的功能。

在微服務架構中,服務之間經常需要互相呼叫和通訊。註冊中心的作用是為服務提供一個集中管理和協調的中心,預設情況下,服務將自己的資訊註冊到註冊中心,其他服務可以通過查詢註冊中心的資訊來發現和呼叫目標服務。

註冊中心的核心功能包括以下幾個:

  1. 服務註冊:服務提供者在啟動時將自己的資訊(比如 IP 地址、埠號、服務名稱等)註冊到註冊中心。註冊中心維護著一張服務範例的清單。
  2. 服務發現:服務消費者通過向註冊中心查詢服務資訊,獲取可用的服務範例列表。通過註冊中心,服務消費者能夠找到並連線到目標服務。
  3. 健康檢查:註冊中心可以定時檢查服務範例的健康狀態,並根據服務的狀態更新服務範例的可用性。
  4. 負載均衡:註冊中心可以根據負載均衡策略,將請求分發給不同的服務範例,以實現負載均衡和服務高可用。
  5. 服務路由:在一些高階註冊中心中,還可以定義服務路由規則,將請求路由到不同的服務範例,實現更靈活的流量控制和管理。

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 之後(包含此版本),它內建了以下兩種負載均衡策略:

  1. 基於權重的負載均衡策略,這個在 Nacos 服務編輯的時候也可以看到其設定:
  2. 基於第三方 CMDB(地域就近存取)標籤的負載均衡策略,這個可以參考官方說明檔案:https://nacos.io/zh-cn/blog/cmdb.html

小結

註冊中心和負載均衡器嚴格意義上來說是兩個東西,但 Nacos 註冊中心中,內建了兩種負載均衡策略:基於權重和基於 CMDB(低於就近存取)的負載均衡策略。

思考

那麼問題來了,既然 Nacos 中內建了基於權重的負載均衡策略,那為什麼修改 Nacos 中的權重值,在伺服器端呼叫時,卻沒看到任何變化?

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、並行、並行、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、訊息佇列等模組。