一文快速上手 Nacos 註冊中心+設定中心!

2022-08-30 21:01:00

Spring Cloud Alibaba 是阿里巴巴提供的一站式微服務開發解決方案,目前已被 Spring Cloud 官方收錄。而 Nacos 作為 Spring Cloud Alibaba 的核心元件之一,提供了兩個非常重要的功能:註冊中心和設定中心,我們今天來了解和實現一下二者。

1.Nacos 簡介

Nacos 致力於幫助開發者發現、設定和管理微服務。它提供了一組簡單易用的特性集,幫助開發者快速實現動態服務發現、服務設定、服務後設資料及流量管理。

Nacos 特性介紹

Nacos 具有以下特性:

  • 服務發現和服務健康監測:支援基於DNS和基於RPC的服務發現,支援對服務的實時的健康檢查,阻止向不健康的主機或服務範例傳送請求。
  • 動態設定服務:動態設定服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用設定和服務設定。
  • 動態 DNS 服務:動態 DNS 服務支援權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單 DNS 解析服務。
  • 服務及其後設資料管理:支援從微服務平臺建設的視角管理資料中心的所有服務及後設資料。

2.註冊中心實現

註冊中心有兩個重要的功能:服務註冊和服務發現,它解決了微服務叢集中,呼叫者和服務提供者連線管理和請求轉發的功能,讓程式的開發者無需過多的關注服務提供者的穩定性和健康程度以及呼叫地址,因為這些都可以依靠 Nacos 進行監測、管理和自動轉發。

註冊中心中有兩個角色:一個是服務提供者 Provider,另一個是服務呼叫者 Consumer,接下來我們分別來建立二者。

2.1 建立服務提供者

2.1.1 新建專案並新增依賴

新建一個 Spring Boot 專案,使用阿里雲地址 http://start.aliyun.com 來建立 Spring Cloud Alibaba Nacos 專案,如下圖所示:

點選 Next 下一步,如下圖所示:

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

對應的依賴框架如下:

<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)框架主要是為了方便後面測試。

2.1.2 設定 Nacos 連線資訊

在組態檔 application.properties 中要填寫 Nacos 的相關連線資訊,具體資訊如下:

# 應用名稱(也是 Nacos 中的服務名)
spring.application.name=spring-cloud-nacos-producer
# 應用服務 WEB 存取埠
server.port=8082
# Nacos認證資訊
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與註冊設定,其中子屬性 server-addr 指定 Nacos 伺服器主機和埠
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 註冊到 nacos 的指定 namespace,預設為 public
spring.cloud.nacos.discovery.namespace=public

2.1.3 新增服務提供方法

新建一個控制器 Controller,新增一個 sayhi 方法,此方法可以使用 HTTP 協定進行存取,它是為後面的服務消費者提供的呼叫方法,具體實現如下:

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;
    }
}

編寫完程式碼之後,執行專案就可以在 Nacos 的服務列表中看到它了,如下圖所示:

經過以上步驟,我們的服務提供者就建立好了,接下來我們建立一個服務消費者 Consumer。

2.2 建立服務消費者

2.2.1 新建專案並新增依賴

此步驟和上面的服務提供者類似,也是新增 nacos discovery 和 web 依賴,具體實現如下:

2.2.2 設定 Nacos 連線資訊

# 應用名稱
spring.application.name=springcloud-nacos-consumer
# 應用服務 WEB 存取埠
server.port=8082
# Nacos認證資訊
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與註冊設定,其中子屬性 server-addr 指定 Nacos 伺服器主機和埠
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 註冊到 nacos 的指定 namespace,預設為 public
spring.cloud.nacos.discovery.namespace=public

2.2.3 新增服務呼叫程式碼

服務消費者的實現有兩個關鍵點,第一,先 new 一個 RestTemplate 物件,此物件是 Spring 框架提供用於進行 HTTP 請求的類,實現程式碼如下:

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() {
        // 用於進行 HTTP 請求的物件
        return new RestTemplate();
    }
}

第二,新建一個控制器,注入 RestTemplate 物件,並呼叫 Nacos 中的服務提供者介面,實現程式碼如下:

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) {
        // 呼叫生產者 sayhi 方法,並返回結果
        return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,
                String.class);
    }
}

其中 spring-cloud-nacos-producer 是服務提供者的 ID,而 sayhi 是服務提供者提供的介面地址。

