天天看點

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

1. 概述

 Spring Cloud Alibaba 提供的 Spring Cloud Alibaba Nacos Discovery 元件,基于 Spring Cloud 的程式設計模型,接入 Nacos 作為注冊中心,實作服務的注冊與發現。

服務注冊/發現: Nacos Discovery

服務發現是微服務架構體系中最關鍵的元件之一。如果嘗試着用手動的方式來給每一個用戶端來配置所有服務提供者的服務清單是一件非常困難的事,而且也不利于服務的動态擴縮容。

Nacos Discovery 可以幫助您将服務自動注冊到 Nacos 服務端并且能夠動态感覺和重新整理某個服務執行個體的服務清單。

除此之外,Nacos Discovery 也将服務執行個體自身的一些中繼資料資訊-例如 host,port, 健康檢查URL,首頁等内容注冊到 Nacos。

2. 注冊中心原理

在使用注冊中心時,一共有三種角色:服務提供者(Service Provider)、服務消費者(Service Consumer)、注冊中心(Registry)。

在一些文章中,服務提供者被稱為 Server,服務消費者被稱為 Client。

三個角色互動如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

① Provider:

  • 啟動時,向 Registry 注冊自己為一個服務(Service)的執行個體(Instance)。
  • 同時,定期向 Registry 發送心跳,告訴自己還存活。
  • 關閉時,向 Registry 取消注冊。

② Consumer:

  • 啟動時,向 Registry 訂閱使用到的服務,并緩存服務的執行個體清單在記憶體中。
  • 後續,Consumer 向對應服務的 Provider 發起調用時,從記憶體中的該服務的執行個體清單選擇一個,進行遠端調用。
  • 關閉時,向 Registry 取消訂閱。

③ Registry:

  • Provider 超過一定時間未心跳時,從服務的執行個體清單移除。
  • 服務的執行個體清單發生變化(新增或者移除)時,通知訂閱該服務的 Consumer,進而讓 Consumer 能夠重新整理本地緩存。

當然,不同的注冊中心可能在實作原理上會略有差異。例如說,Eureka 注冊中心,并不提供通知功能,而是 Eureka Client 自己定期輪詢,實作本地緩存的更新。

另外,Provider 和 Consumer 是角色上的定義,一個服務同時即可以是 Provider 也可以作為 Consumer。例如說,優惠劵服務可以給訂單服務提供接口,同時又調用使用者服務提供的接口。

3. 快速入門

本小節,我們來搭建一個 Nacos Discovery 元件的快速入門示例。步驟如下:
  • 首先,搭建一個服務提供者 

    demo-provider

     ,注冊服務到 Nacos 中。
  • 然後,搭建一個服務消費者 

    demo-consumer

    ,從 Nacos 擷取到 

    demo-provider

     服務的執行個體清單,選擇其中一個示例,進行 HTTP 遠端調用。

3.1 搭建服務提供者

建立 

labx-01-sca-nacos-discovery-demo01-provider

 項目,作為服務提供者 

demo-provider

。最終項目代碼如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

3.1.1 引入依賴

在 

pom.xml

 檔案中,主要引入 Spring Cloud Nacos Discovery 相關依賴。代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>labx-01</artifactId>
        <groupId>cn.iocoder.springboot.labs</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>labx-01-sca-nacos-discovery-demo01-provider</artifactId>

    <properties>
        <spring.boot.version>2.2.4.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR1</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <!--
        引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 檔案,進行依賴版本的管理,防止不相容。
        在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 開發團隊推薦了三者的依賴關系
     -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

    <dependencies>
        <!-- 引入 SpringMVC 相關依賴,并實作對其的自動配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 引入 Spring Cloud Alibaba Nacos Discovery 相關依賴,将 Nacos 作為注冊中心,并實作對其的自動配置 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>
      
在 

<dependencyManagement />

 中,我們引入了 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 檔案,進行依賴版本的管理,防止不相容。在《Spring Cloud 官方文檔 —— 版本說明》文檔中,推薦了三者的依賴關系。如下表格:
