nacos 微服務配置管理與服務發現


Nacos-配置管理

Nacos有兩種功能,一個是配置管理(配置中心),另一個服務發現

官網:https://nacos.io/zh-cn/docs/sdk.html

快速開始:https://nacos.io/zh-cn/docs/quick-start.html

撐握的知識點

1)能夠說出配置中心的概念以及使用場景

2)了解主流配置中心

3)理解Nacos的功能特性

4)撐握Nacos的快速入門方法

5)撐握Nacos安裝方式

6)理解Nacos配置管理的核心概念及數據模型

7)撐握使用Nacos控制台進行配置管理的操作方法。

8)撐握Nacos分布式系統應用的方法

9)撐握Nacos集群部署方式

1. 什么是配置中心

1.1 什么是配置

應用程序在啟動和運行的時候往往需要讀取一些配置信息,配置基本上伴隨着應用程序的整 個生命周期,比如:數據庫連接參數,啟動參數等。

配置主要有以下幾個特點

  • 配置是獨立於程序的只讀變量

  • 配置伴隨應用的整個生命周期

  • 配置可以有多種加載方式

    常見的有程序內部hard code,配置文件,環境變量,啟動參數,基於數據庫等

  • 配置需要治理

    同一程序在不同的環境(開發、測試、生產),不同的集群(如不同的數據中心)經常需要有不同的配置,所以需要有完善的環境,集群配置管理。

1.2什么是配置中心

在微服務架構中,當系統從一個單體應用,被拆分成分布式系統上一個個服務節點后,配置文件也必須跟着遷移(分割),這樣配置就分散了,不僅如此,分散中還包含着冗余 如下圖:

下圖顯示了配置中心的功能,配置中心將配置從各應用中剝離出來,對配置進行統一管理,應用自身不需要自己去管理配置。

2 Nacos簡介

2.1 什到是Nacos

Nacos是阿里開源的一個項目,用於進行微服務架構的配置管理,以及服務發現,包括服務治理等解決方案

目前市面上用的比較多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf,由於Disconf不再維護,下面主要對比一下Spring Cloud config、Apollo和Nacos

性能最好的的 nacos

2.2 主流配置中心對比

2.3 Nacos 簡介

Nacos是阿里開源的一個項目,用於進行微服務架構的配置管理,以及服務發現,包括服務治理等綜合型解決方案

官網地址:https://nacos.io

官方介紹是這樣的:

nacos致力於幫助您發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您實現動態服務發現、服務配置管理、服務及流量管理。

Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。Nacos是構建以“服務"為中心的現代應用架構的服務基礎設施。

2.4 Nacos特性

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

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

    image-20211025053935676

    Nacos提供對服務的實時的健康檢查,阻止向不健康主機或服務實例發送請求。

    Nacos支持傳輸層(PING或TCP)和應用層(如 HTTP、MySQL、用戶自定義)的健康檢查。

    對於復雜的雲環境和網絡拓撲環境中服務的健康檢查,Nacos提供了agent上報模式和服務端主動檢測2種健康檢查模式。

    Nacos還提供了統一的健康檢查儀表盤,幫助您根據健康狀態管理服務的可用性及流量。

  • 動態配置服務

    動態配置服務可以讓您中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。

    動態配置消除了動態變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。

    配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

    nacos 提供了一個簡潔易用的UI幫助您管理所有的服務和應用的配置。

    nacos還提供包括配置版本跟蹤、金絲雀發布、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您列安全地在生產環境中管理配置變更和降低配置變更帶來的風險。

  • 動態DNS服務

    動態DNS服務支持權重路由,讓您更容易地實現中間層負載均衡,更靈活的路由策略。

    流量控制以及數據中心內網的簡單DNS解析服務。

    動態DNS服務還能讓您更容易地實現以DNS協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現API的風險。

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

  • 服務及元數據管理

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

3 Nacos 快速入門

官網:https://nacos.io/zh-cn/docs/sdk.html

快速開始:https://nacos.io/zh-cn/docs/quick-start.html

3.1安裝Nacos Server

3.1.1 預備環境准備

Nacos 依賴 Java 環境來運行。如果您是從代碼開始構建並運行Nacos,還需要為此配置 Maven環境,請確保是在以下版本環境中安裝使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。

  2. 64 bit JDK 1.8+;下載 & 配置

  3. Maven 3.2.x+;下載 & 配置

3.1.2 下載源碼或者安裝包

你可以通過源碼和發行包兩種方式來獲取 Nacos。

從 Github 上下載源碼方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

下載編譯后壓縮包方式

您可以從 最新穩定版本 下載 nacos-server-$version.zip 包。

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin

下載地址:https://github.com/alibaba/nacos/releases

image-20211025062403102

G:\nacos-server-2.0.3\nacos

3.1.3 啟動服務器


G:\nacos-server-2.0.3\nacos\bin>startup.cmd -m standalone
"nacos is starting with standalone"

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.0.3
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 11924
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://192.168.1.2:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2021-10-24 11:09:52,021 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@30f4b1a6' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-10-24 11:09:59,251 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-10-24 11:10:00,318 INFO Tomcat initialized with port(s): 8848 (http)

2021-10-24 11:10:00,994 INFO Root WebApplicationContext: initialization completed in 21540 ms

2021-10-24 11:10:12,235 INFO Initializing ExecutorService 'applicationTaskExecutor'

2021-10-24 11:10:12,444 INFO Adding welcome page: class path resource [static/index.html]

2021-10-24 11:10:14,193 INFO Creating filter chain: Ant [pattern='/**'], []

2021-10-24 11:10:14,298 INFO Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6c6366cf, org.springframework.security.web.context.SecurityContextPersistenceFilter@f679798, org.springframework.security.web.header.HeaderWriterFilter@19650aa6, org.springframework.security.web.csrf.CsrfFilter@12d1f1d4, org.springframework.security.web.authentication.logout.LogoutFilter@44c13103, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@59d77850, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1daf3b44, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@55a88417, org.springframework.security.web.session.SessionManagementFilter@2d82408, org.springframework.security.web.access.ExceptionTranslationFilter@7a389761]

2021-10-24 11:10:14,967 INFO Initializing ExecutorService 'taskScheduler'

2021-10-24 11:10:14,999 INFO Exposing 16 endpoint(s) beneath base path '/actuator'

2021-10-24 11:10:15,263 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2021-10-24 11:10:15,270 INFO Nacos started successfully in stand alone mode. use embedded storage

2021-10-24 11:10:25,834 INFO Initializing Servlet 'dispatcherServlet'

2021-10-24 11:10:25,850 INFO Completed initialization in 16 ms

登錄:http://127.0.0.1:8848

用戶名:nacos

密碼:nacos

3.1.4 OPEN API 配置管理測試

啟動nacos成功后,可通過nacos提供的http api 驗證nacos服務運行是否正常。

下邊我們通過curl工具來測試nacos的open api:

curl是開發中常用的命令行工具,可以用作Http協議測試。

本教程下載url的windows版本:curl-7.66.0_2-win64-mingw,

下載地址:https://curl.se/windows/

curl 命令執行:G:\javaDevloper\curl-7.79.1-win64-mingw\bin

下載完進入這個目錄:G:\javaDevloper\curl-7.79.1-win64-mingw\bin>

發布配置


G:\javaDevloper\curl-7.79.1-win64-mingw\bin>curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
true
# 發布配置成功了
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>

上邊的命令表示向nacos發布一個配置:

點擊詳情

獲取配置

向nacos發布配置成功,就可以通過客戶端從nacos獲取配置信息,執行下邊的命令

G:\javaDevloper\curl-7.79.1-win64-mingw\bin>curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
HelloWorld
G:\javaDevloper\curl-7.79.1-win64-mingw\bin>

3.1.5 關閉服務器

linux 下 執行

shutdown.sh

windows下執行

cmd shutdown.cmd

或才雙擊 shutdown.cmd運行文件。

3.1.6 外部MySQL數據庫支持。

單機模式時nacos默認使用嵌入式數據庫實現數據的存儲,若想使用外部mysql存儲nacos數據,需要進行以下步驟

  • 安裝數據庫,版本要求:5.6.5+,mysql 8 以下

  • 初始化mysql數據,新建數據庫nacos_config,數據庫初始化文件:${nacoshome}/conf/nacos-mysql.sql

  • 修改${nacoshome}/conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql)添加mysql數據源的url,用戶名和密碼。

# db mysql
spring.datasource.platform=mysql

### Count of DB:
 db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

執行:G:\nacos-server-2.0.3\nacos\conf\nacos-mysql.sql

重新啟動

G:\nacos-server-2.0.3\nacos\bin>startup.cmd -m standalone
"nacos is starting with standalone"

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.0.3
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 16356
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://192.168.1.2:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2021-10-25 17:57:01,389 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@5298dead' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-10-25 17:57:01,400 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-10-25 17:57:03,193 INFO Tomcat initialized with port(s): 8848 (http)

2021-10-25 17:57:04,165 INFO Root WebApplicationContext: initialization completed in 18883 ms

2021-10-25 17:57:15,193 INFO Initializing ExecutorService 'applicationTaskExecutor'

2021-10-25 17:57:15,378 INFO Adding welcome page: class path resource [static/index.html]

2021-10-25 17:57:17,974 INFO Creating filter chain: Ant [pattern='/**'], []

2021-10-25 17:57:18,131 INFO Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@8a2a6a, org.springframework.security.web.context.SecurityContextPersistenceFilter@53ed09e8, org.springframework.security.web.header.HeaderWriterFilter@3ee69ad8, org.springframework.security.web.csrf.CsrfFilter@42714a7, org.springframework.security.web.authentication.logout.LogoutFilter@55a88417, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1daf3b44, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@8f2098e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@772861aa, org.springframework.security.web.session.SessionManagementFilter@1a6cf771, org.springframework.security.web.access.ExceptionTranslationFilter@3ce53f6a]

2021-10-25 17:57:18,981 INFO Initializing ExecutorService 'taskScheduler'

2021-10-25 17:57:19,029 INFO Exposing 16 endpoint(s) beneath base path '/actuator'

2021-10-25 17:57:19,352 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2021-10-25 17:57:19,361 INFO Nacos started successfully in stand alone mode. use external storage

3.2 Nacos 配置入門

3.2.1 發布配置

首先在nacos發布配置。

瀏覽器訪問http://127.0.0.1:8848/nacos,打開nacos控制台,並點擊菜單配置管理->配置列表:

在nacos添加如下配置

Data ID: nacos-simple-demo.yaml
Group:   DEFAULT_GROUP
配置格式:YAML
配置內容:common:
         config1: something
         

Note:注意dataid是以properties(默認的文件擴展名方式)為擴展名,這里是yaml

第一步:點擊新增配置

3.2.2 Nacos客戶端獲取配置

新建一個maven 項目

我們需要新增 一個名為com.yanshi.article的項目

   <groupid>org.example</groupid>
    <artifactid>com.yanshi.article</artifactid>
    <version>1.0-SNAPSHOT</version>

添加group ID 為 com.alibaba.nacos和artifact ID 為 nacos-client 的 starter.用於 實現項目中使用 Nacos來實現應用的外部化配置

引入nacos客戶端依賴

   <dependencies>
       <dependency>
           <groupid>com.alibaba.nacos</groupid>
           <artifactid>nacos-client</artifactid>
           <version>2.0.3</version>
       </dependency>
   </dependencies>

如果運行時出現日志相關錯誤可以在pom.xml中添加如下內容

     <dependency>
           <groupid>org.slf4j</groupid>
           <artifactid>slf4j-api</artifactid>
           <version>1.7.22</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
       <dependency>
           <groupid>org.slf4j</groupid>
           <artifactid>slf4j-log4j12</artifactid>
           <version>1.7.22</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
       <dependency>
           <groupid>org.slf4j</groupid>
           <artifactid>slf4j-simple</artifactid>
           <version>1.7.22</version>
       </dependency>

項目結構

獲取配置內容

package com.yanshi.nacos;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;

/**
 * @author chaoyue
 * @version 1.0
 */
public class SimpleDemoMain {
    public static void main(String[] args) throws NacosException {
        //使用nacos client 遠程獲取nacos服務上的配置信息
        // nacos service 地址
        String serverAddr="127.0.0.1:8848";
        //dataId
        String dataId="nacos-simple-demo.yaml";
        //Group
        String group="DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        //獲取配置,String dataId,String group,long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println("測試");
        //獲取數據源
        System.out.println(content);


    }
}

#測試
common:
   config1: something

發布配置到配置中心,各應用程序通過nacos 提供的API,遠程獲取配置。

4 Nacos配置管理基礎應用

4.1 Nacos配置管理模型

對於Nacos配置管理,通過Namespace、group、Data ID 能夠定位到一個配置集。

配置集(DataId)

在系統中,一個配置文件通常就是一個配置集,一個配置集可以包含系統的各種配置信息,例如,一個配置集可能包含了數據源、線程池,日志級別等配置項。每個配置集都可以定義一個有意義的名稱,就是配置集的ID即DataId.

配置項

key-value格式

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

配置分組(Group)

配置分組是對配置集進行分組,通過一個有意義的字符串(eg. Buy 或 Trade)來表示,不同的配置分組下可以有相同的配置集(Data Id). 當您在Nacos上創建一個配置時,如果未寫配置分組的名稱,則配置分組的名稱默認采用DEFAULT_GROUP.配置分組的常見場景,可用於區分不同的項目或應用,例如,學生管理系統 的配置集可以定義為:STUDENT_GROUP

命名空間

不同環境進行隔離

命令空間(namespace)可用於進行不同環境的配置隔離。例如可以隔離開發環境、測試環境、和生產環境。因為它們的配置可能各不相同,或者隔離不一的用戶,不同開發人員使用同一個nacos管理各自的配置,可通過namespace隔離。不同的命名空間下,可以存在相同名稱的配置分組(group)或配置集。

