2018年,阿里巴巴開源 Nacos,由此成爲繼
Eureka、Consul、Apollo
等服務註冊發現&配置的又一開源框架,到如今2021年,Nacos 已經歷了0.01->1.4.2/2.0.1
版本的迭代,社區也非常的活躍,Github 上擁有超過18k
的star
和7k
的fork
;使用 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 地圖
- 特性大圖:要從功能特性,非功能特性,全面介紹我們要解的問題域的特性訴求
- 架構大圖:通過清晰架構,讓您快速進入 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
感謝大家的閱讀,下一篇文章見。