Nacos實戰一:架構及部署

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 的概念:

//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 架構

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

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

數據存儲

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

控制台

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

服務管理

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

服務配置

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

用戶、角色、許可權

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

兩種啟動模式

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

8.Nacos 部署

//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 的實例項目中,有需求的同學可以看一下,如下:

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

默認使用 standalone-mysql-5.7.yaml 配置來啟動 Nacos,詳細描述見以上鏈接項目。

管理後台

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

9.許可權及運維

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

許可權配置

首先,需要查看 Nacos 的系統參數介紹:Nacos 系統參數介紹,看完以後,了解 conf/application.properties 參數含義;

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

運維問題

上面所有講到的部署都是單機版本,如果有同學需要集群版本,可以查看以下官方文檔:

//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 註冊發現/服務配置/服務調用 等都有涉及,地址如下:

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

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

Tags: