詳解Nacos中注冊(cè)中心和配置中心的實(shí)現(xiàn)
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服務(wù)開(kāi)發(fā)解決方案,目前已被 Spring Cloud 官方收錄。而 Nacos 作為 Spring Cloud Alibaba 的核心組件之一,提供了兩個(gè)非常重要的功能:注冊(cè)中心和配置中心,我們今天來(lái)了解和實(shí)現(xiàn)一下二者。
1.Nacos 簡(jiǎn)介
Nacos 致力于幫助開(kāi)發(fā)者發(fā)現(xiàn)、配置和管理微服務(wù)。它提供了一組簡(jiǎn)單易用的特性集,幫助開(kāi)發(fā)者快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
Nacos 特性介紹
Nacos 具有以下特性:
- 服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測(cè):支持基于DNS和基于RPC的服務(wù)發(fā)現(xiàn),支持對(duì)服務(wù)的實(shí)時(shí)的健康檢查,阻止向不健康的主機(jī)或服務(wù)實(shí)例發(fā)送請(qǐng)求。
- 動(dòng)態(tài)配置服務(wù):動(dòng)態(tài)配置服務(wù)可以讓您以中心化、外部化和動(dòng)態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。
- 動(dòng)態(tài) DNS 服務(wù):動(dòng)態(tài) DNS 服務(wù)支持權(quán)重路由,讓您更容易地實(shí)現(xiàn)中間層負(fù)載均衡、更靈活的路由策略、流量控制以及數(shù)據(jù)中心內(nèi)網(wǎng)的簡(jiǎn)單 DNS 解析服務(wù)。
- 服務(wù)及其元數(shù)據(jù)管理:支持從微服務(wù)平臺(tái)建設(shè)的視角管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù)。
2.注冊(cè)中心實(shí)現(xiàn)
注冊(cè)中心有兩個(gè)重要的功能:服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn),它解決了微服務(wù)集群中,調(diào)用者和服務(wù)提供者連接管理和請(qǐng)求轉(zhuǎn)發(fā)的功能,讓程序的開(kāi)發(fā)者無(wú)需過(guò)多的關(guān)注服務(wù)提供者的穩(wěn)定性和健康程度以及調(diào)用地址,因?yàn)檫@些都可以依靠 Nacos 進(jìn)行監(jiān)測(cè)、管理和自動(dòng)轉(zhuǎn)發(fā)。
注冊(cè)中心中有兩個(gè)角色:一個(gè)是服務(wù)提供者 Provider,另一個(gè)是服務(wù)調(diào)用者 Consumer,接下來(lái)我們分別來(lái)創(chuàng)建二者。
2.1 創(chuàng)建服務(wù)提供者
2.1.1 新建項(xiàng)目并添加依賴(lài)
新建一個(gè) Spring Boot 項(xiàng)目,使用阿里云地址 http://start.aliyun.com 來(lái)創(chuàng)建 Spring Cloud Alibaba Nacos 項(xiàng)目,如下圖所示:

點(diǎn)擊 Next 下一步,如下圖所示:

增加 Nacos Service Discovery 框架支持,如下圖所示:

對(duì)應(yīng)的依賴(lài)框架如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
PS:添加 Spring Web(Spring MVC)框架主要是為了方便后面測(cè)試。
2.1.2 配置 Nacos 連接信息
在配置文件 application.properties 中要填寫(xiě) Nacos 的相關(guān)連接信息,具體信息如下:
# 應(yīng)用名稱(chēng)(也是 Nacos 中的服務(wù)名) spring.application.name=spring-cloud-nacos-producer # 應(yīng)用服務(wù) WEB 訪問(wèn)端口 server.port=8082 # Nacos認(rèn)證信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注冊(cè)到 nacos 的指定 namespace,默認(rèn)為 public spring.cloud.nacos.discovery.namespace=public
2.1.3 添加服務(wù)提供方法
新建一個(gè)控制器 Controller,添加一個(gè) sayhi 方法,此方法可以使用 HTTP 協(xié)議進(jìn)行訪問(wèn),它是為后面的服務(wù)消費(fèi)者提供的調(diào)用方法,具體實(shí)現(xiàn)如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class SpringCloudNacosProducerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNacosProducerApplication.class, args);
}
@RequestMapping("/sayhi/{name}")
public String sayHi(@PathVariable String name) {
return "Hi Nacos Discovery " + name;
}
}
編寫(xiě)完代碼之后,運(yùn)行項(xiàng)目就可以在 Nacos 的服務(wù)列表中看到它了,如下圖所示:

