溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Nacos

發(fā)布時間:2021-10-11 18:00:43 來源:億速云 閱讀:276 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“什么是Nacos”,在日常操作中,相信很多人在什么是Nacos問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是Nacos”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

什么是Nacos

前言

Nacos在微服務(wù)系統(tǒng)的服務(wù)注冊和發(fā)現(xiàn)領(lǐng)域,勢頭迅猛是肉眼可見的。在微服務(wù)系統(tǒng)中,服務(wù)的注冊和發(fā)現(xiàn)又是一個靈魂的存在。沒有注冊中心的存在,成百上千服務(wù)之間的調(diào)用復(fù)雜度不可想象。

如果你計劃或已經(jīng)在使用Nacos了,但僅停留在使用層面,那這篇文章值得你一讀。

本文我們先從服務(wù)發(fā)現(xiàn)機制說起,然后講解Nacos的基本介紹、實現(xiàn)原理、架構(gòu)等,真正做到深入淺出的了解Nacos。

服務(wù)注冊與發(fā)現(xiàn)

說起Nacos,不得不先聊聊微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)。關(guān)于服務(wù)發(fā)現(xiàn)其實已經(jīng)在《要學(xué)習(xí)微服務(wù)的服務(wù)發(fā)現(xiàn)?先來了解一些科普知識吧》一文中進行了全面的講解。我們這里再簡要梳理一下。

在傳統(tǒng)應(yīng)用中,一個服務(wù)A訪問另外一個服務(wù)B,我們只需將服務(wù)B的服務(wù)地址和端口在服務(wù)A的靜態(tài)配置文件中進行配置即可。

但在微服務(wù)的架構(gòu)中,這種情況就有所變化了,如下圖所示:

什么是Nacos

上圖中,服務(wù)實例的IP是動態(tài)分配。同時,還面臨著服務(wù)的增減、故障、升級等變化。這種情況,對于客戶端程序來說,就需要使用更精確的服務(wù)發(fā)現(xiàn)機制。

為了解決這個問題,于是像etcd、Consul、Apache Zookeeper、Nacos等服務(wù)注冊中間件便應(yīng)運而生。

Nacos簡介

Nacos一般讀作/nɑ:k??s/,這個名字來源于“Dynamic Naming and Configuration  Service”。其中na取自“Naming”的前兩個字母,co取自“Configuration”的前兩個字母,而s則取自“Service”的首字母。

Nacos的功能官方用一句話來進行了說明:“一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺?!币簿褪钦fNacos不僅提供了服務(wù)注冊與發(fā)現(xiàn)功能,還提供了配置管理的功能,同時還提供了可視化的管理平臺。

官方文檔中還提到“服務(wù)(Service)是Nacos世界的一等公民?!保簿褪钦f在Nacos是圍繞著Service轉(zhuǎn)的。

如果查看源碼,會發(fā)現(xiàn)Nacos的核心API中定義了兩個接口NamingService和ConfigService。服務(wù)注冊與發(fā)現(xiàn)圍繞著NamingService展開,而配置管理則圍繞著ConfigService展開。

官網(wǎng)給出了Nacos的4個核心特性:服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測、動態(tài)配置服務(wù)、動態(tài)DNS服務(wù)、服務(wù)及其元數(shù)據(jù)管理。我們主要來講服務(wù)發(fā)現(xiàn)功能。

Nacos的Server與Client

Nacos注冊中心分為Server與Client,Nacos提供SDK和openApi,如果沒有SDK也可以根據(jù)openApi手動寫服務(wù)注冊與發(fā)現(xiàn)和配置拉取的邏輯。

Server采用Java編寫,基于Spring Boot框架,為Client提供注冊發(fā)現(xiàn)服務(wù)與配置服務(wù)。

Client支持包含了目前已知的Nacos多語言客戶端及Spring生態(tài)的相關(guān)客戶端。Client與微服務(wù)嵌套在一起。

Nacos的DNS實現(xiàn)依賴了CoreDNS,其項目為nacos-coredns-plugin。該插件提供了基于CoreDNS的DNS-F客戶端,開發(fā)語言為go。

Nacos注冊中的交互流程

作為注冊中心的功能來說,Nacos提供的功能與其他主流框架很類似,基本都是圍繞服務(wù)實例注冊、實例健康檢查、服務(wù)實例獲取這三個核心來實現(xiàn)的。

什么是Nacos

以Java版本的Nacos客戶端為例,服務(wù)注冊基本流程:

  • 服務(wù)實例啟動將自身注冊到Nacos注冊中心,隨后維持與注冊中心的心跳;

  • 心跳維持策略為每5秒向Nacos Server發(fā)送一次心跳,并攜帶實例信息(服務(wù)名、實例IP、端口等);

  • Nacos Server也會向Client主動發(fā)起健康檢查,支持TCP/Http;

  • 15秒內(nèi)無心跳且健康檢查失敗則認為實例不健康,如果30秒內(nèi)健康檢查失敗則剔除實例;

  • 服務(wù)消費者通過注冊中心獲取實例,并發(fā)起調(diào)用;

其中服務(wù)發(fā)現(xiàn)支持兩種場景:第一,服務(wù)消費者直接向注冊中心發(fā)送獲取某服務(wù)實例的請求,注冊中心返回所有可用實例,但一般不推薦此種方式;第二、服務(wù)消費者向注冊中心訂閱某服務(wù),并提交一個監(jiān)聽器,當(dāng)注冊中心中服務(wù)發(fā)生變化時,監(jiān)聽器會收到通知,消費者更新本地服務(wù)實例列表,以保證所有的服務(wù)均可用。

Nacos數(shù)據(jù)模型

關(guān)于數(shù)據(jù)模型,官網(wǎng)描述道:Nacos數(shù)據(jù)模型的Key由三元組唯一確定,Namespace默認是空串,公共命名空間(public),分組默認是DEFAULT_GROUP。

什么是Nacos

上面的圖為官方提供的圖,我們可以進一步細化拆分來看一下:

什么是Nacos

如果還無法理解,我們可以直接從代碼層面來看看Namespace、Group和Service是如何存儲的:

/**  * Map(namespace, Map(group::serviceName, Service)).  */ private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();

也就是說Nacos服務(wù)注冊表結(jié)構(gòu)為:Map

Nacos基于namespace的設(shè)計是為了做多環(huán)境以及多租戶數(shù)據(jù)(配置和服務(wù))隔離的。如果用戶有多套環(huán)境(開發(fā)、測試、生產(chǎn)等環(huán)境),則可以分別建三個不同的namespace,比如上圖中的dev-namespace和prod-namespace。

Nacos服務(wù)領(lǐng)域模型

在上面的數(shù)據(jù)模式中,我們可以定位到一個服務(wù)(Service)了,那么服務(wù)的模型又是如何呢?官網(wǎng)提供了下圖:

什么是Nacos

從圖中的分級存儲模型可以看到,在服務(wù)級別,保存了健康檢查開關(guān)、元數(shù)據(jù)、路由機制、保護閾值等設(shè)置,而集群保存了健康檢查模式、元數(shù)據(jù)、同步機制等數(shù)據(jù),實例保存了該實例的ip、端口、權(quán)重、健康檢查狀態(tài)、下線狀態(tài)、元數(shù)據(jù)、響應(yīng)時間。

此時,我們忽略掉一對多的情況,整個Nacos中數(shù)據(jù)存儲的關(guān)系如下圖:

什么是Nacos

可以看出,整個層級的包含關(guān)系為Namespace包含多個Group、Group可包含多個Service、Service可包含多個Cluster、Cluster中包含Instance集合。

對應(yīng)的部分源碼如下:

// ServiceManager類,Map(namespace, Map(group::serviceName, Service)) private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();  // Service類,Map(cluster,Cluster) private Map<String, Cluster> clusterMap = new HashMap<>();  // Cluster類 private Set<Instance> persistentInstances = new HashSet<>(); private Set<Instance> ephemeralInstances = new HashSet<>();  // Instance類 private String instanceId; private String ip; private int port; private double weight = 1.0D;

其中,實例又分為臨時實例和持久化實例。它們的區(qū)別關(guān)鍵是健康檢查的方式。臨時實例使用客戶端上報模式,而持久化實例使用服務(wù)端反向探測模式。

臨時實例需要能夠自動摘除不健康實例,而且無需持久化存儲實例。持久化實例使用服務(wù)端探測的健康檢查方式,因為客戶端不會上報心跳,自然就不能去自動摘除下線的實例。

到此,關(guān)于“什么是Nacos”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI