Nacos服務注冊與發現簡介


什么是Nacos

Nacos可以幫助開發者發現、配置和管理微服務。它提供了一組簡單易用的特性集,可以快速實現動態服務發現、服務配置、服務元數據及流量管理。可以幫助開發者更敏捷的構建、交付和管理微服務平台。Nacos是構建以"服務"為中心的現代應用架構(例如微服務范式、雲原生范式)的服務基礎設施。

Nacos相關特性

  • 服務發現和服務健康監測

Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO注冊 Service 后,服務消費者可以使用DNS TODO 或HTTP&API查找和發現服務。

  • 動態配置服務

動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

  • 動態 DNS 服務

動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。

Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 列表.

  • 服務及其元數據管理
    Nacos 能讓您從微服務平台建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命周期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。

基本概念

  • 地域

物理的數據中心,資源創建成功后不能更換。

  • 可用域

同一地域內,電力和網絡互相獨立的物理區域。同一可用區內,實例的網絡延遲較低。

  • 接入點

地域的某個服務的入口域名。

  • 命名空間

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

  • 配置

在系統開發過程中,開發者通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成。配置變更是調整系統運行時的行為的有效手段。

  • 配置管理

系統配置的編輯、存儲、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動。

  • 配置項

一個具體的可配置的參數與其值域,通常以 param-key=param-value 的形式存在。例如我們常配置系統的日志輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。

  • 配置集

一組相關或者不相關的配置項的集合稱為配置集。在系統中,一個配置文件通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了數據源、線程池、日志級別等配置項。

  • 配置集 ID

Nacos 中的某個配置集的 ID。配置集 ID 是組織划分配置的維度之一。Data ID 通常用於組織划分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局唯一性。此命名規則非強制。

  • 配置分組

Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。

  • 配置快照

Nacos 的客戶端 SDK 會在本地生成配置的快照。當客戶端無法連接到 Nacos Server 時,可以使用配置快照顯示系統的整體容災能力。配置快照類似於 Git 中的本地 commit,也類似於緩存,會在適當的時機更新,但是並沒有緩存過期(expiration)的概念。

  • 服務

通過預定義接口網絡訪問的提供給客戶端的軟件功能。

  • 服務名

服務提供的標識,通過該標識可以唯一確定其指代的服務。

  • 服務注冊中心

存儲服務實例和服務負載均衡策略的數據庫。

  • 服務發現

在計算機網絡上,(通常使用服務名)對服務下的實例的地址和元數據進行探測,並以預先定義的接口提供給客戶端進行查詢。

  • 元信息

Nacos數據(如配置和服務)描述信息,如服務版本、權重、容災策略、負載均衡策略、鑒權配置、各種自定義標簽 (label),從作用范圍來看,分為服務級別的元信息、集群的元信息及實例的元信息。

  • 應用

用於標識服務提供方的服務的屬性。

  • 服務分組

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

  • 虛擬集群

同一個服務下的所有服務實例組成一個默認集群, 集群可以被進一步按需求划分,划分的單位可以是虛擬集群。

  • 實例

提供一個或多個服務的具有可訪問網絡地址(IP:Port)的進程。

  • 權重

實例級別的配置。權重為浮點數。權重越大,分配給該實例的流量越大。

  • 健康檢查

以指定方式檢查服務下掛載的實例 (Instance) 的健康度,從而確認該實例 (Instance) 是否能提供服務。根據檢查結果,實例 (Instance) 會被判斷為健康或不健康。對服務發起解析請求時,不健康的實例 (Instance) 不會返回給客戶端。

  • 健康保護閾值

為了防止因過多實例 (Instance) 不健康導致流量全部流向健康實例 (Instance) ,繼而造成流量壓力把健康 健康實例 (Instance) 壓垮並形成雪崩效應,應將健康保護閾值定義為一個 0 到 1 之間的浮點數。當域名健康實例 (Instance) 占總服務實例 (Instance) 的比例小於該值時,無論實例 (Instance) 是否健康,都會將這個實例 (Instance) 返回給客戶端。這樣做雖然損失了一部分流量,但是保證了集群的剩余健康實例 (Instance) 能正常工作。

Nacos的安裝

本文采用Window環境進行演示,環境配置如下:
MAVEN:3.6
JDK:1.8
Nacos-server:1.4.1 Nacos下載地址

  1. 解壓下載好的壓縮包文件
    在這里插入圖片描述

  2. 進入到nacos/bin/目錄下啟動
    startup.cmd -m standalone
    在這里插入圖片描述

    注:進行單機版啟動,如果不添加-m standalone則以集群方式啟動。

  3. 訪問nacos
    在這里插入圖片描述
    注:nacos默認數據存儲在derby數據庫,如果實現集群化,必須使用mysql進行持久化存儲。

  4. 安裝mysql
    跳轉鏈接

  5. 使用conf/nacos-mysql.sql文件初始化數據庫
    在這里插入圖片描述

  6. 修改conf/application.properties文件增加mysql支持
    在這里插入圖片描述

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://192.168.137.128:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=123456
    
  7. 新建命名空間 online
    在這里插入圖片描述

  8. 新建一個配置文件
    在這里插入圖片描述
    對應數據庫信息如下:
    在這里插入圖片描述

與Alibaba Cloud 集成

  1. 創建服務提供者,項目名稱為:server-provider

  2. 在pom文件中增加如下配置:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.9.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <!--阿里巴巴 nacos 服務發現-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
    </dependencies>>
    
  3. 創建bootstrap.yaml文件

    # 端口號
    server:
        port: 10200
    
    spring:
        application:
            name: ${artifactId}  #應用名稱
        cloud:
            nacos:
                discovery:
                    namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47 #命名空間
                    server-addr: 192.168.0.130:8848  #nacos地址
        main:
            allow-bean-definition-overriding: true  #如果有重名的bean,不報錯
        mvc:
            throw-exception-if-no-handler-found: true
    management:
        endpoints:
            web:
                exposure:
                    include: '*'
    

    上述中:

    ## 應用名稱
    spring.application.name=${artifactId}
    ## 命名空間。指定了命名空間,會去該命名空間下注冊和發現服務
    spring.cloud.nacos.discovery.namespace=online
    ## nacos注冊中心地址
    spring.cloud.nacos.discovery.server-addr=192.168.0.130:8848
    
  4. 創建controller,為消費者提供遠程業務接口

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/provider")
    public class ProviderController {
    
        @GetMapping("/getInfo")
        public String getInfo(@RequestParam("info") String info){
    
            return "Provider :" +info ;
        }
    
    }
    
  5. 創建啟動類

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class App {
    
        public static void main(String[] args) {
            SpringApplication.run(App.class);
        }
    }
    

    上述中@EnableDiscoveryClient表示能夠讓注冊中心發現,掃描到該服務。

  6. 創建服務消費者,項目命名為:server-consumer

  7. pom文件與服務提供方相同

  8. 創建bootstrap.yaml

    server:
        port: 10300
    
    spring:
        application:
            name: ${artifactId}
        cloud:
            nacos:
                discovery:
                    namespace: ed82a624-eb8b-49d7-a7d7-4ad2c63d8b47
                    server-addr: 192.168.0.130:8848
        main:
            allow-bean-definition-overriding: true
        mvc:
            throw-exception-if-no-handler-found: true
    management:
        endpoints:
            web:
                exposure:
                    include: '*'
    
  9. 創建controller,實現消費方業務,調用提供方的接口

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    @RequestMapping("/consumer")
    public class ConsumerController {
    
        @Autowired
        private LoadBalancerClient loadBalancerClient ;
        @Autowired
        private RestTemplate restTemplate ;
    
        @GetMapping("/getInfo")
        public String getInfo(@RequestParam("info") String info){
    
            // 通過服務提供者的服務id,獲取對應的服務實例信息
            ServiceInstance serviceInstance =
                    loadBalancerClient.choose("server-provider");
    
            // 遠程接口服務
            String url= serviceInstance.getUri()+"/provider/getInfo?info="+info;
    
            String result = restTemplate.getForObject(url, String.class);
    
            System.out.println("遠程調用結果");
    
            return result ;
        }
    
    }
    
  10. 分別啟動consumer和provider服務,nacos服務管理/服務列表信息如下:
    在這里插入圖片描述

  11. 訪問如下URL
    http://192.168.0.130:10300/consumer/getInfo?info=消費者消費
    得到結果:
    在這里插入圖片描述

Nacos官方文檔

項目地址:spring-cloud-nacos


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM