Nacos實戰一:架構及部署

YClimb發表於2021-07-14

2018年,阿里巴巴開源 Nacos,由此成為繼 Eureka、Consul、Apollo 等服務註冊發現&配置的又一開源框架,到如今2021年,Nacos 已經歷了 0.01->1.4.2/2.0.1 版本的迭代,社群也非常的活躍,Github 上擁有超過 18kstar7kfork;使用 Nacos 作為服務管理平臺的公司也越來越多,包括阿里、愛奇藝、平安、虎牙、貝殼等網際網路公司,業內也對 Nacos 越來越認可,Spring Could、Spring Could Alibaba 等開源框架也越來越多的支援了 Nacos,所以我們也需要學習並使用 Nacos;本文將從 Nacos 的理念和架構開始,詳細描述 Nacos 的組成及部署,讓讀者更好的理解和使用 Nacos。

1.什麼是 Nacos?

官方描述:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務後設資料及流量管理。

Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。

願景:Nacos 通過提供簡單易用的動態服務發現、服務配置、服務共享與管理等服務基礎設施,幫助使用者在雲原生時代,在私有云、混合雲或者公有云等所有云環境中,更好的構建、交付、管理自己的微服務平臺,更快的複用和組合業務服務,更快的交付商業創新的價值,從而為使用者贏得市場。

2.功能有哪些?

動態配置服務

動態配置服務讓您能夠以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變更時重新部署應用和服務的需要。配置中心化管理讓實現無狀態服務更簡單,也讓按需彈性擴充套件服務更容易。

服務發現及管理

動態服務發現對以服務為中心的(例如微服務和雲原生)應用架構方式非常關鍵。Nacos支援DNS-Based和RPC-Based(Dubbo、gRPC)模式的服務發現。Nacos也提供實時健康檢查,以防止將請求發往不健康的主機或服務例項。藉助Nacos,您可以更容易地為您的服務實現斷路器。

動態DNS服務

通過支援權重路由,動態DNS服務能讓您輕鬆實現中間層負載均衡、更靈活的路由策略、流量控制以及簡單資料中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以DNS協議為基礎的服務發現,以消除耦合到廠商私有服務發現API上的風險。

3.特性有哪些?

易於使用

動態配置管理、服務發現和動態的一站式解決方案20多種開箱即用的以服務為中心的架構特性基本符合生產要求的輕量級

更適應雲架構

無縫支援Kubernetes和Spring Cloud在主流公共雲上更容易部署和執行(例如阿里雲和AWS)多租戶和多環境支援

生產等級

脫胎於歷經阿里巴巴10年生產驗證的內部產品支援具有數百萬服務的大規模場景具備企業級SLA的開源產品

豐富的應用場景

支援限流、大促銷預案和異地多活直接支援或稍作擴充套件即可支援大量有用的網際網路應用場景流量排程和服務治理

4.Nacos 地圖

image

  • 特性大圖:要從功能特性,非功能特性,全面介紹我們要解的問題域的特性訴求
  • 架構大圖:通過清晰架構,讓您快速進入 Nacos 世界
  • 業務大圖:利用當前特性可以支援的業務場景,及其最佳實踐
  • 生態大圖:系統梳理 Nacos 和主流技術生態的關係
  • 優勢大圖:展示 Nacos 核心競爭力
  • 戰略大圖:要從戰略到戰術層面講 Nacos 的巨集觀優勢

5.Nacos 生態圖

如 Nacos 全景圖所示,Nacos 無縫支援一些主流的開源生態,例如

  • Spring Cloud
  • Apache Dubbo and Dubbo Mesh
  • Kubernetes and CNCF。

使用 Nacos 簡化服務發現、配置管理、服務治理及管理的解決方案,讓微服務的發現、管理、共享、組合更加容易。

關於如何在這些生態中使用 Nacos,請參考官方文件:什麼是 Nacos

6.Nacos 概念

可以通過如下官方文件的描述,先行了解 Nacos 的概念:

https://nacos.io/zh-cn/docs/concepts.html

PS: 以上概念非常重要,需要認真看一下,否則會對 Nacos 理解產生很多阻礙

下面我抽出幾個單獨講一下:

  • 名稱空間:常用於生產環境隔離,比如 dev/test/beta/prod
  • 配置:應用的配置檔案,常用 yml/json 格式儲存,一個應用服務可以配置多個配置檔案,需要設定擴充套件,配置ID唯一,常用表現形式=應用名/應用名+Profile(舉個例子:mall-test.yml)
  • 配置管理:可以對配置檔案進行管理,配置的編輯、儲存、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動
  • 配置項:key/value 形式的配置內容,應用 application.yml/bootstrap.yml 等檔案的內容項
  • 服務:服務名稱=應用名稱,服務分組=一組服務的聚合,服務叢集=同分組同應用名多個例項服務聚合,服務權重=加權,權重越大,流量越大
  • 元資訊:Nacos資料(如配置和服務)描述資訊,如服務版本、權重、容災策略、負載均衡策略、鑑權配置、各種自定義標籤 (label),從作用範圍來看,分為服務級別的元資訊、叢集的元資訊及例項的元資訊。

7.Nacos 架構

https://nacos.io/zh-cn/docs/architecture.html

以上為官方對於 Nacos 架構的解釋,同學們可以認真看一下,下面我簡單講一下常用到的一些元件和配置。

資料儲存