最佳實踐

nacos抽象定義了Namespace、Group、DataId的概念。

NameSpace:代表不同環境,如開發、測試、生產環境

Group:代表某項目 如 XXX電商項目,XXX金融項目

DataId:每個項目下往往有若干個工程,每個配置集(DataId)是一個工程的主配置文件

獲取某配置集代碼

獲取配置集需要指定:

1、nacos服務地址,必須指定

2、namespace,如不指定默認public

3、group,如不指定默認DEFAULT_GROUP

4、dataId,必須指定

代碼如下

//初始化配置服務
String serverAddr="127.0.0.1:8848";
String namespace="ee247dde-d838-425c-b371-029dab26232f" ;//開發環境,namespace的id
String group="DEFAULT_GROUP";
String dataId="nacos-simple-demo.yaml";
Properties properties=new Properties();
properties.put("serverAddr",serverAddr);
properties.put("namespace",namespace);
ConfigService configService=NacosFactory.createConfigService(properties);
//獲取配置並輸出控制台
String content=configService.getConfig(dataId,group,5000);
System.out.println(content);

以上代碼說明將從地址127.0.0.1:8848 的nacos配置中心獲取配置,通過以下信息定位配置集:

namespace:ee247dde-d838-425c-b371-029dab26232f

group:DEFAULT_GROUP

DataId:nacos-simple-demo.yaml

注意namespace 需要指定id

4.2 命名空間管理

4.2.1 namespace隔離設計

namespace的設計是nacos基於此做多環境以及多(租)用戶(多個用戶共現使用nacos)數據(配置和服務)隔離的。

  • 從一個租戶(用戶)的角度來看,如果有多套不同的環境,那么這個時候可以根據指定的環境來創建不同的namespace,以此來實現多環境的隔離。例如你可以有開發,測試,和生產三個不同的環境,那么使用一套nacos集群可以分別建以下三個不同的namespace。如下圖所示。

  • 從多個租戶(用戶)的角度來看,每個租戶(用戶)可能會有自己的namespace每個租戶(用戶)的配置數據以及注冊的微服務數據都會歸屬自己的namespace下,以此來實現多租戶間的數據隔離。例如超級管理員分配了三個租戶,分別為張三、李四和王五。分配好了之后,各租戶用自己的帳戶名和密碼登錄后,創建自己的命名空間,如下圖所示:

多個用戶使用nacos client,可通過自己租戶下的namespace來初始化,不同租戶下的不同namespace是不可見的。

4.2.2 命名空間管理

創建dev 、test、prod

image-20211026060550436

編寫程序時,沒有寫輸入命名空間這個參數,nacos統一使用一個默認值作為namespace作為輸入, nacos config會使用一個空字符串作為默認的參數來初始化,對應界面上就是public命名空間。

namespace 為public是nacos的一個保留空間,如果您需要創建自己的namespace,不要和public重名

指定的namespace參數一定要寫命名空間ID,而不是名稱。

image-20211026062517813

運行下邊程序測試新建測試環境命名空間

 //使用nacos client 遠程獲取nacos服務上的配置信息
        //namespace
        String namespace="df741c60-8b59-45c5-8cb3-1d4caeafbf5f"; //dev
        // nacos service 地址
        String serverAddr="127.0.0.1:8848";
        //dataId
        String dataId="nacos-simple-demo.yaml";
        //Group
        String group="DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        properties.put("namespace",namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);
        //獲取配置,String dataId,String group,long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println("測試");
        //獲取數據源
        System.out.println(content);

4.2配置管理

4.2.1配置列表

image-20211026064948660

導入

image-20211026065113477

導出

image-20211026065221378

克隆

image-20211026065026535

4.2.2歷史版本

歷史版本可以一鍵回滾。

image-20211026065601817

點擊回滾

image-20211026065720236

4.2.3監聽查詢

nacos提供配置訂閱者即監聽者查詢能力,同時提供客戶端當前配置的MD5校驗值,以便幫助用戶更好的檢查配置變更是否推送到Client端。

能過以下代碼可對某配置進行監聽:

package com.yanshi.nacos;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;

public class SimpleDemoMainListener {

