【探索SpringCloud】服務發現-Nacos使用

前言

在聊服務注冊中心時,便提到了Nacos。這次便來認識一下。當然,這自然沒有官方介紹那般詳盡,權當是學習了解Nacos原理的一個過程吧。

Nacos簡介

Nacos,全名:dynamic Naming And Configuration Service. 而這個名字則強調了Nacos的兩大基石: Naming Service 和 Config Service。

  1. Config Service
    自然是負責提供配置管理服務。Nacos作為配置中心時,主要使用的便是該服務

  2. Naming Service
    想必不用多說,也能猜到就是負責提供服務注冊中心能力的扛把子。不過官方關于該服務的描述很有意思:

    提供分布式系統中所有對象(Object)、實體(Entity)的“名字”到關聯的元數據之間的映射管理服務。服務發現和 DNS 就是名字服務的2大場景

    簡而言之,就是映射服務。通過一個名字找到相關分布式組件的元數據/元信息。這不就是服務注冊中心的本質嗎?嘿嘿。

架構圖

Nacos入門使用

Nacos服務的搭建

Nacos服務的搭建可以參考官網的Quick-Start,可通過源碼編譯打包部署,也可以通過docker部署。這里給大家提醒一下我搭建過程中遇到過的問題:

  1. Nacos2.x為了提高性能,增加了grpc通信方式,因此需要開放對應的端口,默認為9848.
  2. Nacos2.x的表結構與Nacos1.x也有所區別,如果表結構錯誤則會導致Nacos啟動失敗的。
  3. Nacos2.x需要使用對應的Nacos2.x的客戶端,否則客戶端連接服務端會失敗。

附上

Nacos2.0兼容性說明
Nacos 2.0.0部署及升級文檔

Nacos配置服務 - 配置中心

  1. 先在Nacos控制臺新建一個命名空間

新建命名空間

命名空間,這個概念官方的解釋比較容易理解,用于隔離不同環境。例如:開發環境、測試環境、生產環境。
這里我們等于是新建了一個開發環境的命名空間。

  1. 新建一個配置集

新建一個配置集

  1. 配置集——DataID,這里就是指代我們常說的配置文件。從我們使用的角度來理解官網上的這些概念就容易許多了。我們一個配置文件里面本身就是包含了很多配置項,從配置服務的管理角度看,就是一個配置集。這也就不難理解官方定義所說的:“一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。”從使用的角度說,就是一個系統可以有多個配置文件。

  2. 配置分組。對于單體系統,這個概念顯得比較雞肋。對于微服務系統,則比較有意思。“不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。”。理解一下這句話:以MQ為例,意味著有一個生產者服務和一個消費者服務,當生產者更改MQ配置(例如Topic),那么消費者也需要同時更改。這時,不妨把MQ的配置單獨作為一個配置集,設置一個特定的分組,生產者跟消費者都是這個配置即可。至于分組名,取一個跟這兩服務確切相關的即可。
    不過,從這我們也可以發現,我們可以發布多個相同配置文件,分組不同的配置集。這可以用在相同的組件但業務不同的場景下。

  3. 在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的注冊中心的相關概念。再從官網撈了兩張圖幫助大家理解。

nacos-data-model.jpeg
nacos-service-storage-model.jpeg

  1. 命名空間Namespace:使用場景是區分不同環境,因此沒有異議。
  2. 服務分組Group:不同的服務可以歸類到同一分組。
  3. 服務Service:通過預定義接口網絡訪問的提供給客戶端的軟件功能。
  4. 虛擬集群Cluster: 同一個服務下的所有服務實例組成一個默認集群, 集群可以被進一步按需求劃分,劃分的單位可以是虛擬集群。

關于以上定義,我的解讀如下:

  • 服務,這個比較有意思。網絡可以訪問的軟件。可以是一個大型的微服務系統,也可以是一個小的自治服務。
  • 服務分組,這個也有意思。不過從其實現來說,同一個分組的服務才能互相發現。
  • 虛擬集群,關鍵詞:虛擬。可以被進一步劃分!如果是大型微服務系統,按照定義其所有的實力都歸屬于一個集群。但進一步劃分后,又可以按照各微服務劃分小集群。

從demo而言,算是對分組的一種應用。可以方便同一個數據中心的服務互相調用,提高調用效率。這里提示一下,Nacos算是一個平臺,能裝很多Service。
不過這種應用也有其弊端,如果數據中心的某個機房的某些機器損壞導致部分服務需要訪問其他數據中心時是無法做到的。

據《Nacos架構與原理》,這些都是為了實現不同程度的隔離。分組和服務,可以實現接口級別的隔離。而從控制臺的UI,我們也可以發現namespace是需要選擇才切換的,而分組與實例則是直接展示的。
而接口級別的隔離,個人覺得就取決于你如何應用了。

有人說可以通過分組來區分環境,個人不是很支持,因為不便于在控制臺管理。
一般情況下,使用命名空間來區分環境,至于分組則都沒有使用(即默認分組:DEFAULT_GROUP).
不過,與注冊中心不同,作為配置中心時配置分組倒是可以用來區分應用/組件。當然,你也可以通過dataID增加特定的服務名前綴來區分。

后記

本來想把數據結構也聊一聊的,但感覺篇幅又太長了。其次,要想講清楚,就不得不深入到源碼中。因此決定分開說,這次聊的是使用。下次,咱深入源碼,聊聊設計和數據結構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java JDBC,輕松構建數據庫連接:代碼教程詳解

JDBC的概述 Java Database Connectivity(JDBC)是 Java 中用于與數據庫進行通信的 API。它提供了一套標準的 API,并允許 Java 應用程序連接到各種關系型數據庫,如 MySQL、Oracle、PostgreSQL 等,從而可以執行 SQL 查詢…

win10在vmware15中安裝macos10.13系統

第一步、安裝vmware版本信息如下 第二步、下載unlocker-main和darwin.iso放到安裝文件夾 第三步、管理員身份運行win-install.cmd 第四步、運行vmware新建虛擬機 第五步、啟動新創建的虛擬機macOS 10.13并選擇語言 第六步、選擇磁盤工具抹掉磁盤 第七步、格式化完成后退出磁盤工…

flutter 隨筆

萬物 皆可 結構 概念 ?狀態 插件類 flutter系統類 MaterialApp源App應? 事件 很簡單/簡單/較復雜/復雜/很復雜 結構體 MaterialApp(xx:) 公開坑位屬性:所配置內容 Widget 插件事件 function 函數事件 flutter/dart 事件結構描述void Function() 外層主事件 內層回…

數據結構:交換排序

冒泡排序 起泡排序,別名“冒泡排序”,該算法的核心思想是將無序表中的所有記錄,通過兩兩比較關鍵字,得出升序序列或者降序序列。 算法步驟 比較相鄰的元素。如果第一個元素大于第二個元素,就交換它們。對每一對相鄰…

Python-OpenCV中的圖像處理-圖像金字塔

Python-OpenCV中的圖像處理-圖像金字塔 圖像金字塔高斯金字塔拉普拉斯金字塔 金字塔圖像融合 圖像金字塔 同一圖像的不同分辨率的子圖集合,如果把最大的圖像放在底部,最小的放在頂部,看起來像一座金字塔,故而得名圖像金字塔。cv2…

小程序發布注意事項

1、使用HBuildx的 發布 功能發布小程序,因為編譯完的代碼目錄不是同一個 如果使用 運行 到小程序,最后發布的版本會顯示”無法連接本地服務器“ 2、使用unicloud的云服務 uniCloud發行 | uni-app官網 阿里云的unicloud的話,使用request域名…

Spring中Bean的循環依賴問題

