Nacos 數據模型 Key 由三元組唯一確定, Namespace默認是空串,公共命名空間(public),分組默認是 DEFAULT_GROUP。
以上都是nacos官網上面的圖片及描述,綜合一下應該是這個樣子
可以在nacos控制台看到與之對應的界面
我們來看下這些東西都是用來干嘛的,
NameSpace可以用來進行資源的隔離,比如我們dev環境的服務和test環境的服務都往同一個nacos服務上面注冊,dev環境是調用不到test環境的服務的。
我們在nacos控制台新建兩個namespace,test和dev會生成兩個ID
設置我們訂單服務和庫存服務的namespace,一個為dev一個為test
再來查看nacos控制台的服務列表會看見兩個服務並不在public的命名空間下了,而是去到了test和dev下面,調用我們創建訂單的接口,會發現在訂單服務里面無法去扣減庫存了。因為這兩個服務現在已經不在同一個namespace下面了,無法進行調用了。
Group顧名思義就是分組了,比如訂單和支付服務是支付組,庫存物流屬於物流組,不同的分組之前的服務也是不能進行調用的。將上面的服務設置成同樣的namespace之后,發現服務可以調用了。但是我們有設置成不同的分組,發現服務又不能調用了。
兩個擴展點:spring.cloud.nacos.discovery.cluster-name參數
cluster-name,可以設置上之后通過自己的負載均衡算法可以實現優先同集群調用,減少網絡開銷,比如在成都這邊都有部署訂單服務和庫存服務,那么訂單調庫存的時候優先調用成都機房的庫存服務(spring.cloud.nacos.discovery.cluster-name=CD)。
spring.cloud.nacos.discovery.metadata參數
元數據參數可以配置一些額外的信息,比如設置一個版本進去,通過自己的負載均衡算法實現同版本之間的服務調用。比如線上有10個訂單服務和10個庫存服務都是V1版本,現在改部分改動,都上了2個V2版本,通過實現我們自己的負載算法,使得V2版本的訂單只能調用V2庫存服務。
以上的數據模型詳見Nacos源碼:com.alibaba.nacos.naming.core.ServiceManager類
這個雙層Map的key分別是namespace和group::serviceName,
com.alibaba.nacos.naming.core.Service中可以看到有一個Map<String, Cluster>,
com.alibaba.nacos.naming.core.Cluster中才是具體的服務實例com.alibaba.nacos.naming.core.Instance的Set集合,一個是持久化實例,一個非持久化實例。
完整代碼:https://github.com/bluedarkni/study/tree/master/cloud-alibaba