    public static void main(String[] args) throws NacosException {
        //nacos地址
        String serverAddr="127.0.0.1:8848";
        //Group
         String group="DEFAULT_GROUP";
         //namespace
        String namespace="df741c60-8b59-45c5-8cb3-1d4caeafbf5f";
        //dataId
        String dataId="nacos-simple-demo.yaml";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        properties.put("namespace",namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);

        //獲取配置 ,string  dataId, String group,long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        //添加監聽String dataId  String group ,Listener listener
        configService.addListener(dataId, group, new Listener() {
            public Executor getExecutor() {
                return null;
            }

            public void receiveConfigInfo(String s) {
             //當前配置發生變化時,獲取通知。
                System.out.println(s);
            }
        });
        //測試讓主線程不退出,因為訂閱配置是守護線程,主線程退出守護線程就會退出。正式代碼中無需下面代碼
        while (true){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }
}

image-20211026082306283

設置了監聽后,改變了內容,客戶端就會收到值。

image-20211026082459044

客戶端收到值

image-20211026082541490

nacos配置管理,當服務端發生變化時,服務端會把變化傳送給客戶端

4.3 登錄管理

nacos當前版本支持簡單的登錄功能,默認用戶名/密碼為: nacos/nacos.

修改默認用戶名/密碼方法

1.生成加密密碼

在pom.xml中加入