1.什么是Bean的循環依賴? 簡單來說就是在A類中,初始化A時需要用到B對象,而在B類中,初始化B時需要用到A對象,這種狀況下在Spring中,如果A和B同時初始化,A,B同時都需要對方的資源&…

電腦開機出現Boot Device怎么辦?

開機出現Boot Device這個問題很常見,有時還會出現No Boot Device的問題,雖然多了一個單詞,但意思是相同的,這些問題說明你的系統盤出現了問題,或者是引導出現了問題。這該如何解決呢? 方法1. 檢查主板或硬盤…

【算法——雙指針】LeetCode 283 移動零

題目描述: 思路: (雙指針) O(n)O(n)O(n) 給定一個數組 nums,要求我們將所有的 0 移動到數組的末尾,同時保持非零元素的相對順序。 如圖所示,數組nums [0,1,0,3,12],移動完成后變成nums [1,3,12,0,0] &am…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代碼生成詳解 1 新建數據庫表結構(主子表) -- ---------------------------- -- 客戶表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

Docker部署rabbitmq遇到的問題 Stats in management UI are disabled on this node

1. Stats in management UI are disabled on this node #進入rabbitmq容器 docker exec -it {rabbitmq容器名稱或者id} /bin/bash#進入容器后,cd到以下路徑 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…

談談語音助手

目錄 1.什么是語音助手 2.語音助手的發展過程 3.現在有哪些成熟的語音助手 4.語音助手對人類發展的影響 1.什么是語音助手 語音助手是一種能夠通過語音交互與用戶進行溝通和執行任務的虛擬助手。它基于人工智能和自然語言處理技術,能夠理解用戶的語音指令&#x…

數據結構-隊列的實現(C語言版)

前言 隊列是一種特殊的線性表,它只允許在一端對數據進行插入操作,在另一端對數據進行刪除操作的特殊線性表,隊列具有先進先出的(FIFO)的 特性,進行插入操作的一端稱為隊尾,進行刪除操作的一端稱…

JZ37序列化二叉樹

題目地址:序列化二叉樹_牛客題霸_牛客網 題目回顧: 解題思路: 首先,序列化就是將二叉樹的節點值放入一個字符串中,這里可以按照前序遍歷的思路來進行操作,謙虛遍歷是:根左右的情況,…

什么是React?React與VU的優缺點有哪些?

什么是React?什么是VUE? 維基百科上的概念解釋,Vue.js是一個用于創建用戶界面的開源MVVM前端JavaScript框架,也是一個創建單頁應用的Web應用框架。Vue.js由尤雨溪(Evan You)創建,由他和其他活躍…

Cmd部署HexoGithub443問題

git config --global http.proxy “localhost:7890” 配置下代理即可 本文由 mdnice 多平臺發布

微信小程序 地圖map(電子圍欄圓形和多邊形)

正常情況下是沒有手機上畫電子圍欄的,公共平臺上我也沒找到,所以走了一個歪點子,就是給地圖添加點擊事件,記錄點的位置,在畫到電子圍欄上就是添加電子圍欄了,如果只是顯示電子圍欄就簡單了 一、多邊形電子…

2023.8.12號論文閱讀

文章目錄 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法實驗結果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法實驗結果 TriFormer: A Multi-mod…

macos搭建python3虛擬環境

我們知道macos自帶的python版本是Python2.7, 這個版本比較老而且往往和我們的工程不兼容,所以就得需要我們升級Python版本, 我們不建議直接升級macos自帶的本地Python2.7, 因為macos有一些基礎軟件是依賴于Python2.7的,如果動了遇到問題想再…

日志框架及其使用方法

log4j和logBack,同一個人寫的,logBack為log4j的升級版,SpringBoot中默認集成logBack 作用:記錄軟件發布后的一些bug,以及數據是怎樣被操作的 傳統開發弊端: 1.日志直接輸出在控制臺,關閉控制臺后,日志消…