天天看點

我在組内的Nacos分享

本文已收錄 https://github.com/lkxiaolou/lkxiaolou 歡迎star。

Nacos簡介

Nacos : Naming and Configuration Service,可打包部署配置中心和注冊中心,也可獨立部署其中之一,配置中心、控制台依賴mysql,由阿裡巴巴2018年8月開源,github 19.1k star(截止2021.08.24)

本文隻講解服務發現部分。

服務注冊發現模型

我在組内的Nacos分享
  • namespace:環境隔離、租戶隔離;不同namespace服務無法互相發現
  • group:業務隔離;解決不同業務下serviceName相同的問題;可擷取預設或指定group執行個體
  • cluster:叢集隔離;可定制化路由偏好;可擷取全部或指定叢集執行個體

臨時執行個體

  • 臨時執行個體:靠client的心跳或連接配接保活,當不存活時,直接下線執行個體;适用于主動注冊的服務,特别适合K8S下ip漂移的場景
  • 永久執行個體:注冊後不用保活,靠服務端健康檢查來判斷執行個體是否健康,不健康執行個體也不用下線;适用于ip不常變化的場景

在Nacos中他們的主要差別如下:

emphemral true false
名稱 永久執行個體
CAP AP CP
一緻性協定 distro raft
是否持久化
健康檢查方式 心跳/連接配接 服務端檢查(TCP、HTTP、MYSQL)

Dubbo适配

我在組内的Nacos分享
  • 使用臨時執行個體
  • 應用級:serviceName為應用名即可
  • 服務級(Dubbo):以

    provider/consumer:$[service_name]:${version}:${group}

    為服務名

路由模式

用戶端路由模式

用戶端(SDK)根據service,指定部分或全部group、cluster擷取相應的執行個體,用戶端根據權重或其他政策進行路由

服務端路由模式

插件式selector實作自定義路由模式,可對接第三方CMDB

我在組内的Nacos分享
  1. 與CMDB對接,根據service、ip等資訊擷取中繼資料(如機房位置)
  2. 自定義實作選擇器selector,根據手動配置規則表達式選取相應執行個體

架構設計

存儲模型

全量資料位于記憶體中,每個節點資料保持一緻,節點間采取同步協定進行複制

我在組内的Nacos分享

資料結構

一個用戶端連接配接為一個client,打包用戶端的資訊與注冊、訂閱資料

  • 注冊
    • publisherIndexes => 哪些用戶端注冊了哪些服務
      • serviceName
        • clientid
        • ...
  • 訂閱
    • subscriberIndexes => 哪些用戶端訂閱了哪些服務

同步協定

  • 用戶端心跳/連接配接保活,重連時有恢複(注冊、訂閱)機制
  • 資料同步為異步
我在組内的Nacos分享

  • 半數以上節點同步成功才傳回給用戶端
我在組内的Nacos分享

通信協定

功能/版本 1.x distro 1.x raft 2.x distro 2.x raft
注冊/登出 http grpc
心跳/健康檢查 TCP/http/mysql TCP
推送 udp
叢集間資料同步 http/distro http/自研raft grpc/distro jraft

生态建設

  • 用戶端
    • Java
    • golang
    • Python
    • C#
    • Nodejs
    • C++
  • 插件
    • Dubbo-registry-nacos
    • Rpc-java-registry-nacos
    • Nacos-spring-starter
    • Nacos-sync
    • Nacos-k8s-sync
    • Nacos-client-mse-extension
    • Nacos-coredns-plugin
    • Nacos-istio

主要用于注冊中心遷移以及多資料中心資料同步

我在組内的Nacos分享

consumer側可使用域名方式發現服務,無需使用Nacos用戶端

我在組内的Nacos分享

支援Nacos資料同步至MCP Server

我在組内的Nacos分享

優缺點分析

  • 優點:
    • AP模式,擴充性、多資料中心支援友好
    • 服務發現模型設計支援邏輯上namespace、group、cluster等的隔離
    • 健康檢查模式支援較多
    • 支援臨時執行個體與持久化執行個體,滿足不同場景
    • 功能多,生态豐富,支援多語言SDK
    • 2.x版本grpc長連接配接性能強
    • 單一程序,部署簡單,且附帶開箱即用的控制台
    • 基本無依賴(除控制台依賴mysql,注冊中心部分實際不依賴任何第三方元件)
  • 缺點:
    • 1.x http心跳消耗大,2.x剛釋出不久,可能存在一些bug
    • 沒有分層設計,沒辦法針對性擴容,如連接配接數太多時,擴容能解決,但也會增加資料同步壓力
搜尋關注微信公衆号"捉蟲大師",後端技術分享,架構設計、性能優化、源碼閱讀、問題排查、踩坑實踐。

繼續閱讀