經(jīng)過(guò)以上步驟,我們的服務(wù)提供者就創(chuàng)建好了,接下來(lái)我們創(chuàng)建一個(gè)服務(wù)消費(fèi)者 Consumer。
2.2 創(chuàng)建服務(wù)消費(fèi)者
2.2.1 新建項(xiàng)目并添加依賴(lài)
此步驟和上面的服務(wù)提供者類(lèi)似,也是添加 nacos discovery 和 web 依賴(lài),具體實(shí)現(xiàn)如下:


2.2.2 配置 Nacos 連接信息
# 應(yīng)用名稱(chēng) spring.application.name=springcloud-nacos-consumer # 應(yīng)用服務(wù) WEB 訪問(wèn)端口 server.port=8082 # Nacos認(rèn)證信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # 注冊(cè)到 nacos 的指定 namespace,默認(rèn)為 public spring.cloud.nacos.discovery.namespace=public
2.2.3 添加服務(wù)調(diào)用代碼
服務(wù)消費(fèi)者的實(shí)現(xiàn)有兩個(gè)關(guān)鍵點(diǎn),第一,先 new 一個(gè) RestTemplate 對(duì)象,此對(duì)象是 Spring 框架提供用于進(jìn)行 HTTP 請(qǐng)求的類(lèi),實(shí)現(xiàn)代碼如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudNacosConsumerApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
// 用于進(jìn)行 HTTP 請(qǐng)求的對(duì)象
return new RestTemplate();
}
}
第二,新建一個(gè)控制器,注入 RestTemplate 對(duì)象,并調(diào)用 Nacos 中的服務(wù)提供者接口,實(shí)現(xiàn)代碼如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hi")
public String hi(String name) {
// 調(diào)用生產(chǎn)者 sayhi 方法,并返回結(jié)果
return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,
String.class);
}
}
其中 spring-cloud-nacos-producer 是服務(wù)提供者的 ID,而 sayhi 是服務(wù)提供者提供的接口地址。
通過(guò)以上配置,我們的服務(wù)消費(fèi)者也創(chuàng)建好了,啟動(dòng)項(xiàng)目,執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,服務(wù)消費(fèi)者通過(guò) Nacos 已經(jīng)成功調(diào)用到服務(wù)提供者了,這就是 Nacos 中注冊(cè)中心的基本使用。
3.配置中心實(shí)現(xiàn)
配置中心的作用是將本地配置文件云端話(huà),所謂的云端也就是 Nacos 的服務(wù)器端,這樣既能保證配置文件中的敏感數(shù)據(jù)不會(huì)暴露,同時(shí)又提供了實(shí)時(shí)的修改、查看、回滾和動(dòng)態(tài)刷新配置文件的功能,非常實(shí)用。
但是需要注意的是配置中心和注冊(cè)中心的依賴(lài)包是不同的,注冊(cè)中心的依賴(lài)包是 nacos discovery,而配置中心的依賴(lài)包是 nacos config,它的具體如下。
3.1 新建項(xiàng)目并添加依賴(lài)
創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,添加 nacos config 和 web 依賴(lài)包,如下圖所示:

PS:添加 web 依賴(lài)主要是為了方便后面測(cè)試。
對(duì)應(yīng)的配置依賴(lài)信息如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.2 配置 Nacos Config 信息
在應(yīng)用的 /src/main/resources/ 目錄下,創(chuàng)建引導(dǎo)配置文件 bootstrap.yml(或 bootstrap.properties),添加以下 Nacos Config 配置:
spring:
application:
name: nacosconfig # 項(xiàng)目名稱(chēng)和 nacos DataId 相匹配
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # nacos 地址和端口
file-extension: yaml # 獲取配置文件的格式:yaml
username: nacos # nacos 認(rèn)證用戶(hù)名
password: nacos # nacos 認(rèn)證密碼
server:
port: 9001 # 項(xiàng)目啟動(dòng)端口
3.3 編寫(xiě)代碼讀取配置文件
新建控制器,使用 @Value 注解讀取配置信息,實(shí)現(xiàn)代碼如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// 從 nacos 中讀取配置項(xiàng) config.info
@Value("${config.info}")
private String configInfo;
@GetMapping("/getconfig")
public String getConfigInfo(){
return configInfo;
}
}
3.4 Nacos 控制臺(tái)添加配置信息
在 Nacos 控制臺(tái)創(chuàng)建并設(shè)置配置文件,執(zhí)行步驟如下所示。
首先,在配置列表中點(diǎn)擊“添加”按鈕,如下圖所示:

進(jìn)入配置頁(yè)面,新建 YAML 或 Properties 配置文件,如下圖所示:

以上關(guān)鍵參數(shù)的含義和規(guī)則說(shuō)明如下。
3.4.1 Data ID
Data ID 的拼接格式如下:
${prefix} - ${spring.profiles.active} . ${file-extension}
其中
- prefix 默認(rèn)為 spring.application.name 的值,也可以通過(guò)配置項(xiàng) spring.cloud.nacos.config.prefix 來(lái)配置。
- spring.profiles.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,當(dāng) active profile 為空時(shí),對(duì)應(yīng)的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
- file-extension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過(guò)配置項(xiàng) spring.cloud.nacos.config.file-extension 來(lái)配置。目前只支持 properties 類(lèi)型。
3.4.2 Group
Group 分組選項(xiàng),主要是用來(lái)隔離不同的配置項(xiàng)目的,它的默認(rèn)值為 DEFAULT_GROUP,可以通過(guò) spring.cloud.nacos.config.group 配置。
配置好相應(yīng)的內(nèi)容之后,點(diǎn)擊底部的“發(fā)布”按鈕即可,添加成功之后會(huì)自動(dòng)返回配置列表,如下圖所示:

經(jīng)過(guò)以上步驟,Nacos 配置中心的功能就實(shí)現(xiàn)完了,接下來(lái)啟動(dòng)項(xiàng)目,程序的執(zhí)行結(jié)果如下圖所示:

3.5 動(dòng)態(tài)刷新功能
動(dòng)態(tài)刷新功能是指,在 Nacos 配置中心修改了配置文件,在不重啟項(xiàng)目的前提下,可以實(shí)時(shí)讀取到最新的配置內(nèi)置。
Nacos 默認(rèn)會(huì)為所有獲取數(shù)據(jù)成功的 Nacos 的配置項(xiàng)添加了監(jiān)聽(tīng)功能,在監(jiān)聽(tīng)到服務(wù)端配置發(fā)生變化時(shí)會(huì)實(shí)時(shí)觸發(fā) org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法。
但如果需要對(duì) Bean 進(jìn)行動(dòng)態(tài)刷新,需要參照 Spring 和 Spring Cloud 規(guī)范,推薦給類(lèi)添加 @RefreshScope 或 @ConfigurationProperties 注解,就可以實(shí)現(xiàn)配置中心的動(dòng)態(tài)刷新功能了。
4.項(xiàng)目源碼
https://gitee.com/mydb/spring-cloud-alibaba-example
小結(jié)
Nacos 作為 Spring Cloud Alibaba 的核心組件之一,提供了兩個(gè)非常重要的功能:注冊(cè)中心和配置中心。注冊(cè)中心有兩個(gè)重要的功能:服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn),它解決了微服務(wù)集群中,調(diào)用者和服務(wù)提供者連接管理和請(qǐng)求轉(zhuǎn)發(fā)的功能,保證了服務(wù)調(diào)用者能夠穩(wěn)定的調(diào)用到健康的服務(wù)。而注冊(cè)中心的本質(zhì)是將項(xiàng)目中的本地配置文件云端化,解決了配置文件的安全性與統(tǒng)一性的問(wèn)題,并且提供了配置文件歷史版本回滾和配置文件動(dòng)態(tài)刷新的功能。
到此這篇關(guān)于詳解Nacos中注冊(cè)中心和配置中心的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nacos注冊(cè)中心 配置中心內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java排查一個(gè)線(xiàn)上死循環(huán)cpu暴漲的過(guò)程分析
這篇文章主要介紹了java排查一個(gè)線(xiàn)上死循環(huán)cpu暴漲的過(guò)程分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程
這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
SSH結(jié)合jquery實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了SSH結(jié)合jquery實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
解析Oracle數(shù)據(jù)庫(kù)中的對(duì)象集合schema
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中的對(duì)象集合schema,是Oracle數(shù)據(jù)庫(kù)入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):緒論
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-07-07
java工具類(lèi)static靜態(tài)方法讀取yml配置過(guò)程
文章介紹了在工具類(lèi)中獲取YAML配置時(shí)遇到的問(wèn)題,由于變量是靜態(tài)的,而Spring加載靜態(tài)方法比IOC容器早,導(dǎo)致無(wú)法直接使用@Value注解讀取YAML配置,從而讀取結(jié)果為null2024-11-11
Springboot實(shí)例講解實(shí)現(xiàn)寵物醫(yī)院管理系統(tǒng)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Springboot實(shí)現(xiàn)寵物醫(yī)院綜合管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-06-06