Spring Cloud Version Spring Cloud Alibaba Version Spring Boot Version
Spring Cloud Greenwich 2.1.1.RELEASE 2.1.X.RELEASE
Spring Cloud Finchley 2.0.1.RELEASE 2.0.X.RELEASE
Spring Cloud Edgware 1.5.1.RELEASE 1.5.X.RELEASE
  • 這裡,我們選擇了 Spring Cloud Alibaba 版本為 

    2.2.0.RELEASE

  • 目前版版本下,我們使用的 Nacos 版本為 

    1.1.4

引入 

spring-cloud-starter-alibaba-nacos-discovery

 依賴,将 Nacos 作為注冊中心,并實作對它的自動配置。

3.1.2 配置檔案

建立 

application.yaml

 配置檔案,添加 Nacos Discovery 配置項。配置如下:

spring:
  application:
    name: demo-provider # Spring 應用名
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址
        service: ${spring.application.name} # 注冊到 Nacos 的服務名。預設值為 ${spring.application.name}。

server:
  port: 18080 # 伺服器端口。預設為 8080
      

重點看 

spring.cloud.nacos.discovery

 配置項,它是 Nacos Discovery 配置項的字首,對應 NacosDiscoveryProperties 配置項。

3.1.3 DemoProviderApplication

建立 DemoProviderApplication 類,建立應用啟動類,并提供 HTTP 接口。代碼如下:

@SpringBootApplication
@EnableDiscoveryClient
public class DemoProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoProviderApplication.class, args);
    }

    @RestController
    static class TestController {

        @GetMapping("/echo")
        public String echo(String name) {
            return "provider:" + name;
        }

    }

}
      

① 

@SpringBootApplication

 注解,被添加在類上,聲明這是一個 Spring Boot 應用。Spring Cloud 是建構在 Spring Boot 之上的,是以需要添加。

② 

@EnableDiscoveryClient

 注解,開啟 Spring Cloud 的注冊發現功能。不過從 Spring Cloud Edgware 版本開始,實際上已經不需要添加 

@EnableDiscoveryClient

 注解,隻需要引入 Spring Cloud 注冊發現元件,就會自動開啟注冊發現的功能。例如說,我們這裡已經引入了 

spring-cloud-starter-alibaba-nacos-discovery

 依賴,就不用再添加 

@EnableDiscoveryClient

 注解了。

拓展小知識:在 Spring Cloud Common 項目中,定義了 DiscoveryClient 接口,作為通用的發現用戶端,提供讀取服務和讀取服務清單的 API 方法。而想要內建到 Spring Cloud 體系的注冊中心的元件,需要提供對應的 DiscoveryClient 實作類。

例如說,Spring Cloud Alibaba Nacos Discovery 提供了 NacosDiscoveryClient 實作,Spring Cloud Netflix Eureka 提供了 EurekaDiscoveryClient 實作。

如此,所有需要使用到的地方,隻需要擷取到 DiscoveryClient 用戶端,而無需關注具體實作,保證其通用性。

③ TestController 類,提供了 

/echo

 接口,傳回 

provider:${name}

 結果。

3.1.4 簡單測試

① 通過 DemoProviderApplication 啟動服務提供者,IDEA 控制台輸出日志如:

// ... 省略其它日志
2020-02-08 15:25:57.406  INFO 27805 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP demo-provider 10.171.1.115:18080 register finished
      
  • 服務 

    demo-provider

     注冊到 Nacos 上的日志。

② 打開 Nacos 控制台,可以在服務清單看到服務 

demo-provider

。如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

3.2 搭建服務消費者

建立 

labx-01-sca-nacos-discovery-demo01-consumer

 項目,作為服務提供者 

demo-consumer

。最終項目代碼如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

整個項目的代碼,和服務提供者是基本一緻的

3.2.1 引入依賴