       <!--導入加密包-->
       <dependency>
           <groupid>org.springframework.security</groupid>
           <artifactid>spring-security-core</artifactid>
           <version>5.4.6</version>
       </dependency>

編寫PasswordEncoderUtil類,生成加密后的密碼,采用BCrypt加密方法在每次生成密碼時加隨機鹽,所以生成密碼每次可能不一樣。

public class PasswordEncoderUtil {
    public static void main(String[] args) {
        System.out.println(new BCryptPasswordEncoder().encode("123"));
    }
}

添加一個新用戶,

INSERT INTO `nacos`.`users`(`username`, `password`, `enabled`) VALUES ('chaoyue', '$2a$10$pxpKLSO5eIlACMyj1Fq/tOEO7mKOH.nhjEwztsUf0UKAm4ap59/bS', 1);
INSERT INTO `nacos`.`roles`(`username`, `role`) VALUES ('chaoyue', 'ROLE_ADMIN');

退出nacos

用戶名:chaoyue

密碼:123

4.4 關閉登錄

內部使用 登錄麻煩,現在設置無須登錄。

G:\nacos-server-2.0.3\nacos\conf

application.properties

spring.security.enabled=false
management.security=false
spring.basic.enabled=false
nacos.security.ignore.urls=/**

5 Nacos配置管理應用於分布式系統

5.1 從單體架構到微服務

微服務架構使用Nacos作為配置中心

5.1.1 單體架構

all in one 所有功能模塊使用同一個數據庫,同時,它還提供API或者UI訪問的web模塊等。

image-20211026095218006

盡管也是模塊化邏輯,但是最終它還是會打包並部署為單體應用,這種將所有功能部署在一個web容器中運行的系統就叫做單體架構(也叫巨石應用)。

單體架構有很多好處

開發效率高:模塊之間交互采用本地方法調用,並節省微服務之間的交互討論時間與開發成本。

容易測試:本地就可以啟動完整的系統

容易部署:單個web容器運行

復雜性逐漸變高,可維護性逐漸變差 復雜性越來越高,修改時牽一發動全身

版本迭代速度逐漸變慢:修改一個地方就要將整 個應用全部編譯、部署、啟動時間過長,回歸測試周期過長。

5.1.2微服務

將應用中獨立的業務模塊分出來,建立自己的數據庫與自己的業務邏輯。每一個服務稱為微服務。

image-20211026100710744

每一個業務模塊,使用獨立的服務完成。這種微服務架構模式也影響了應用和數據庫之間的關系,微服務架構每個服務都有自己的數據庫。

微服務架構的好處:

  • 分而治之,職責單一,易於開發、理解和維護、方便團隊拆分和管理
  • 可伸縮:能夠單獨的對指定的服務進行伸縮。
  • 局部容易修改,容易替換,容易部署,有利於持續集成和快速迭代。
  • 不會受限於任何技術棧。

5.2分布式應用配置管理

下圖展示了如何通過Nacos集中管理多個服務的配置

image-20211026101907040

  • 用戶通過Nacos Server 的控制台集中對多個微服務的配置進行管理。

  • 各微服務統一從Nacos Server中獲取各自的配置,並且監聽配置的變化。

nacos server 地址:http://192.168.1.2:8848/nacos

5.2.1 發布配置

首先在nacos發布配置,我們規划了兩個服務service1,service2,並且想對兩個服務的配置進行集中維護。

瀏覽器訪問http://127.0.0.1:8848/nacos,打開nacos控制台,並點擊菜單配置管理->配置列表:在nacos添加如下配置:

service1/nacos-logistics

image-20211026110856071

image-20211026143609788

service2/nacos-users

TEST_GROUP

image-20211026111154749

image-20211026144006532

image-20211026144032749

image-20211026111455046

5.2.2他建父工程

為規范版本先創建父工程,指定依賴的版本

image-20211026112210644

springboot 與springcloud版本對應關系

image-20211026113407264

父工程pom.xml如下:

<!--?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">
    <modelversion>4.0.0</modelversion>

    <groupid>com.yanshi.nacos</groupid>
    <artifactid>nacos-config</artifactid>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>nacos-logistics</module>
        <module>nacos-users</module>
    </modules>
    <properties>
        <project.build.sourceencoding>UTF-8</project.build.sourceencoding>
        <project.reporting.outputencoding>UTF-8</project.reporting.outputencoding>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba-dependencies.version>2.2.6.RELEASE</spring-cloud-alibaba-dependencies.version>
        <spring-cloud-dependencies.version>Hoxton.SR12</spring-cloud-dependencies.version>
        <spring-boot-dependencies.version>2.2.13.RELEASE</spring-boot-dependencies.version>
        <spring-boot-maven-plugin.version>2.4.7</spring-boot-maven-plugin.version>
    </properties>
    <dependencymanagement>
        <dependencies>
           <!--spring-cloud-alibaba-->
            <dependency>
                <groupid>com.alibaba.cloud</groupid>
                <artifactid>spring-cloud-alibaba-dependencies</artifactid>
                <version>${spring-cloud-alibaba-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud-->
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>${spring-cloud-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot-->
            <dependency>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-dependencies</artifactid>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencymanagement>
<!--構建打包工具-->
    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
                <version>${spring-boot-maven-plugin.version}</version>
            </plugin>
        </plugins>
    </build>

</project>

5.2.3 微服務nacos-logistics配置

如何使用** spring cloud Alibaba Nacos Config ** 在 Spring Cloud 應用中集成Nacos ,能過 Spring Cloud 原生方式快捷的獲取配置內容。

Spring cloud 是什么:

spring cloud 是一系列框架的有序集合。它利用Spring Boot 的開發便利性巧妙地簡化了分布式系統基礎設施開發,如服務發現與注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring boot 的開發風格做到一鍵啟動和部署。Spring Cloud 並沒有重復造輪子,它只是將目前各家公司開發的比較成熟經得起實際考驗的服務框架組合起來、集成最多的組件要屬Netflix公司,通過Spring Boot 風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂,易布署和易維護的分布式系統開發工具包。(沒有重復造輪子,集大成者)

Spring Cloud Alibaba Nacos Config 是什么:

Spring Cloud Alibaba Nacos Discovery 是spring Cloud Alibaba的子項目,而Spring Cloud Alibaba 是阿里巴巴公司提供的開源的基於Spring cloud 的微服務套件集合,它致力於提供微服務開發的一站式解決方案。可以Spring cloud 是一套微服務開發的標准,spring cloud alibaba 與spring cloud Netflix 是實現。 使用Spring Cloud Alibaba 方案,開發者只需要添加一些注解和少量配置,就可以將Spring Cloud應用接入阿里分布式應用解決方案,通過阿里中間件來訊速構建分布式應用系統。

由於Nacos是啊里的中間件,因此,若開發springcloud 微服務應用,使用Spring Cloud Alibaba Nacos Config 來集成Nacos的配置管理功能是比較明智的選擇。

**(1) pom.xml **

創建nacos-logistics

image-20211026155925452

pom.xml

 <parent>
        <artifactid>nacos-config</artifactid>
        <groupid>com.yanshi.nacos</groupid>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelversion>4.0.0</modelversion>
    <artifactid>nacos-logistics</artifactid>
    <dependencies>
    <dependency>
        <groupid>com.alibaba.cloud</groupid>
        <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
    </dependency>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
</dependencies>

(2) bootstrap.yml配置

nacos-logistics

由於使用的是外部配置中心,所以需要得命名 bootstrap.yml

server:
  port: 56010  #啟動端口命令行注入


spring:
  application:
    name: nacos-logistics
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址
        file-extension: yaml
        namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 開發環境
        group: TEST_GROUP #測試組

以上配置文件說明應將從地址 127.0.0.1:8848 配置中心獲取配置,通過以下信息定位配置

 namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 開發環境
 group: TEST_GROUP #測試組
 Data Id : nacos-users.yaml

若沒有指定 Group 則默認為DEFAULT_GROUP

(3) 啟動配置客戶端

新增Spring Boot 啟動類,並增加獲取配置的web訪問端點/configs,通過標准的spring @Value方式。

完整的代碼如下

package com.yanshi.logistics;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class LogisticsApplication {
    public static void main(String[] args) {
        SpringApplication.run(LogisticsApplication.class,args);
    }
  //通過value注解讀取配置信息
    @Value("${common.name}")
    private  String configLogistics;

    @GetMapping(value = "/configs")
    public  String getConfigLogistics(){
      //讀取配置信息
        return  configLogistics;
    }
}

image-20211026162155553

5.2.4 微服務nacos-users配置

(1) pom.xml

創建nacos-users

image-20211026154849249

   <parent>
        <artifactid>nacos-config</artifactid>
        <groupid>com.yanshi.nacos</groupid>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelversion>4.0.0</modelversion>
    <artifactid>nacos-users</artifactid>
<dependencies>
    <dependency>
        <groupid>com.alibaba.cloud</groupid>
        <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
    </dependency>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
</dependencies>

bootstrap.yaml

server:
  port: 56011  #啟動端口命令行注入


spring:
  application:
    name: nacos-users
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址
        file-extension: yaml  # dataId 的名稱就是application的name+file-extension即nacos-users.yaml
        namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 開發環境
        group: TEST_GROUP #測試組

以上配置文件說明應將從地址 127.0.0.1:8848 配置中心獲取配置,通過以下信息定位配置

 namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 開發環境
 group: TEST_GROUP #測試組
 Data Id : nacos-users.yaml

若沒有指定 Group 則默認為DEFAULT_GROUP

整過過程請參考 nacos-logistics的配置

package com.yanshi.users;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class UsersApplication {
    public static void main(String[] args) {
        SpringApplication.run(UsersApplication.class,args);
    }
  //通過value注解讀取配置信息
    @Value("${common.name}")
    private  String configUsers;

    @GetMapping(value = "/configs")
    public  String getConfigLogistics(){
        return  configUsers;
    }
}

image-20211026162929641

5.2.5支持配置的動態更新

若要實現動態配置更新,只需進行如下改造:

public class UsersApplication {
    public static void main(String[] args) {
        SpringApplication.run(UsersApplication.class,args);
    }
//    //通過value注解讀取配置信息
//    @Value("${common.name}")
//    private  String configUsers;
    //注入配置文件上下文
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @GetMapping(value = "/configs")
    public  String getConfigLogistics(){
        //讀取配置信息
//        return  configUsers;
        return  applicationContext.getEnvironment().getProperty("common.name");
    }
}

Note 可以通過配置Spring.cloud.nacos.config.refresh.enabled=false來關閉動態或者開啟動態刷新。

5.2.6 自定義namespace與group配置

支持自定義namespace的配置

沒有處定義命令空間,默認使用的是nacos上public這個namespace.如果需要自定義的命名空間,可以通過以下配置來實現:

spring:

  cloud:
    nacos:
      config:
        namespace: df741c60-8b59-45c5-8cb3-1d4caeafbf5f # 開發環境

namespace 的id值 可以在nacos的控制后台獲取。

支持自定義Group配置

在沒有明確指定${spring.cloud.nacos.config.group} 配置情況下,默認用的是DEFAULT_GROUP.如果需要自定義的Group,可以通過以下配置來實現:

spring:

  cloud:
    nacos:
      config:
        group: TEST_GROUP 

5.2.7自定義擴展的DataId配置

spring:
  application:
    name: nacos-logistics
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
# config external configuration
# 1、Data Id  在默認的組DEFAULT_GROUP,不支持配置動態刷新
        ext-config[0]:
              data-id: ext-config-common01.properties
# 2、Data Id  不在默認的組,不支持動態刷新
        ext-config[1]:
             data-id: ext-config-common02.properties
             group:  GLOBALE_GROUP
# 3、Data Id 既不在默認的組,也不支持動態刷新   
        ext-config[2]:
             data-id: ext-config-common03.properties
             group: REFRESH_GROUP
             refresh: true   #動態刷新配置
        
       

ext-config-common01.properties

image-20211026175813302

ext-config-common02.properties

image-20211026181921253

ext-config-common03.properties

image-20211026182318458

驗證功能:

  @GetMapping(value = "/configs2")
    public  String getConfigLogistics2(){
        //讀取配置信息
        //return  configLogistics;
        String name = applicationContext.getEnvironment().getProperty("common.name");
        String age = applicationContext.getEnvironment().getProperty("common.age");
        String address = applicationContext.getEnvironment().getProperty("common.address");
        String birthday = applicationContext.getEnvironment().getProperty("common.birthday");
        String fullName = applicationContext.getEnvironment().getProperty("common.fullname");
        return name+" "+age+" "+address+" "+birthday+" "+fullName;
    }

image-20211026183149681

5.2.6自定義共享DataId配置

spring:
  application:
    name: nacos-logistics
  cloud:
    nacos:
      config:
        shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
        refreshable-dataids: ext-config-common01.properties

共享的只能讀出 DEFAULT_GROUP 組中的內容

image-20211026193012782

5.2.7配置的優先級

第一種:dataId 自動生成:dataId 的名稱就是application的name+file-extension即nacos-logistics.yaml

第二種:自定義擴展的DataId 通過 spring.cloud.nacos.conifg.ext-config[n].data-id 的方式支持多個擴展Data Id 的配置。其中n值 越大優先級越高。

ext-config[0]:
          data-id: ext-config-common01.properties
        ext-config[1]:
          data-id: ext-config-common02.properties
          group: GLOBALE_GROUP
        ext-config[2]:
          data-id: ext-config-common03.properties
          group: REFRESH_GROUP
          refresh: true  #動態刷新配置

第三種:共享的DataId,通過 spring.cloud.nacos.config.shared-dataids DEFAULT_GROUP

shared-dataids: ext-config-common01.properties,ext-config-common02.properties,ext-config-common03.properties
 refreshable-dataids: ext-config-common01.properties

當三種方式同時使用的優先級:第一種>第二種>第三種

image-20211026200935736

service1 config 15 beijing 2020-1-1 lisisiff

image-20211026200824630

service1 config 25 beijing 2020-1-1 lisisiff

5.2.8 完全關閉配置

完全關閉Spring Cloud Nacos Config

spring.cloud.nacos.config.enabled=false
 config:
        enabled: false # 關閉配置

5.3 Nacos集群部署

5.3.1集群部署

3個或3個以上Nacos節點才能構建集群

(1) 安裝3個以上Nacos

我們可以復制之前已經解壓好的nacos文件俠,分別使名為 nacos 、nacos1、nacos2

nacos 下的文件需要修改 G:\nacos-server-2.0.3\nacos01\conf\application.properties,同理 nacos02的也需要修改,改為8850

server.port=8849

(2)配置集群配置文件

在所有nacos目錄的 conf目錄下,有文件cluster.conf.example,將其命名為cluster.conf,並將每行配置成ip:port

三個都需要修改,修改一個然后拷貝過去

127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850

由於是單機演示,為防止端口沖突,所以需要更改 nacos/conf 目錄下application.properties中的server.port 防止端口沖突。

如果有多個ip,也要指定具體的ip地址,如 nacos.inetutils.ip-address=127.0.0.1

application.properties

nacos.inetutils.ip-address=127.0.0.1

(3) 集群模式啟動

分別執行nacos目錄的bin目錄下的startup

G:\nacos-server-2.0.3\nacos\bin>startup -m cluster

第二個窗口

G:\nacos-server-2.0.3\nacos1\bin>startup -m cluster

第三個窗口

G:\nacos-server-2.0.3\nacos2\bin>startup -m cluster

image-20211027095942836

image-20211027100250275

5.3.2客戶端配置

bootstrap.yaml

spring:
  application:
    name: nacos-logistics
  cloud:
    nacos:
      config:
        #enabled: false # 關閉配置
        server-addr: 127.0.0.1:8848,127.0.0.1:8860,127.0.0.1:8850 #配置中心地址

1) 我可以讓8848 下線

image-20211027104352123

2)緊接着重新啟動 Provider 這時馬上請求 consummer的/service 出現錯誤,發現consummer與provier通信已經出現問題。但經過短暫的進間后,通信恢復。

通過以上測試我們可以看到,通過以上的集群部署已經達到了高可用的效果。

5.3.3 生產環境部署建議

客戶端配置的nacos 當nacos集群遷移時,客戶端配置無需修改。

image-20211027105710539

至於數據庫,生產環境建義到少用主從模式,通過修改 ${nachosome}/conf/application.properties能夠使nacos擁有多個數據源

# db mysql
spring.datasource.platform=mysql

### Count of DB:
 db.num=2

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456

6 小結

1、nacos 是啊里開源的一個項目,不光有配置管理還有服務發現。

2、nacos 配置管理功能,主要應用於微服務架構當中的配置中心的構建。配置中心就是對配置文件單獨的對配置文件進行統一管理。

3、nacos具體的使用方法,簡先要清楚nacos配置管理模型(namespace、group、dataId,能定位到一個配置集)

4、namespace 用於隔離配置文件和服務發現 例如可以用 namespace來隔離開發環境、測試環境、生產環境,Group可以對應一個maven工程項目,Dataid 對應每一個工程項目的配置文件。

5、nacos配置管理應用到分布式系統開發中,即微服務架構。采用 spring cloud alibaba nacos 的規范和依賴。我可以很方便的通過 spring boot 或spring cloud 來讀取nacos中的配置信息。

6、配置時我們要發知道nacos的地址,如果是集群的話我們要指定多個地址,指定域名和配置文件,默認的配置文件名是 (應用程序名稱+文件擴展名)這個優先級最高。其次是擴展的配置文件。nacos還可以管理Dubbo服務。


免責聲明!

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



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