日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Nacos注册中心的部署与用法详细介绍

發布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nacos注册中心的部署与用法详细介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是注冊中心:

???????? 我們知道微服務彼此間獨立部署、具有清晰的邊界,服務間通過遠程調用來構建復雜的業務功能。而服務冊中心在微服務項目中扮演著非常重要的角色,那么注冊中心又是什么,使用服務注冊中心可以解決微服務中的哪些問題呢?

1、什么是注冊中心:

????????注冊中心是微服務架構中的紐帶,類似于“通訊錄”,它記錄了服務和服務地址的映射關系。在分布式架構中,服務會注冊到這里,當服務需要調用其它服務時,就到這里找到服務的地址并進行調用。注冊中心本質上是為了解耦服務提供者和服務消費者。對于任何一個微服務,原則上都應存在或者支持多個提供者,這是由微服務的分布式屬性決定的,更進一步,為了支持彈性擴縮容特性,一個微服務的提供者的數量和分布往往是動態變化的,也是無法預先確定的。因此,原本在單體應用階段常用的靜態LB機制就不再適用了,需要引入額外的組件來管理微服務提供者的注冊與發現,而這個組件就是服務注冊中心。

?2、注冊中心的核心功能:

  • 服務注冊:服務實例將自身服務信息注冊到注冊中心
  • 服務發現:服務實例通過注冊中心,獲取到注冊到其中的服務實例的信息,通過這些信息去請求它們提供的服務
  • 服務剔除:服務注冊中心將出問題的服務自動剔除到可用列表之外,使其不會被調用到

3、注冊中心解決的問題:

(1)屏蔽、解耦服務之間相互依賴的細節:

????????服務之間的遠程調用必須要知道對方IP、端口。但是該調用方式存在明顯的問題,如被調用的IP、端口變化后,調用方也要同步修改。通過服務發現,將服務之間IP與端口的依賴轉化為服務名的依賴,服務名可以根據具體微服務業務來做標識。

(2)對服務進行動態管理:

????????在微服務架構中,服務數量多且依賴錯綜復雜,無論是服務主動停止、意外掛掉,還是因為流量增加對服務擴容,這些服務狀態上的動態變化,都需要盡快的通知到被調用方,被調用方才采取相應的措施。所以,對于服務注冊中心要實時管理服務的數據與狀態,包括服務的注冊上線、服務主動下線,異常服務的剔除。

(3)降低服務端負載均衡中間件的壓力:

????????當服務越來越多時,服務 URL 配置管理變得非常困難,服務端的負載均衡中間件,比如 F5、Nginx 壓力也越來越大。通過服務注冊中心,就可以實現動態地注冊和發現服務,使服務的位置透明,并通過在消費方獲取服務提供方地址列表,實現軟負載均衡和 Failover,降低對服務端的負載均衡中間件,也能減少部分成本。

4、服務的發現與注冊的實現模式:

????????上面提到,硬件的 F5、軟件的 Nginx 也可以實現服務的發現,那么這與注冊中心的服務發現有什么區別呢?這其實是服務發現與注冊的兩種實現模式:服務端的發現模式 和 客戶端的發現模式。F5、Nginx 屬于服務端的發現模式,服務注冊中心屬于客戶端的發現模式,兩種模式各有優缺點,也適用于不同的場景,對于大型應用一般會有多層負載,外層用服務器端負載均衡,內部用客戶端負載均衡。接下來我們就具體看看兩種服務發現模式是怎么樣的:

(1)服務端的發現模式:

????????服務端的發現模式是通過使用一個中間的服務器,來屏蔽被調用服務的復雜性與變動性,當有新的服務加入或老服務剔除時,只需要修改中間服務器上的配置即可,此模式的顯著特點是:引入獨立的中間代理服務器來屏蔽真實服務的具體細節。

????????如下圖所示:當服務A要調用服務B時,先通過 DNS 域名解析找到 Nginx 服務器,然后將請求發送給Nginx,因為在 Nginx 上配置了服務B的真實訪問地址,Nginx 收到請求后根據負載均衡算法,將請求轉發到某個真實的服務B,服務B將請求結果返回給 Nginx,Nginx 再將返回結果給服務A,整個請求流程結束。當然中間服務器不一定非得是 Nginx,還可以是基于硬件的 F5,也可以是工作在傳輸層的 IP 負載均衡等。

????????該模式的優點是:配置集中在獨立的中間服務器端完成,對代碼沒有任何入侵,也不存在跨平臺跨語言的問題。但缺點也很明顯,因為所有請求都需要穿透中間服務器,所以中間服務器會成為一個單點,對性能也會有所影響。

(2)客戶端的發現模式:

????????我們再看看客戶端的發現模式,服務A調用服務B時,不需要通過中間服務器,而是在自己進程內維護了服務B的信息,再通過負載算法選擇一個服務B直接調用。那服務A具體是怎么維護服務B的信息呢?為此引入了服務注冊中心的概念,當服務B啟動時向注冊中心注冊自己(將自己的信息發送到注冊中心的注冊表里),服務A再從注冊中心獲取所有注冊的服務,這就是客戶端模式的基本原理。

????????客戶端模式因為在進程內直接調用服務,也叫做進程內負載,由于不需要穿透中間服務器,所以客戶端模式的性能損耗比較小。但是,需要在服務內部維護服務注冊信息,負載算法等,有一定的代碼入侵性,對于跨平臺,跨語言的支持不太友好。

5、服務注冊表:

????????微服務架構中,所有的服務啟動后都通過注冊中心來注冊自己,同時把注冊中心里面的服務信息拉回本地,后續調用時就直接檢查本地的服務和節點信息來進行服務節點的調用。每個服務節點都會來注冊中心進行服務注冊,那注冊信息是如何在服務端保存的呢,其實就是注冊表,服務注冊的時候把自己的信息上報上來,然后注冊中心把注冊表,返回給客戶端,那服務之間就知道要調用服務的節點了。

????????服務注冊表需要高可用而且隨時更新。客戶端能夠緩存從服務注冊表中獲取的服務地址,然而,這些信息最終會過時,客戶端也就無法發現服務實例。因此,服務注冊表會包含若干服務端,并使用復制協議保持一致性。服務注冊表不能是單點,否則存在單點故障,當服務注冊表有多臺服務器的時需要考慮服務注冊表的信息在多臺機器上的實時同步和一致。

二、主流服務注冊中心的對比:

?(1)Zookeeper 和 Consul 遵循 CP 原則,保證了強一致性和分區容錯性,放棄可用性,在分布式環境中,如果涉及數據存儲的場景,數據一致性應該是首先被保證的,但對于服務發現來說,可用性才是最核心的,針對同一個服務,即使注冊中心的不同節點保存的服務提供者信息不相同,也并不會造成災難性的后果。因為對于服務消費者來說,能消費才是最重要的,消費者拿到不正確的服務實例信息后嘗試消費一下,也勝過因為無法獲取實例信息而不去消費而導致系統異常

(2)Eureka 遵循 AP 原則,保證可用性,放棄數據一致性,基本能滿足注冊中心所需的核心功能,但 Eureka 2.x 版本已停止開發,并且宣布如果繼續使用的話,風險自負。

(3)Nacos 同時支持 AP 與 CP,默認是 AP,同時功能更豐富,與 SpringCloud Alibaba 的兼容性更好,使用更簡單靈活,可以滿足更多的業務場景,且支持 K8S 的集成。

不同的服務注冊中心組件的應用場景不同,讀者可以根據自己的業務情況進行選型。但下文我們主要以 Nacos 注冊中心為例進行介紹,其他幾種注冊中心讀者自行上網查閱

三、Nacos 注冊中心的部署與使用:

1、Nacos 注冊中心的搭建:

????????我們先去 Nacos 的 Github(Tags · alibaba/nacos · GitHub)下載我們所需的 Nacos 版本,可以選擇 windows 或者 Linux,如下圖:

????????由于當時在搭建項目的時候,考慮到與 SpringBoot 和 SpringCloud 的版本對應問題,我這里是下載了 2.0.0 的版本進行搭建,讀者可以根據自己的情況選擇對應的 Nacos 版本。

?1.1、Windows 環境:

下載并解壓 nacos-server-2.0.0.zip,解壓完成后進入 /bin 目錄,可以看到下面兩個腳本:

windows 環境直接運行 startup.cmd 啟動項目,出現以下界面則啟動完成:

在瀏覽器輸入 http://localhost:8848/nacos 進入Nacos的登錄界面,用戶名與密碼默認都是 nacos,登錄成功后界面如下:

1.2、Linux 環境:

????????Nacos 在 Linux 環境下的啟停跟在 windows 環境的啟停基本一致,先下載 nacos-server-2.0.0.tar.zip 壓縮包,然后上傳到 Linux 服務器上進行解壓(解壓命令:tar -zxvf nacos-server-2.0.0.tar.gz),解壓完成后同樣進入 /bin 目錄執行啟動命令(單機模式啟動命令:sh startup.sh -m standalone),啟動完成后再訪問 nacos 控制臺地址(http://服務器ip地址:8848/nacos/index.html)驗證是否成功啟動即可。

2、SpringBoot 整合 Nacos 進行服務注冊發現:

我們首先看一下 nacos 的簡單架構圖:

參照上面的架構圖,我們分別創建兩個模塊,分別是 cloud-producer-server(服務提供者)、cloud-consumer(服務消費者),職責如下:

  • cloud-producer-server:注冊進入nacos-server,對外暴露服務
  • cloud-consumer:注冊進入nacos-server,調用 cloud-producer-server 的服務

創建這兩個模塊前,我們先聲明項目的版本信息:

<properties><spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR9</spring-cloud.version><spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version> </properties><!-- 只聲明依賴,不引入依賴 --> <dependencyManagement><dependencies><!-- 聲明springBoot版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 聲明springCloud版本 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 聲明 springCloud Alibaba 版本 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>

2.1、創建服務提供者 cloud-producer-server:

(1)引入maven依賴:

<!-- 引入阿里的nacos作為服務注冊中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

(2)添加 nacos 相關的配置信息:

在 application.properties 配置文件指定服務名稱、端口號、nacos-server 的地址信息,如下:

spring.application.name = cloud-producer-server server.servlet.context-path = /${spring.application.name} server.port=9000# nacos注冊中心配置 spring.cloud.nacos.discovery.server-addr = localhost:8848 spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04 spring.cloud.nacos.discovery.register-enabled = true

(3)開啟服務注冊發現的功能:

在主 Application 啟動類加入 @EnableDiscoveryClient 注解開啟服務注冊發現的功能,如下:

/*** SpringBoot啟動類* @EnableDiscoveryClient 開啟服務注冊發現的功能*/ @EnableDiscoveryClient @SpringBootApplication public class ProducerApplication {public static void main(String[] args){SpringApplication.run(ProducerApplication.class, args);} }

(4)實現個演示功能:

????????cloud-producer-server 作為服務提供者注冊到 nacos 中,肯定需要提供個服務來供消費者 cloud-consumer 調用,下面簡單寫一個演示接口:

@RestController @RequestMapping (value = "/") public class CloudController {@PostMapping ("getSum")public String getSum(@RequestParam (value = "num1") Integer num1, @RequestParam (value = "num2") Integer num2){return "success:兩數求和結果=" + (num1 + num2);} }

(5)啟動項目:

????????啟動項目之后,我們進入 nacos 控制臺,在 nacos 的 “服務管理->服務列表” 的 “91b5489b-d009-4725-86fa-534f760b4d04” 空間中將會發現注冊進入的 cloud-producer-server 這個服務,如下圖:

?2.2、創建服務消費者 cloud-consumer:

服務消費者的創建步驟與服務提供者基本一致

(1)引入maven依賴:

<!-- 引入阿里的nacos作為服務注冊中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

(2)添加 nacos 相關的配置信息:

spring.application.name = cloud-consumer server.port=9001# nacos注冊中心配置 spring.cloud.nacos.discovery.server-addr = localhost:8848 spring.cloud.nacos.discovery.namespace = 91b5489b-d009-4725-86fa-534f760b4d04 spring.cloud.nacos.discovery.register-enabled = true

(3)開啟服務注冊發現的功能:

/*** SpringBoot啟動類* @EnableDiscoveryClient 開啟服務注冊發現的功能*/ @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication {public static void main(String[] args){SpringApplication.run(ConsumerApplication.class, args);} }

(4)調用服務提供方的演示功能:

????????cloud-producer-server 服務提供方提供一個演示功能,那我們如何調用該功能呢?其實 Nacos 集成了 Ribbon(有關 Ribbon 的詳細介紹請參考這篇文章:https://blog.csdn.net/a745233700/article/details/122916856),因此我們便能使用 Ribbon 的負載均衡來調用服務,步驟如下:

① 創建 RestTemplate,使用 @LoadBalanced 注解標注開啟負載均衡:

@Configuration public class RestConfig {/*** 創建restTemplate對象。* LoadBalanced注解表示賦予restTemplate使用Ribbon的負載均衡的能力(一定要加上注解,否則無法遠程調用)*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();} }

② 通過 RestTemplate 請求遠程服務地址并接收返回值

@RestController @RequestMapping (value = "api/invoke") public class InvokeController {@Autowiredprivate RestTemplate restTemplate;/*** 使用 RestTemplate 進行遠程服務調用,并且使用 Ribbon 進行負載均衡*/@ApiOperation (value = "RestTemplate", notes = "使用RestTemplate進行遠程服務調用,并使用Ribbon進行負載均衡")@GetMapping ("getByRestTemplate")public String getByRestTemplate(Integer num1, Integer num2){//第一個cloud-producer-server代表在nacos注冊中心中的服務名,第二個cloud-producer-server代表contextPath配置的項目路徑String url = "http://cloud-producer-server/cloud-producer-server/getSum";MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();params.add("num1", num1);params.add("num2", num2);//通過服務名的方式調用遠程服務(非ip端口)return restTemplate.postForObject(url, params, String.class);} }

(5)啟動測試,查看nacos注冊中心控制面板情況

????????啟動成功后將會在 nacos 中的服務列表中看到 cloud-consumer,如下圖:

?那么接下來就測試下服務能否調的通?訪問服務消費方的 api/invoke/getByRestTemplate接口,可以看到請求結果如下:

3、Nacos 的集群化部署:

????????前面的介紹中,我們并未對 Nacos 服務端做任何特殊的配置,一切均以默認的單機模式運行,但是單機運行模式僅適用于學習與測試環境,對于有高可用要求的生產環境顯然是不合適的。那我們怎么搭建支持高可用的集群環境呢?

????????在搭建 Nacos 集群前,我們需要先修改 Nacos 的數據持久化配置為 MySQL 存儲。默認情況下,Nacos 使用內嵌的數據庫 Derby實現數據的存儲,這種情況下,如果啟動多個默認配置下的 Nacos 節點,數據存儲是存在一致性問題的。為了解決這個問題,Nacos 采用了集中式存儲的方式來支持集群化部署,但目前 Nacos 只支持 MySQL 的存儲,且版本要求:5.6.5+

3.1、Nacos 配置的持久化:

(1)初始化 MySQL 數據庫:

????????首先在 MySQL 中新建一個數據庫 nacos-config(名稱隨意),然后執行 Nacos 中的SQL腳本,該腳本是 Nacos-server 的 conf 文件夾中的 nacos-mysql.sql,如下圖:

執行該腳本,將會自動創建表,如下圖:

?(2)修改 conf/application.properties 配置文件:

????????Nacos-server 也是一個Spring Boot 項目,想要連接自己的數據庫,當然要配置數據源了,配置文件同樣在 Nacos-server 中的 conf 目錄下,如下圖:

?只需要將 application.properties 中的 Mysql 配置成自己的數據源并重啟 Nacos-server 即可 ,如下:

# 此項一定要啟用,默認是注釋掉的 spring.datasource.platform=mysql# 注意MySQL8.0以上版本指定url時一定要帶入serverTimezone參數 db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos_config?serverTimezone=Asia/Shanghai&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456# 可選啟用配置 nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false

3.2、Nacos 集群化部署:

????????Nacos 官方推薦在生產環境使用集群模式部署,這樣可以避免單點故障,集群化部署的架構圖如下:

??? ??? ?請求先通過 Nginx 集群進行轉發到 Nacos 集群中,當然為了保持高可用,數據庫也需要是集群模式。那么接下來我們就演示下搭建 Nacos 集群的方法。

??? ??? ?由于條件限制,我們僅在一臺服務器上啟動三個Nacos服務演示。Nacos的端口分別為8848、8849、8850。

(1)修改端口號:

??? ??? ?Nacos 默認的端口號是 8848,那么如何修改端口呢?只需要修改 conf 目錄下的 application.properties 中的 server.port 即可,如下圖:

(2)修改集群配置:

那么如何配置集群呢?在 conf 目錄下有一個 cluster.conf.example 文件,如下圖:

只需要將 cluster.conf.example 這個文件復制一份為 cluster.conf 放在 conf 目錄下,其中配置的內容如下:

172.16.1.84:8848
172.16.1.84:8849
172.16.1.84:8850

(3)修改數據源:

這個在持久化的那里已經講過了,只需要將 application.properties 中的數據源替換掉,如下:

# 此項一定要啟用,默認是注釋掉的 spring.datasource.platform=mysql# 注意MySQL8.0以上版本指定url時一定要帶入serverTimezone參數 db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos_config?serverTimezone=Asia/Shanghai&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456# 可選啟用配置 nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false

(4)啟動Nacos:

????????經過上述的步驟 Nacos 集群已經配置好了,啟動 Nacos 成功后,訪問任意一個端口的 Nacos 服務,在 “集群管理->節點列表” 中將會看到自己搭建的三個節點,如下圖:

至此,Nacos集群算是搭建完成了

(5)Nginx 中的配置:

此處就不演示Nginx集群搭建了,直接在單機的Nginx中配置。直接修改nginx的conf文件,內容如下:

upstream nacos{server 172.16.1.84:8848;server 172.16.1.84:8849;server 172.16.1.84:8850;}server{listen 80;location / {proxy_pass http://nacos;}}

(6)項目中配置 server-addr:

既然搭建了集群,那么項目中也要配置一下,有兩種方式,下面分別介紹:

第一種:通過直連的方式配置,如下:

spring:application:## 指定服務名稱,在nacos中的名字name: cloud-producer-servercloud:nacos:discovery:# nacos的服務地址,nacos-server中IP地址:端口號server-addr: 172.16.1.84:8848,172.16.1.84:8849,172.16.1.84:8850

第二種:直接連接Nginx,如下:

spring:application:## 指定服務名稱,在nacos中的名字name: cloud-producer-servercloud:nacos:discovery:# nacos的服務地址,nacos-server中IP地址:端口號server-addr: 172.16.1.84:80

Nacos 集群搭建非常簡單,唯一的配置就是在 cluster.conf 中設置三個 Nacos 服務的地址。

參考文章:

微服務為什么要有服務發現與注冊?

五十五張圖告訴你微服務的靈魂擺渡者Nacos究竟有多強?

總結

以上是生活随笔為你收集整理的Nacos注册中心的部署与用法详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。