通過以上設定,我們的服務消費者也建立好了,啟動專案,執行結果如下圖所示:

從上述結果可以看出,服務消費者通過 Nacos 已經成功呼叫到服務提供者了,這就是 Nacos 中註冊中心的基本使用。

3.設定中心實現

設定中心的作用是將本地組態檔雲端話,所謂的雲端也就是 Nacos 的伺服器端,這樣既能保證組態檔中的敏感資料不會暴露,同時又提供了實時的修改、檢視、回滾和動態重新整理組態檔的功能,非常實用。

但是需要注意的是設定中心和註冊中心的依賴包是不同的,註冊中心的依賴包是 nacos discovery,而設定中心的依賴包是 nacos config,它的具體如下。

3.1 新建專案並新增依賴

建立一個 Spring Boot 專案,新增 nacos config 和 web 依賴包,如下圖所示:

PS:新增 web 依賴主要是為了方便後面測試。

對應的設定依賴資訊如下:

<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 資訊

在應用的 /src/main/resources/ 目錄下,建立引導組態檔 bootstrap.yml(或 bootstrap.properties),新增以下 Nacos Config 設定:

spring:
  application:
    name: nacosconfig # 專案名稱和 nacos DataId 相匹配
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # nacos 地址和埠
        file-extension: yaml # 獲取組態檔的格式:yaml
        username: nacos # nacos 認證使用者名稱
        password: nacos # nacos 認證密碼
server:
  port: 9001 # 專案啟動埠

3.3 編寫程式碼讀取組態檔

新建控制器,使用 @Value 註解讀取設定資訊,實現程式碼如下:

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 中讀取設定項 config.info
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getconfig")
    public String getConfigInfo(){
        return configInfo;
    }
}

3.4 Nacos 控制檯新增設定資訊

在 Nacos 控制檯建立並設定組態檔,執行步驟如下所示。
首先,在設定列表中點選「新增」按鈕,如下圖所示:

進入設定頁面,新建 YAML 或 Properties 組態檔,如下圖所示:

以上關鍵引數的含義和規則說明如下。

3.4.1 Data ID

Data ID 的拼接格式如下:

${prefix} - ${spring.profiles.active} . ${file-extension}

其中

  • prefix 預設為 spring.application.name 的值,也可以通過設定項 spring.cloud.nacos.config.prefix 來設定。
  • spring.profiles.active 即為當前環境對應的 profile,當 active profile 為空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-extension 為設定內容的資料格式,可以通過設定項 spring.cloud.nacos.config.file-extension 來設定。目前只支援 properties 型別。

3.4.2 Group

Group 分組選項,主要是用來隔離不同的設定專案的,它的預設值為 DEFAULT_GROUP,可以通過 spring.cloud.nacos.config.group 設定。

設定好相應的內容之後,點選底部的「釋出」按鈕即可,新增成功之後會自動返回設定列表,如下圖所示:

經過以上步驟,Nacos 設定中心的功能就實現完了,接下來啟動專案,程式的執行結果如下圖所示:

3.5 動態重新整理功能

動態重新整理功能是指,在 Nacos 設定中心修改了組態檔,在不重啟專案的前提下,可以實時讀取到最新的設定內建。

Nacos 預設會為所有獲取資料成功的 Nacos 的設定項新增了監聽功能,在監聽到伺服器端設定發生變化時會實時觸發 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法。

如果需要對 Bean 進行動態重新整理,需要參照 Spring 和 Spring Cloud 規範,推薦給類新增 @RefreshScope 或 @ConfigurationProperties 註解,就可以實現設定中心的動態重新整理功能了。

4.專案原始碼

https://gitee.com/mydb/spring-cloud-alibaba-example

小結

Nacos 作為 Spring Cloud Alibaba 的核心元件之一,提供了兩個非常重要的功能:註冊中心和設定中心。註冊中心有兩個重要的功能:服務註冊和服務發現,它解決了微服務叢集中,呼叫者和服務提供者連線管理和請求轉發的功能,保證了服務呼叫者能夠穩定的呼叫到健康的服務。而註冊中心的本質是將專案中的本地組態檔雲端化,解決了組態檔的安全性與統一性的問題,並且提供了組態檔歷史版本回滾和組態檔動態重新整理的功能。

參考檔案

Nacos 官方檔案:https://nacos.io/zh-cn/docs/what-is-nacos.html

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java中文社群

Java面試合集:https://gitee.com/mydb/interview