前言
在聊服務注冊中心時,便提到了Nacos。這次便來認識一下。當然,這自然沒有官方介紹那般詳盡,權當是學習了解Nacos原理的一個過程吧。
Nacos簡介
Nacos,全名:dynamic Naming And Configuration Service. 而這個名字則強調了Nacos的兩大基石: Naming Service 和 Config Service。
-
Config Service
自然是負責提供配置管理服務。Nacos作為配置中心時,主要使用的便是該服務 -
Naming Service
想必不用多說,也能猜到就是負責提供服務注冊中心能力的扛把子。不過官方關于該服務的描述很有意思:提供分布式系統中所有對象(Object)、實體(Entity)的“名字”到關聯的元數據之間的映射管理服務。服務發現和 DNS 就是名字服務的2大場景
簡而言之,就是映射服務。通過一個名字找到相關分布式組件的元數據/元信息。這不就是服務注冊中心的本質嗎?嘿嘿。
Nacos入門使用
Nacos服務的搭建
Nacos服務的搭建可以參考官網的Quick-Start,可通過源碼編譯打包部署,也可以通過docker部署。這里給大家提醒一下我搭建過程中遇到過的問題:
- Nacos2.x為了提高性能,增加了grpc通信方式,因此需要開放對應的端口,默認為9848.
- Nacos2.x的表結構與Nacos1.x也有所區別,如果表結構錯誤則會導致Nacos啟動失敗的。
- Nacos2.x需要使用對應的Nacos2.x的客戶端,否則客戶端連接服務端會失敗。
附上
Nacos2.0兼容性說明
Nacos 2.0.0部署及升級文檔
Nacos配置服務 - 配置中心
- 先在Nacos控制臺新建一個命名空間
命名空間,這個概念官方的解釋比較容易理解,用于隔離不同環境。例如:開發環境、測試環境、生產環境。
這里我們等于是新建了一個開發環境的命名空間。
- 新建一個配置集
-
配置集——DataID,這里就是指代我們常說的配置文件。從我們使用的角度來理解官網上的這些概念就容易許多了。我們一個配置文件里面本身就是包含了很多配置項,從配置服務的管理角度看,就是一個配置集。這也就不難理解官方定義所說的:“一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。”從使用的角度說,就是一個系統可以有多個配置文件。
-
配置分組。對于單體系統,這個概念顯得比較雞肋。對于微服務系統,則比較有意思。“不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。”。理解一下這句話:以MQ為例,意味著有一個生產者服務和一個消費者服務,當生產者更改MQ配置(例如Topic),那么消費者也需要同時更改。這時,不妨把MQ的配置單獨作為一個配置集,設置一個特定的分組,生產者跟消費者都是這個配置即可。至于分組名,取一個跟這兩服務確切相關的即可。
不過,從這我們也可以發現,我們可以發布多個相同配置文件,分組不同的配置集。這可以用在相同的組件但業務不同的場景下。 -
在java客戶端獲取配置
我們從控制臺就可以拿到讀取該配置集(配置文件)的示例代碼:
// Nacos服務的地址String serverAddr = "localhost:8848";// 配置所屬的命名空間:開發環境String namespace = "b7984b05-f2fe-4213-8fdf-47ef799315a5";// 目標配置集DataIdString dataId = "nacos-config-example.yaml";// 目標配置集分組String group = "DEFAULT_GROUP";Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);properties.put(PropertyKeyConst.NAMESPACE, namespace);ConfigService configService = NacosFactory.createConfigService(properties);String content = configService.getConfig(dataId, group, 5000);System.out.println(content);
這就是配置服務的簡單使用,以及我們在使用的時候需要關注的相關概念了。如果大家在官網看相關概念,需要注意,只有《配置管理》這里面的東西才是配置服務相關的概念
Nacos映射管理服務 - 注冊中心
與其他注冊中心類似,只需要啟動注冊中心即可注冊。先看看Java客戶端怎么注冊的。
Properties properties = new Properties();// 指定 Nacos 地址properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");// 默認命名空間是空,可以不填寫properties.put(PropertyKeyConst.NAMESPACE, "b7984b05-f2fe-4213-8fdf-47ef799315a5");
// 如果在云上開啟鑒權可以傳入應用身份// properties.put("ramRoleName", "$ramRoleName");
// properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");
// properties.put(PropertyKeyConst.SECRET_KEY, "${secretKey}");NamingService serviceRegistry = NacosFactory.createNamingService(properties);// 分組 可用于區分數據中心,同個數據中心的服務互相調用,提高效率String groupName = "DataCenter-DongGuang";// 京東商城服務 —— Service:微服務;系統String serviceName = "JingDong-Mall";Instance instance = new Instance();instance.setIp("192.168.1.125");instance.setPort(8080);instance.setWeight(1.0);// 訂單服務集群instance.setClusterName("order-service");instance.setInstanceId("1");
// instance.setEphemeral(false);serviceRegistry.registerInstance(serviceName, groupName, instance);// 死循環,為了不讓服務關停,方便在nacos控制臺觀測狀況while(true);
注冊成功之后,控制臺看看
在demo中也涉及了一些關于Nacos的注冊中心的相關概念。再從官網撈了兩張圖幫助大家理解。
- 命名空間Namespace:使用場景是區分不同環境,因此沒有異議。
- 服務分組Group:不同的服務可以歸類到同一分組。
- 服務Service:通過預定義接口網絡訪問的提供給客戶端的軟件功能。
- 虛擬集群Cluster: 同一個服務下的所有服務實例組成一個默認集群, 集群可以被進一步按需求劃分,劃分的單位可以是虛擬集群。
關于以上定義,我的解讀如下:
- 服務,這個比較有意思。網絡可以訪問的軟件。可以是一個大型的微服務系統,也可以是一個小的自治服務。
- 服務分組,這個也有意思。不過從其實現來說,同一個分組的服務才能互相發現。
- 虛擬集群,關鍵詞:虛擬。可以被進一步劃分!如果是大型微服務系統,按照定義其所有的實力都歸屬于一個集群。但進一步劃分后,又可以按照各微服務劃分小集群。
從demo而言,算是對分組的一種應用。可以方便同一個數據中心的服務互相調用,提高調用效率。這里提示一下,Nacos算是一個平臺,能裝很多Service。
不過這種應用也有其弊端,如果數據中心的某個機房的某些機器損壞導致部分服務需要訪問其他數據中心時是無法做到的。
據《Nacos架構與原理》,這些都是為了實現不同程度的隔離。分組和服務,可以實現接口級別的隔離。而從控制臺的UI,我們也可以發現namespace是需要選擇才切換的,而分組與實例則是直接展示的。
而接口級別的隔離,個人覺得就取決于你如何應用了。
有人說可以通過分組來區分環境,個人不是很支持,因為不便于在控制臺管理。
一般情況下,使用命名空間來區分環境,至于分組則都沒有使用(即默認分組:DEFAULT_GROUP).
不過,與注冊中心不同,作為配置中心時配置分組倒是可以用來區分應用/組件。當然,你也可以通過dataID增加特定的服務名前綴來區分。
后記
本來想把數據結構也聊一聊的,但感覺篇幅又太長了。其次,要想講清楚,就不得不深入到源碼中。因此決定分開說,這次聊的是使用。下次,咱深入源碼,聊聊設計和數據結構。