Nacos的資料儲存可以分為兩種,一種是記憶體,一種是DB,常用的都是儲存在 MySQL 中,將資料持久化,避免資料丟失;官方也提供了預設的初始化SQL,需要在 Github 上面去下載,地址:初始化SQL

控制檯

Nacos也提供了一個便於使用者使用的後臺頁面,通過連結 http://localhost:8848/naocs 就能訪問,密碼也是 nacos/nacos,控制檯提供包括配置版本跟蹤、金絲雀釋出、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。控制檯樣例

服務管理

服務管理包括了對服務的CRUD、負載轉發策略、健康檢查等,包含了一整套服務註冊、發現的管理。

服務配置

服務配置包括了對配置的CRUD、版本控制、監聽管理、推送軌跡、資料聚合等功能。

使用者、角色、許可權

和普通的系統一樣,Nacos 提供了一套使用者-角色-許可權的基礎系統,解決了註冊-登陸-許可權控制的問題。

兩種啟動模式

Nacos 支援將註冊中心(Service Registry)與配置中心(Config Center) 在一個程式合併部署或者將2者分離部署的兩種模式。

8.Nacos 部署

https://nacos.io/zh-cn/docs/quick-start.html

本地模式

基礎的配置,可以根據以上鍊接中官方文件描述來實現,這裡將詳細解釋幾個注意事項。

  • 版本:當前最新穩定版v1.4.2,儘量用最新版本,官方會不斷修復問題,新版的支援會更好,儘量暫時不用v2.0.1版本,這個版本還有待驗證,儘量避免踩坑,穩定以後再嘗試
  • 環境:同學一定要注意官方對於環境的要求,64位jdk1.8+、64位linux/windows、maven3.2+
  • 安裝包:如果沒有特殊情況,儘量使用官方編譯後的壓縮包,避免下載官方Git後自己打包出現的問題,需要二次開發或者自定義配置的除外
  • 配置:啟動配置,官方預設啟動使用了內嵌資料庫的形式,這裡作者推薦使用MySQL外部資料庫方式,如果使用MySQL方式,那麼需要修改 conf/application.properties 配置檔案,如下:
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=xxx
db.password.0=xxx

這時候,如果不知道 Nacos MySQL 初始化指令碼的同學,可以通過 初始化SQL 下載指令碼,或者通過 conf/nacos-mysql.sql 配置指令碼。

如果機器的記憶體不夠充足的,啟動前一定要修改 bin/startup.sh 的啟動配置,如下:

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
    if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
        JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
    fi
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi

PS:啟動命令(-m standalone 代表著單機模式執行,如果不加這個引數則代表使用叢集模式執行)

Docker 模式

Docker 和普通模式差不多,也是需要設定配置檔案和啟動引數,具體的配置和啟動方式,我放在了 Github 的例項專案中,有需求的同學可以看一下,如下:

https://github.com/YClimb/docker-compose/tree/main/nacos

預設使用 standalone-mysql-5.7.yaml 配置來啟動 Nacos,詳細描述見以上鍊接專案。

管理後臺

服務啟動以後,如果是本地或者外網伺服器,就可以通過 http://IP:8848/nacos 訪問控制檯,賬號密碼:nacos/nacos

9.許可權及運維

通過以上例項,一個基礎的 Nacos 配置就完成了,如果我們還需要 Nacos 的許可權配置和運維相關操作,那麼可以繼續往下看;

許可權配置

首先,需要檢視 Nacos 的系統引數介紹:Nacos 系統引數介紹,看完以後,瞭解 conf/application.properties 引數含義;

然後,可以開始配置許可權:鑑權,通過官方文件的描述,可以修改配置完成鑑權的開啟,需要注意的是,對於不同版本來說,開啟服務身份識別功能不太一樣,這裡需要同學認真檢視,儘量用最新穩定版本,否則版本問題的坑可能在不經意間就會遇到。

運維問題

上面所有講到的部署都是單機版本,如果有同學需要叢集版本,可以檢視以下官方文件:

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

對於叢集版本來說,預設是通過 [ip/域名 -> nginx -> 例項] 的方式實現的,這裡有幾個問題需要注意:

  • 環境:64位Linux、64位JDK1.8+、Maven3.2+、3個節點及以上(重要,否則無法選舉成功)
  • 安裝包:推薦使用安裝包模式,tar.gz,這裡需要注意,叢集版本和單機版本不一樣,官方推薦的叢集版本是1.3.0,一定要看好,否則會報錯
  • 叢集配置:配置檔案 conf/cluster.conf,配置3+節點
  • 資料來源:使用MySQL資料庫
  • 啟動:sh startup.sh 啟動即可,預設使用外接資料來源
  • 域名:通過域名來使用時,不可設定壓縮 gzip 模式,否則應用服務獲取配置時會有亂碼問題;

10.總結

本篇文章總體來說是對於 Nacos 的一個總結,希望同學讀完這邊文章,能對 Nacos 有一個基礎的瞭解,也可以動手去實現一個基礎的 Nacos 服務,這樣這篇文章的目的就達到了;

對於 Nacos 的服務註冊、服務配置相關內容的講解,放在了下一篇文章,有興趣的同學可以先行檢視作者的 Github 專案地址,裡面對於 Nacos 註冊發現/服務配置/服務呼叫 等都有涉及,地址如下:

https://github.com/YClimb/spring-cloud-learning

感謝大家的閱讀,下一篇文章見。

相關文章