和「3.1.1 引入依賴」一樣,隻是修改 Maven 

<artifactId />

 為 

labx-01-sca-nacos-discovery-demo01-consumer

,見 

pom.xml

 檔案。

3.2.2 配置檔案

建立 

application.yaml

 配置檔案,添加相應配置項。配置如下:

spring:
  application:
    name: demo-consumer # Spring 應用名
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址

server:
  port: 28080 # 伺服器端口。預設為 8080
      

和「3.1.2 配置檔案」基本一緻,主要是将配置項目 

spring.application.name

 修改為 

demo-consumer

3.2.3 DemoConsumerApplication

建立 DemoConsumerApplication 類,建立應用啟動類,并提供一個調用服務提供者的 HTTP 接口。代碼如下:

@SpringBootApplication
// @EnableDiscoveryClient
public class DemoConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoConsumerApplication.class, args);
    }

    @Configuration
    public class RestTemplateConfiguration {

        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }

    }

    @RestController
    static class TestController {

        @Autowired
        private DiscoveryClient discoveryClient;
        @Autowired
        private RestTemplate restTemplate;
        @Autowired
        private LoadBalancerClient loadBalancerClient;

        @GetMapping("/hello")
        public String hello(String name) {
            // <1> 獲得服務 `demo-provider` 的一個執行個體
            ServiceInstance instance;
            if (true) {
                // 擷取服務 `demo-provider` 對應的執行個體清單
                List<ServiceInstance> instances = discoveryClient.getInstances("demo-provider");
                // 選擇第一個
                instance = instances.size() > 0 ? instances.get(0) : null;
            } else {
                instance = loadBalancerClient.choose("demo-provider");
            }
            // <2> 發起調用
            if (instance == null) {
                throw new IllegalStateException("擷取不到執行個體");
            }
            String targetUrl = instance.getUri() + "/echo?name=" + name;
            String response = restTemplate.getForObject(targetUrl, String.class);
            // 傳回結果
            return "consumer:" + response;
        }

    }

}
      

① 

@EnableDiscoveryClient

 注解,因為已經無需添加,是以我們進行了注釋,原因在上面已經解釋過。

② RestTemplateConfiguration 配置類,建立 RestTemplate Bean。RestTemplate 是 Spring 提供的 HTTP 調用模闆工具類,可以友善我們稍後調用服務提供者的 HTTP API。

③ TestController 提供了 

/hello

 接口,用于調用服務提供者的 

/demo

 接口。代碼略微有幾行,我們來稍微解釋下哈。

discoveryClient

 屬性,DiscoveryClient 對象,服務發現用戶端,上文我們已經介紹過。這裡我們注入的不是 Nacos Discovery 提供的 NacosDiscoveryClient,保證通用性。未來如果我們不使用 Nacos 作為注冊中心,而是使用 Eureka 或則 Zookeeper 時,則無需改動這裡的代碼。

loadBalancerClient

 屬性,LoadBalancerClient 對象,負載均衡用戶端。稍後我們會使用它,從 Nacos 擷取的服務 

demo-provider

 的執行個體清單中,選擇一個進行 HTTP 調用。

拓展小知識:在 Spring Cloud Common 項目中,定義了LoadBalancerClient 接口,作為通用的負載均衡用戶端,提供從指定服務中選擇一個執行個體、對指定服務發起請求等 API 方法。而想要內建到 Spring Cloud 體系的負載均衡的元件,需要提供對應的 LoadBalancerClient 實作類。

例如說,Spring Cloud Netflix Ribbon 提供了 RibbonLoadBalancerClient 實作。

如此,所有需要使用到的地方,隻需要擷取到 DiscoveryClient 用戶端,而無需關注具體實作,保證其通用性。😈 不過貌似 Spring Cloud 體系中,暫時隻有 Ribbon 一個負載均衡元件。

當然,LoadBalancerClient 的服務的執行個體清單,是來自 DiscoveryClient 提供的。

/hello

 接口,示例接口,對服務提供者發起一次 HTTP 調用。

  • <1>

     處,獲得服務 

    demo-provider

     的一個執行個體。這裡我們提供了兩種方式的代碼,分别基于 DiscoveryClient 和 LoadBalancerClient。
  • <2>

     處,通過擷取到的服務執行個體 ServiceInstance 對象,拼接請求的目标 URL,之後使用 RestTemplate 發起 HTTP 調用。

3.2.4 簡單測試

① 通過 DemoConsumerApplication 啟動服務消費者,IDEA 控制台輸出日志如:

// ... 省略其它日志
2020-02-08 18:05:35.810  INFO 35047 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP demo-consumer 10.171.1.115:28080 register finished
      
  • 服務 

    demo-consumer

     注冊到 Nacos 上的日志。

注意,服務消費者和服務提供是一種角色的概念,本質都是一種服務,都是可以注冊自己到注冊中心的。

② 打開 Nacos 控制台,可以在服務清單看到服務 

demo-consumer

。如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

③ 通路服務消費者的 http://127.0.0.1:28080/hello?name=yudaoyuanma 接口,傳回結果為 

"consumer:provider:yudaoyuanma"

。說明,調用遠端的服務提供者成功。

④ 打開 Nacos 控制台,可以在訂閱者清單看到訂閱關系。如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

⑤ 關閉服務提供者後,再次通路 http://127.0.0.1:28080/hello?name=yudaoyuanma 接口,傳回結果為報錯提示 

"擷取不到執行個體"

,說明我們本地緩存的服務 

demo-provider

 的執行個體清單已重新整理,沒有任何執行個體。

😈 這裡我們并沒有示範啟動多個服務提供者的測試,胖友可以自己嘗試下喲。

4. Nacos 概念詳解

友情提示:本小節的内容,基于如下兩篇文檔梳理,推薦胖友後續也看看:
  • 《Nacos 官方文檔 —— 概念》
  • 《Nacos 官方文檔 —— 架構》

4.1 資料模型

Nacos 資料模型 Key 由三元組唯一确認。如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋
  • 作為注冊中心時,Namespace + Group + Service
  • 作為配置中心時,Namespace + Group + DataId

我們來看看 Namespace、Group、Service 的概念。

4.1.1 Namespace 命名空間

用于進行租戶粒度的配置隔離。預設為 public(公共命名空間)。

不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等。

稍後在「6. 多環境配置」小節中,我們會通過 Namespace 隔離不同環境的服務。

4.1.2 Group 服務分組

不同的服務可以歸類到同一分組。預設為 DEFAULT_GROUP(預設分組)。

4.1.3 Service 服務

例如說,使用者服務、訂單服務、商品服務等等。

4.2 服務領域模型

Service 可以進一步細拆服務領域模型,如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

我們來看看圖中的每個“節點”的概念。

4.2.1 Instance 執行個體

提供一個或多個服務的具有可通路網絡位址(IP:Port)的程序。

我們以「3.1 搭建服務提供者」小節來舉例子:

  • 如果我們啟動一個 JVM 程序,就是服務 

    demo-provider

     下的一個執行個體。
  • 如果我們啟動多個 JVM 程序,就是服務 

    demo-provider

     下的多個執行個體。

4.2.2 Cluster 叢集

同一個服務下的所有服務執行個體組成一個預設叢集(Default)。叢集可以被進一步按需求劃分,劃分的機關可以是虛拟叢集。

例如說,我們将服務部署在多個機房之中,每個機房可以建立為一個虛拟叢集。每個服務在注冊到 Nacos 時,設定所在機房的虛拟叢集。這樣,服務在調用其它服務時,可以通過虛拟叢集,優先調用本機房的服務。如此,在提升服務的可用性的同時,保證了性能。

4.2.3 Metadata 中繼資料

Nacos 中繼資料(如配置和服務)描述資訊,如服務版本、權重、容災政策、負載均衡政策、鑒權配置、各種自定義标簽 (label)。

從作用範圍來看,分為服務級别的元資訊、叢集的元資訊及執行個體的元資訊。

FROM 《Dubbo 官方文檔 —— 多版本》

以 Nacos 中繼資料的服務版本舉例子。當一個接口實作,出現不相容更新時,可以用版本号過渡,版本号不同的服務互相間不引用。

可以按照以下的步驟進行版本遷移:

  1. 在低壓力時間段,先更新一半提供者為新版本
  2. 再将所有消費者更新為新版本
  3. 然後将剩下的一半提供者更新為新版本
FROM 《Dubbo 官方文檔 —— 令牌驗證》

再次 Nacos 中繼資料的鑒權配置舉例子。通過令牌驗證在注冊中心控制權限,以決定要不要下發令牌給消費者,可以防止消費者繞過注冊中心通路提供者。另外,通過注冊中心可靈活改變授權方式,而不需修改或更新提供者。

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

4.2.4 Health Check 健康檢查

以指定方式檢查服務下挂載的執行個體的健康度,進而确認該執行個體是否能提供服務。根據檢查結果,執行個體會被判斷為健康或不健康。

對服務發起解析請求時,不健康的執行個體不會傳回給用戶端。

健康保護門檻值

為了防止因過多執行個體不健康導緻流量全部流向健康執行個體,繼而造成流量壓力把健康執行個體執行個體壓垮并形成雪崩效應,應将健康保護門檻值定義為一個 0 到 1 之間的浮點數。

當域名健康執行個體占總服務執行個體的比例小于該值時,無論執行個體是否健康,都會将這個執行個體傳回給用戶端。這樣做雖然損失了一部分流量,但是保證了叢集的剩餘健康執行個體能正常工作。

4.3 小結

為了讓胖友更好了解,我們把資料模型和服務領域模型整理如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

5. 更多的配置項資訊

在「3. 快速入門」小節中,我們為了快速入門,隻使用了 Nacos Discovery Starter 兩個配置項。實際上,Nacos Discovery Starter 提供的配置項挺多的,我們參考文檔将配置項一起梳理下。

Nacos 伺服器相關

配置項 Key 說明
服務端位址

spring.cloud.nacos.discovery.server-addr

Nacos Server 啟動監聽的ip位址和端口
AccessKey

spring.cloud.nacos.discovery.access-key

當要上阿裡雲時,阿裡雲上面的一個雲賬号名
SecretKey

spring.cloud.nacos.discovery.secret-key

當要上阿裡雲時,阿裡雲上面的一個雲賬号密碼

服務相關

配置項 Key 說明
命名空間

spring.cloud.nacos.discovery.namespace

常用場景之一是不同環境的注冊的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等
服務分組

spring.cloud.nacos.discovery.group

不同的服務可以歸類到同一分組。預設為 

DEFAULT_GROUP

服務名

spring.cloud.nacos.discovery.service

注冊的服務名。預設為 

${spring.application.name}

叢集

spring.cloud.nacos.discovery.cluster-name

Nacos 叢集名稱。預設為 

DEFAULT

權重

spring.cloud.nacos.discovery.weight

取值範圍 1 到 100,數值越大,權重越大。預設為 1
Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,使用者可以根據自己的需要自定義一些和服務相關的中繼資料資訊
是否開啟Nacos Watch

spring.cloud.nacos.discovery.watch.enabled

可以設定成 

false

 來關閉 watch。預設為 

true

網絡相關

配置項 Key 說明
網卡名

spring.cloud.nacos.discovery.network-interface

當 IP未配置時,注冊的 IP 為此網卡所對應的 IP 位址,如果此項也未配置,則預設取第一塊網卡的位址
注冊的IP位址

spring.cloud.nacos.discovery.ip

優先級最高
注冊的端口

spring.cloud.nacos.discovery.port

預設情況下不用配置,會自動探測。預設為 

