閱讀提醒:
- 本文面向的是有一定springboot基礎者
- 本次教程使用的Spring Cloud Hoxton RELEASE版本
本文概覽
- 什么是注冊中心?
- 什么是配置中心?
- 如何在springcloud中使用Nacos?
前言
在使用nacos之前我們需要理解nacos在整個微服務架構中擔任了什么樣的角色,在微服務架構中,注冊中心是非常核心的基礎服務之一,在微服務流行之前就已經出現在分布式架構中,比如Dubbo,Dubbo在國內是比較流行的分布式架構,也是一個非常實用的框架,提供了比較完備的服務治理功能,而服務治理的實作主要依靠注冊中心,
本文中用到的demo原始碼地址:https://github.com/WinterChenS/spring-cloud-hoxton-study
什么是注冊中心?
注冊中心可以說是微服務架構中的”通訊錄“,它記錄了服務和服務地址的映射關系,在分布式架構中,服務會注冊到這里,當服務需要呼叫其它服務時,就這里找到服務的地址,進行呼叫,

列舉一個比較簡單的生活例子:
- 小明要給小紅打電話,需要從通訊錄(注冊中心)中獲取到小紅的電話號碼(服務地址);
- 小明根據通訊錄中的電話號碼撥打小紅的電話號碼(服務請求);
- 小紅接通了電話,并隨后完成了通話;
- 后面再撥打小紅的電話號碼可以通過電話保存的號碼進行撥打(本地快取);
nacos在整個微服務架構中充當了通訊錄的角色,服務之間的呼叫,監控等都需要通過注冊中心進行獲取服務的地址埠的映射,并且一般服務端都會有本地快取,下次請求之前會查詢本地的服務映射資訊,可以減少網路請求提高服務的吞吐量,
什么是配置中心?
配置中心其實理解起來很簡單,就是字面意思,把服務的配置集中在配置中心,可以實作動態的修改,避免了每次修改組態檔都需要重新發布服務的尷尬,
下載nacos,并啟動
Nacos 致力于幫助您發現、配置和管理微服務,Nacos 提供了一組簡單易用的特性集,幫助您快速實作動態服務發現、服務配置、服務元資料及流量管理,下載地址https://github.com/alibaba/nacos/releases,下載最新版的2.0版本,
下載完成后,解壓,在解壓后的檔案的/bin目錄下,windows系統點擊startup.cmd就可以啟動nacos,linux或mac執行以下命令啟動nacos,
sh startup.sh -m standalone
登陸頁面:http://localhost:8848/nacos/ 登陸用戶nacos,登陸密碼為nacos,
jdk版本
- jdk: 1.8
- maven: 3.3.9
- nacos: 2.0
springcloud 和 springboot 版本
- springcloud: Hoxton.RELEASE
- springboot: 2.2.13.RELEASE
- springcloud-alibaba: 2.2.0.RELEASE
配置中心
首先我們新建一個springboot 基礎專案,這里專案命名為:spring-cloud-hoxton-study
專案結構:
-spring-cloud-hoxton-study
|—spring-cloud-nacos-consumer
|—pom.xml
父pom檔案加入依賴(spring-cloud-hoxton-study):
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
<spring-boot.version>2.2.13.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springBoot依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 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>
子pom修改(spring-cloud-nacos-consumer):parent
<parent>
<groupId>com.winterchen</groupId>
<artifactId>spring-cloud-hoxton-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
子pom加入依賴(spring-cloud-nacos-consumer):
<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>
注意:這里只是放了主要的maven依賴,如果需要查看全部的依賴,請查看demo的原始碼
創建配置:bootstrap.properties 或者 bootstrap.yml
bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=winter-nacos-consumer
spring.profiles.active=dev
bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
application:
name: winter-nacos-consumer
profiles:
active: dev
文中的:127.0.0.1:8848 就是上面搭建的nacos服務
之所以需要配置 spring.application.name是因為nacos默認獲取組態檔是按照name作為dataId的
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默認為
spring.application.name的值,也可以通過配置項spring.cloud.nacos.config.prefix來配置, spring.profiles.active即為當前環境對應的profile,詳情可以參考Spring Boot檔案, 注意:當spring.profiles.active為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}file-exetension為配置內容的資料格式,可以通過配置項spring.cloud.nacos.config.file-extension來配置,目前只支持properties和yaml型別,
在nacos配置中心創建組態檔

配置詳情:
Data ID: winter-nacos-consumer-dev.yaml
Group: DEFAULT_GROUP
配置內容:
server:
port: 16011
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
test:
config:
refresh: true
自動重繪
通過 Spring Cloud 原生注解 @RefreshScope 實作配置自動更新:
@Api("nacos api")
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController extends BaseController {
@Value("${test.config.refresh:true}")
private boolean refresh;
@GetMapping("/")
public CommonResult<Boolean> get() {
return CommonResult.success(refresh);
}
}
如何測驗
我們可以通過請求上面的介面: http://127.0.0.1:16011/nacos
回傳的結果是:true
然后修改一下配置中心的:
test:
config:
refresh: false
可以發現控制臺的日志有列印:
2021-07-27 11:25:13.973 INFO 17240 --- [8.25.36.41_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [test.config.refresh]
再請求一次就可以發現結果變成了:false
服務注冊與發現

仍然使用上面的專案進行
添加依賴:
<!-- Nacos 注冊中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
增加配置
以下是完整的配置
server:
port: 16011
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
test:
config:
refresh: true
啟動類增加:@EnableDiscoveryClient 以啟用服務注冊與發現
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class SpringCloudNacosApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNacosApplication.class, args);
}
}
接下來需要測驗一下服務注冊與發現的功能是否正常,所以我們需要復制原有的服務spring-cloud-nacos-consumer 并改名為:spring-cloud-nacos-provider
當前工程結構:
-spring-cloud-hoxton-study
|—spring-cloud-nacos-consumer
|—spring-cloud-nacos-provider
|—pom.xml
spring-cloud-nacos-consumer 服務下的NacosController 增加方法:echo
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController {
@Value("${test.config.refresh:true}")
private boolean refresh;
private final RestTemplate restTemplate;
@Autowired
public NacosController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("")
public boolean get() {
return refresh;
}
@GetMapping("/echo/{str}")
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://winter-nacos-provider/nacos/echo/" + str, String.class);
}
}
spring-cloud-nacos-provider 服務下的NacosController 增加方法:echo
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosController {
@Value("${test.config.refresh:true}")
private boolean refresh;
@GetMapping("")
public boolean get() {
return refresh;
}
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
開始測驗:
測驗之前需要給spring-cloud-nacos-provider 進行配置中心的配置:
- 修改
bootstrap.yml的spring.application.name=winter-nacos-provider; - 在配置中心新增組態檔:
winter-nacos-provider-dev.yaml具體的配置如下:
server:
port: 16012
spring:
cloud:
nacos:
discovery:
server-addr: 118.25.36.41:8848
profiles:
active: dev
test:
config:
refresh: true
分別啟動兩個服務,然后呼叫介面: http://127.0.0.1:16011/nacos/echo/hello
請求的結果:

總結
本文介紹了springcloud如何使用nacos作為配置中心和注冊中心,作為微服務中比較核心的兩個基礎功能,需要熟練的在實戰中進行使用,后面也會陸續介紹如何與其他的組件進行組合使用,
上面使用的restTemplate進行服務的呼叫,這樣顯然在實際的使用當中是非常的不便利的,那么在實際應用中使用什么方式進行遠程呼叫呢?下一篇將介紹如何使用open feign進行遠程服務呼叫的,
原始碼地址
https://github.com/WinterChenS/spring-cloud-hoxton-study
參考文獻:
Nacos Spring Cloud 快速開始
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291825.html
標籤:其他