-1

其它相關

配置項 Key 說明
是否內建 Ribbon

ribbon.nacos.enabled

一般都設定成

true

 即可。預設為 

true

日志檔案名

spring.cloud.nacos.discovery.log-name

接入點

spring.cloud.nacos.discovery.endpoint

地域的某個服務的入口域名,通過此域名可以動态地拿到服務端位址

6. 多環境配置

示例代碼對應倉庫:
  • 服務提供者:

    labx-01-sca-nacos-discovery-demo02-provider

  • 服務消費者:

    labx-01-sca-nacos-discovery-demo02-consumer

同一個服務,我們會部署到開發、測試、預釋出、生産等環境中,那麼我們需要在項目中,添加不同環境的 Nacos 配置。一般情況下,開發和測試使用同一個 Nacos,預釋出和生産使用另一個 Nacos。那麼針對相同的 Nacos,我們怎麼實作不同環境的隔離呢?

實際上,Nacos 開發者已經告訴我們如何實作了,通過 Nacos Namespace 命名空間。文檔說明如下:

FROM 《Nacos 文檔 —— Nacos 概念》

命名空間,用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等。

下面,我們來搭建一個多環境配置的示例。步驟如下:

  • 首先,我們會在 Nacos 中建立開發環境使用的 Namespace 為 

    dev

    ,測試環境使用的 Namespace 為 

    uat

  • 然後,搭建一個服務提供者 

    demo-provider

    ,使用開發環境配置,注冊服務到 Nacos 的 

    dev

     Namespace 下。
  • 之後,搭建一個服務消費者 

    demo-consumer

    ,調用服務提供者 

    demo-provider

     提供的 HTTP 接口。
    • 先使用開發環境配置,因為服務 

      demo-provider

       是在 Nacos 

      dev

       Namespace 下注冊,是以調用它成功。
    • 後使用測試環境配置,因為服務 

      demo-provider

       不在 Nacos 

      uat

       Namespace 下注冊,是以調用它失敗,
友情提示:在 Spring Boot(Spring Cloud)項目中,可以使用 Profiles 機制,基于 

spring.profiles.active

 配置項,實作不同環境讀取不同的配置檔案。

6.1 建立 Nacos 命名空間

① 打開 Nacos UI 界面的「命名空間」菜單,進入「命名空間」功能。如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

② 點選清單右上角的「建立命名空間」按鈕,彈出「建立命名空間」視窗,建立一個 

dev

 命名空間。輸入如下内容,并點選「确定」按鈕,完成建立。如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

③ 重複該操作,繼續建立一個 

uat

 命名空間。最終 

dev

 和 

uat

 資訊如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

6.2 搭建服務提供者

從「3.1 搭建服務提供者」小節的 

labx-01-sca-nacos-discovery-demo01-provider

 項目,複制出 

labx-01-sca-nacos-discovery-demo02-provider

 項目。然後在其上進行修改,友善搭建~

6.2.1 配置檔案

修改 

application.yaml

 配置檔案,将 Nacos Discovery 配置項删除,稍後添加在不同環境的配置檔案中。配置如下:

spring:
  application:
    name: demo-provider # Spring 應用名

server:
  port: 18080 # 伺服器端口。預設為 8080
      

建立開發環境使用的 

application-dev.yaml

 配置檔案,增加 Namespace 為 

dev

 的 Nacos Discovery 配置項。配置如下:

spring:
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址
        namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # Nacos 命名空間 dev 的編号
      

建立測試環境使用的 

application-uat.yaml

 配置檔案,增加 Namespace 為 

uat

 的 Nacos Discovery 配置項。配置如下:

spring:
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址
        namespace: bc8c8c2d-bd85-42bb-ada3-1a8f940ceb20 # Nacos 命名空間 uat 的編号
      

6.2.2 簡單測試

下面,我們使用指令行參數進行 

--spring.profiles.active

 配置項,實作不同環境,讀取不同配置檔案。

① 先配置 

--spring.profiles.active

 為 

dev

,設定 DemoProviderApplication 讀取 

application-dev.yaml

 配置檔案。

之後通過 DemoProviderApplication 啟動服務提供者。

② 打開 Nacos 控制台,可以在服務清單看到服務 

demo-provider

 注冊在命名空間 

dev

 下。如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

6.3 搭建服務消費者

從「3.2 搭建服務消費者」小節的 

labx-01-sca-nacos-discovery-demo01-consumer

 項目,複制出 

labx-01-sca-nacos-discovery-demo02-consumer

 項目。然後在其上進行修改,友善搭建~

6.3.1 配置檔案

友情提示:和「6.2.1 配置檔案」小節的内容是基本一緻的,重複唠叨一遍。

修改 

application.yaml

 配置檔案,将 Nacos Discovery 配置項删除,稍後添加在不同環境的配置檔案中。配置如下:

spring:
  application:
    name: demo-consumer # Spring 應用名

server:
  port: 28080 # 伺服器端口。預設為 8080
      

建立開發環境使用的 

application-dev.yaml

 配置檔案,增加 Namespace 為 

dev

 的 Nacos Discovery 配置項。配置如下:

spring:
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址
        namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # Nacos 命名空間 dev 的編号
      

建立測試環境使用的 

application-uat.yaml

 配置檔案,增加 Namespace 為 

uat

 的 Nacos Discovery 配置項。配置如下:

spring:
  cloud:
    nacos:
      # Nacos 作為注冊中心的配置項,對應 NacosDiscoveryProperties 配置類
      discovery:
        server-addr: 127.0.0.1:8848 # Nacos 伺服器位址
        namespace: bc8c8c2d-bd85-42bb-ada3-1a8f940ceb20 # Nacos 命名空間 uat 的編号
      

6.2.3 簡單測試

下面,我們使用指令行參數進行 

--spring.profiles.active

 配置項,實作不同環境,讀取不同配置檔案。

① 先配置 

--spring.profiles.active

 為 

dev

,設定 DemoConsumerApplication 讀取 

application-dev.yaml

 配置檔案。如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

之後通過 DemoConsumerApplication 啟動服務消費者。

通路服務消費者的 http://127.0.0.1:28080/hello?name=yudaoyuanma 接口,傳回結果為 

"consumer:provider:yudaoyuanma"

。說明,調用遠端的服務提供者【成功】。

② 再配置 

--spring.profiles.active

 為 

uat

,設定 DemoConsumerApplication 讀取 

application-uat.yaml

 配置檔案。如下圖所示:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

之後通過 DemoConsumerApplication 啟動服務消費者。

通路服務消費者的 http://127.0.0.1:28080/hello?name=yudaoyuanma 接口,傳回結果為 報錯提示 

"擷取不到執行個體"

。說明,調用遠端的服務提供者【失敗】。

原因是,雖然說服務 

demo-provider

 已經啟動,因為其注冊在 Nacos 的 Namespace 為 

dev

,這就導緻第 ① 步啟動的服務 

demo-consumer

 可以調用到該服務,而第② 步啟動的服務 

demo-consumer

 無法調用到該服務。

即,我們可以通過 Nacos 的 Namespace 實作不同環境下的服務隔離。未來,在開源版本 Nacos 權限完善之後,每個 Namespace 提供不同的 AccessKey、SecretKey,保證隻有知道賬号密碼的服務,才能連到對應的 Namespace,進一步提升安全性。

7. 監控端點

Nacos Discovery 基于 Spring Boot Actuator,提供了自定義監控端點 

nacos-discovery

,擷取 Nacos Discovery 配置項,和訂閱的服務資訊。

同時,Nacos Discovery 拓展了 Spring Boot Actuator 内置的 

health

 端點,通過自定義的 NacosDiscoveryHealthIndicator,擷取和 Nacos 伺服器的連接配接狀态。

友情提示:對 Spring Boot Actuator 不了解的胖友,可以後續閱讀《芋道 Spring Boot 監控端點 Actuator 入門》文章。

下面,我們來搭建一個 Nacos Discovery 監控端點的示例。步驟如下:

  • 首先,搭建一個服務提供者 

    demo-provider

     ,注冊服務到 Nacos 中。
  • 然後,搭建一個服務消費者 

    demo-consumer

    ,調用服務提供者 

    demo-provider

     提供的 HTTP 接口。同時,配置開啟服務消費者的 Nacos Discovery 監控端點。
  • 最後,通路服務消費者的 Nacos Discovery 監控端點,檢視下傳回的監控資料。

7.1 搭建服務提供者

直接複用「3.1 搭建服務提供者」小節的 

labx-01-sca-nacos-discovery-demo01-provider

 項目即可。

因為 

labx-01-sca-nacos-discovery-demo01-provider

 項目沒有從 Nacos 訂閱任何服務,無法完整看到 

nacos-discovery

 端點的完整效果,是以我們暫時不配置該項目的 Nacos Discovery 監控端點。

不過實際項目中,配置下開啟 Nacos Discovery 監控端點 還是可以的,至少可以看到 Nacos Discovery 配置項。

7.2 搭建服務消費者

從「3.2 搭建服務消費者」小節的 

labx-01-sca-nacos-discovery-demo01-consumer

 項目,複制出 

labx-01-sca-nacos-discovery-demo03-consumer

 項目。然後在其上進行修改,友善搭建~

7.2.1 引入依賴

在 

pom.xml

 檔案中,額外引入 Spring Boot Actuator 相關依賴。代碼如下:

<!-- 實作對 Actuator 的自動化配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
      

7.2.2 配置檔案

修改 

application.yaml

 配置檔案,增加 Spring Boot Actuator 配置項。配置如下:

management:
  endpoints:
    web:
      exposure:
        include: '*' # 需要開放的端點。預設值隻打開 health 和 info 兩個端點。通過設定 * ,可以開放所有端點。
  endpoint:
    # Health 端點配置項,對應 HealthProperties 配置類
    health:
      enabled: true # 是否開啟。預設為 true 開啟。
      show-details: ALWAYS # 何時顯示完整的健康資訊。預設為 NEVER 都不展示。可選 WHEN_AUTHORIZED 當經過授權的使用者;可選 ALWAYS 總是展示。
      

7.3 簡單測試

① 通過 DemoProviderApplication 啟動服務提供者,通過 DemoConsumerApplication 啟動服務消費者。

之後,通路服務消費者的 http://127.0.0.1:28080/hello?name=yudaoyuanma 接口,傳回結果為 

"consumer:provider:yudaoyuanma"

。a說明,調用遠端的服務提供者成功。

② 通路服務消費者的 

nacos-discovery

 監控端點 http://127.0.0.1:28080/actuator/nacos-discovery,傳回結果如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

理論來說,

"subscribe"

 字段應該傳回訂閱的服務 

demo-provider

 的資訊,結果這裡傳回的是空。後來翻看了下源碼,是需要主動向 Nacos EventDispatcher 注冊 EventListener 才可以。

③ 通路服務消費者的 

health

 監控端點 http://127.0.0.1:28080/actuator/health,傳回結果如下圖:

Spring Cloud Alibaba Nacos Discovery 元件介紹1. 概述2. 注冊中心原理3. 快速入門4. Nacos 概念詳解5. 更多的配置項資訊6. 多環境配置7. 監控端點666. 彩蛋

666. 彩蛋

至此,我們已經完成 Spring Cloud Alibaba Nacos Discovery 的學習。如下是 Nacos 相關的官方文檔:

  • 《Nacos 官方文檔》
  • 《Spring Cloud Alibaba 官方文檔 —— Nacos Discovery》
  • 《Spring Cloud Alibaba 官方示例 —— Nacos Discovery》

繼續閱讀