SpringCloudAlibaba之配置中心Nacos

1. 前言


Nacos 是阿里巴巴新的開源項目,可以快速實現動態服務發現、服務配置、服務元數據及流量管理。

本篇博客以實現配置中心爲主。

SpringCloud中也有一個同樣優秀的配置中心組件:Spring Cloud Config,以及它對應的高階組件:Spring Cloud Bus,但是它不提供可視化操作界面,這也是我爲什麼要學習 Nacos 的原因之一。

如果你也想了解 Spring Cloud ConfigSpring Cloud Bus,那麼請前往:SpringCloud之配置中心Config(Git 版)SpringCloud之配置中心Config(高可用)SpringCloud之配置中心Config(消息總線)。個人認爲 Nacos 使用起來更加簡單,也來說一說個人理解中兩者的對比,

核心的相同之處:

  1. 引入依賴
  2. 配置註冊中心和配置中心地址
  3. 添加註解

最大的不同之處:

  1. 服務端的搭建方式
  • Eureka Server 是自己手動搭建的;Repository Server 使用遠程庫搭建私有庫
  • Nacos Server 需要通過源碼構建或者直接下載的方式搭建;Repository Server 使用 DerbyMySQL
  1. 獲取配置的方式
  • Spring Cloud Config 還需專門搭建工程來獲取遠程庫的配置信息
  • Nacos Config 不需要搭建額外的工程,內部配置完成後就可以直接獲取配置信息
  1. 通信
  • Spring Cloud Config 想要動態刷新配置功能還需要依賴消息中間件,如 Kafka
  • Nacos Config 不需要額外的消息中間件就可以實現動態刷新配置功能

再來說說 Nacos Server 一些其他的重要信息

部署方式: 三種部署模式,分別對應不同的使用場景

  1. 單機模式:方便本地測試用
  2. 集羣模式:適用於生產環境
  3. 多集羣模式:用於多數據中心

啓動方式: 兩種啓動方式,分別對應上面部署方式中的單機模式集羣模式

  1. Linux / Unix / Mac 系統中單機模式啓動需要添加 -m standalone 參數;反之,如果不加 -m standalone 參數則表示是集羣模式啓動。完整命令:sh startup.sh -m standalone
  2. Windows 系統中目前只支持單機模式啓動,直接雙擊啓動腳本文件。或完整命令:cmd startup.cmd

數據源: 兩種數據源,分別可以在配置文件中指定

  1. Derby:內嵌在應用中的數據庫(目前默認的數據源)
  2. MySQL:免費開源的關係型數據庫(版本需要 5.6.5+)

Nacos Server 的版本選擇: 目前官網推薦的穩定版本爲 1.2.1

Nacos 概念:

  1. 命名空間:用來做不同維度的隔離,比如一個命名空間下是一個單獨模塊(訂單模塊,用戶模塊等),或者一個命名空間下是一組環境(開發,測試,生產等)。
  2. 配置分組:包括一組配置集,也就是多個配置集,可以用來做不同環境的配置隔離。
  3. 配置集:多種不同類型的配置信息的集合稱之爲配置集,比如RedisMySQL等等不同類型的配置信息都寫在了一起,就稱它們爲一個配置集,那麼對應系統中,其實一個配置文件通常就是一個配置集
  4. 配置集 ID:類似於系統中配置文件的文件名,配置集 ID 在同一個配置分組中是唯一的

那麼在這裏,整個劃分就是:使用命名空間區分業務模塊,使用配置分組來區分不同環境。


2. 源碼


GitHub地址:https://github.com/intomylife/SpringCloud


3. 環境


  • JDK 1.8 +
  • Maven 3.2.x +
  • SpringBoot 2.0.6.RELEASE
  • SpringCloud Finchley.SR2
  • SpringCloudAlibaba 2.0.2.RELEASE

4. 開發工具


  • IntelliJ IDEA

5. 正文


5.1 commons 工程

5.1.1 commons 工程 - POM 文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 三座標 -->
    <groupId>com.zwc</groupId>
    <artifactId>config-commons</artifactId>
    <version>1.0.0</version>

    <!-- 工程名稱和描述 -->
    <name>config-commons</name>
    <description>公用工程</description>

    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 在 properties 下聲明相應的版本信息,然後在 dependency 下引用的時候用 ${} 就可以引入該版本 jar 包了 -->
    <properties>
        <!-- 編碼 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- jdk -->
        <java.version>1.8</java.version>

        <!-- SpringBoot -->
        <platform-bom.version>Cairo-SR3</platform-bom.version>
        <!-- SpringCloud -->
        <spring-cloud-dependencies.version>Finchley.SR2</spring-cloud-dependencies.version>
        <!-- SpringCloudAlibaba -->
        <spring-cloud-alibaba-dependencies.version>2.0.2.RELEASE</spring-cloud-alibaba-dependencies.version>
    </properties>

    <!-- 加入依賴 -->
    <dependencies>
        <!-- springboot 起步依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!-- 排除依賴 -->
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- springboot web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 排除依賴 -->
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- log4j2 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>

    <!-- 依賴 jar 包版本管理的管理器 -->
    <!-- 如果 dependencies 裏的 dependency 自己沒有聲明 version 元素,那麼 maven 就此處來找版本聲明。 -->
    <!-- 如果有,就會繼承它;如果沒有就會報錯,告訴你沒有版本信息 -->
    <!-- 優先級:如果 dependencies 裏的 dependency 已經聲明瞭版本信息,就不會生效此處的版本信息了 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringBoot -->
            <dependency>
                <groupId>io.spring.platform</groupId>
                <artifactId>platform-bom</artifactId>
                <version>${platform-bom.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloudAlibaba -->
            <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>
        </dependencies>
    </dependencyManagement>

    <!-- 插件依賴 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 引入一些共用依賴

5.1.2 commons 工程 - 項目結構

springcloudalibaba-nacos-config/config-commons/
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── zwc
        │           └── core
        └── resources
            └── application.properties

5.2 service 工程

此工程下有四個模塊:

應用名稱 端口 描述
config-flyway-service 8082 輔助工程(自動創建數據庫和表)
config-master-service / 配置中心(這裏的配置中心工程其實就是 Nacos 的源碼,放入項目中只是爲了好找到)
config-order-service 10000 訂單服務工程(獲取 Nacos Config 中的配置)
config-user-service 11000 用戶服務工程(獲取 Nacos Config 中的配置)

詳細說明:

config-flyway-service: 前言中介紹了 Nacos Server 的數據源有兩種,這裏使用的是MySQL;而使用MySQL作爲數據源後需要建一些基礎表和插入一些基礎數據,這時就需要手動操作,然而爲了方便,我把這些“枯燥”的操作“簡化”了:啓動一下項目即可。可能唯一需要注意的就是,我本地的MySQL賬號密碼是root, 123456,如果和你的不一致,那麼就在 application.properties 配置文件中更改一下。並且我已經在 Nacos Server 的控制檯中添加了一些本篇博客需要的測試數據,也都導出粘貼到此工程中了。

config-master-service: 此工程中僅僅就複製粘貼了 Nacos Server 的源碼,這裏放入到項目中爲了方便獲取是一方面原因;還有另一方面是因爲,需要在 Nacos Server 的配置文件中指定MySQL爲數據源,以及配置MySQL數據庫的連接信息,然而爲了方便,我已經在 Nacos Server 的源碼中改好了這些配置信息。可能唯一需要注意的就是,我本地的MySQL賬號密碼是root, 123456,如果和你的不一致,那麼就在 nacos-1.2.1/distribution/conf/application.properties 配置文件中的 25,26 行更改一下。nacos-1.2.1/distribution/conf/application.properties 作爲源碼構建後的默認配置文件,所以這裏先在源碼中修改對應的配置信息,從而方便配合在後面使用腳本來快速啓動 Nacos Server 服務。

config-order-service / config-user-service: 都作爲獲取 Nacos Config 中配置的工程,爲什麼需要兩個:① 可以更好的理解命名空間的概念;② 可以更好的理解配置集以及配置集權重的概念


其他補充說明:


5.2.1 config-flyway-service

5.2.1.1 config-flyway-service - POM 文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 繼承父 -->
    <parent>
        <groupId>com.zwc</groupId>
        <artifactId>config-service</artifactId>
        <version>1.0.0</version>
    </parent>

    <!-- 三座標 -->
    <groupId>com.zwc</groupId>
    <artifactId>config-flyway-service</artifactId>
    <version>1.0.0</version>

    <!-- 工程名稱描述 -->
    <name>config-flyway-service</name>
    <description>輔助工程(自動創建數據庫和表)</description>

    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 在 properties 下聲明相應的版本信息,然後在 dependency 下引用的時候用 ${} 就可以引入該版本 jar 包了 -->
    <properties>
        <!-- ali 連接池 -->
        <druid.version>1.1.9</druid.version>
    </properties>

    <!-- 加入依賴 -->
    <dependencies>
        <!-- 數據庫訪問依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mysql 依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- ali 連接池依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- 數據庫版本管理 依賴 -->
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
    </dependencies>

    <!-- 插件依賴 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 此工程的作用和目的就是爲了自動創建數據庫和表,所以引入數據庫flyway相關依賴

5.2.1.2 config-flyway-service - application.properties 配置文件

# 端口
server.port=8082


# 數據源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456


## flyway    注:可以完全不用配置
### sql 腳本的位置,默認爲 classpath:db/migration。可手動指定
#spring.flyway.locations=classpath:db/migration
###  指定數據源,如果沒有指定的話,將使用配置的主數據源
#spring.flyway.url=jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
### Flyway 管理的 Schema 列表,區分大小寫。默認連接對應的默認 Schema
### 如果這裏明確指定了庫名,那麼在 spring.flyway.url 連接中指定的庫名將無效
#spring.flyway.schemas=nacos_config
### 用戶名
#spring.flyway.user=root
### 密碼
#spring.flyway.password=123456
### 開啓,默認開啓
#spring.flyway.enabled=true
  • 配置了連接數據庫的基本信息,如果賬號密碼與你的不一致記得修改一下
  • 由於flyway默認會取數據源的配置信息,所以這裏關於flyway的配置全部註釋,主要爲了如果是使用我的源代碼測試,數據源的信息可以少改一個地方,我的本地MySQL密碼是 123456,大家可能和我不一樣

5.2.1.3 config-flyway-service - 自動創建數據庫

package com.zwc.flyway.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @ClassName InitDatabaseConfig
 * @Desc TODO   自動創建數據庫
 * @Date 2020/6/21 8:38 PM
 * @Version 1.0
 */
@Configuration
public class InitDatabaseConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(InitDatabaseConfig.class);

    /**
     * 讀取配置文件中數據庫的連接信息
     */
    /**
     * 驅動名稱
     */
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    /**
     * 地址
     */
    @Value("${spring.datasource.url}")
    private String url;
    /**
     * 用戶名
     */
    @Value("${spring.datasource.username}")
    private String username;
    /**
     * 密碼
     */
    @Value("${spring.datasource.password}")
    private String password;


    /*
      * @ClassName InitDatabaseConfig
      * @Desc TODO  創建數據庫
      * @Date 2020/6/22 8:58 AM
      * @Version 1.0
     */
    @Bean(name = "dataSource")
    public DataSource dataSource() {
        LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 開始創建數據庫 ====================================");
        // 數據庫連接對象
        Connection connection = null;
        Statement statement = null;
        try {

            // 如果嘗試去連接不存在的數據庫會報錯,所以這裏連接的時候不帶數據庫名稱
            String connectionUrl = url.replace(("/" + (url.substring(0, url.indexOf("?"))).substring(((url.substring(0, url.indexOf("?"))).lastIndexOf("/")) + 1)), "");
            // 從連接地址中截取出數據庫名稱
            String databaseName = (url.substring(0, url.indexOf("?"))).substring(((url.substring(0, url.indexOf("?"))).lastIndexOf("/")) + 1);

            // 設置驅動
            Class.forName(driverClassName);
            // 連接數據庫
            connection = DriverManager.getConnection(connectionUrl, username, password);
            statement = connection.createStatement();

            // 創建數據庫
            statement.executeUpdate("create database if not exists `" + databaseName + "` default character set utf8mb4 COLLATE utf8mb4_general_ci");

        }catch (Exception e) {
            e.printStackTrace();
            LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 創建數據庫出錯:" + e.getMessage() + " ====================================");
        }finally {
            try {
                // 關閉連接
                statement.close();
                connection.close();
            }catch (SQLException e) {
                LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 關閉數據庫出錯:" + e.getMessage() + " ====================================");
            }
            LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 創建數據庫結束 ====================================");
        }

        // 創建數據源
        DruidDataSource druidDataSource = new DruidDataSource();
        // 設置數據源
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        // 返回數據源
        return druidDataSource;
    }

}
  • 使用@Configuration標註自定義配置類,在應用上下文加載時初始化

5.2.1.4 config-flyway-service - 自動新建數據表

由於引入了flyway-core依賴,所以只需要把初始化 sql 放在 flyway 默認會去讀取的db/migration目錄中,就可以了。具體內容可在源碼中查看,就不粘貼出來佔篇幅了。

5.2.1.5 config-flyway-service - 啓動項目

  1. 確認並修改好數據庫的連接信息後,啓動項目;發現項目啓動後就自動停止了,只要不報錯,這裏就是正常的,控制檯會打印如下日誌信息:
2020-07-05 16:36:25.254  INFO 6046 --- [           main] c.zwc.flyway.config.InitDatabaseConfig   : ==================================== InitDatabaseConfig -> dataSource -> 開始創建數據庫 ====================================
2020-07-05 16:36:25.462  INFO 6046 --- [           main] c.zwc.flyway.config.InitDatabaseConfig   : ==================================== InitDatabaseConfig -> dataSource -> 創建數據庫結束 ====================================
  1. 這時到MySQL圖形化連接工具中刷新本地庫,發現多了一個nacos_config數據庫,打開數據庫,可以看到一些基礎表已經被自動創建出來了
  2. 那麼,config-flyway-service 工程的作用就到此結束了

5.2.2 config-master-service

此工程中只有 Nacos Server 的源碼,就沒有太多搭建上的說明,唯一需要注意的就是上面提到過的數據庫連接賬號密碼,如果你的不是root, 123456,那麼就去修改一下。

但是此處需要着重說明的是如何快速構建這個源碼,當然,Nacos 官方文檔中已經寫的很詳細了,這裏就錦上添花一波,把一些命令再“封裝”一下,達到一行命令就能快速啓動 Nacos Server 服務的效果。

這裏分別爲本地快速開發測試以及日常使用兩種不同的場景編寫了腳本,放在了項目的 script 目錄中

springcloudalibaba-nacos-config/
├── config-commons
├── config-service
└── script
    ├── daily-use
    │   ├── nacos-start.sh
    │   └── nacos-stop.sh
    └── quick-start
        ├── nacos-install.bat
        ├── nacos-install.sh
        ├── nacos-start.bat
        ├── nacos-start.sh
        ├── nacos-stop.bat
        └── nacos-stop.sh

5.2.2.1 config-master-service - quick-start 目錄 - 快速開始

  1. 使用IDEA打開 springcloudalibaba-nacos-config 項目
  2. 點擊IDEA底部的Terminal終端入口
  3. 進入到項目根目錄
MacBook-Pro:springcloudalibaba-nacos-config zouwencong$ pwd
/Users/zouwencong/JavaWork/my_spring_cloud/SpringCloud/springcloudalibaba-nacos-config
MacBook-Pro:springcloudalibaba-nacos-config zouwencong$ ls -all
total 24
drwxr-xr-x   7 zouwencong  staff   224 Jul  2 09:34 .
drwxr-xr-x  18 zouwencong  staff   576 Jul  3 13:54 ..
-rw-r--r--@  1 zouwencong  staff  8196 Jul  2 09:54 .DS_Store
drwxr-xr-x  10 zouwencong  staff   320 Jul  5 16:48 .idea
drwxr-xr-x  10 zouwencong  staff   320 Jul  2 10:19 config-commons
drwxr-xr-x  13 zouwencong  staff   416 Jul  5 15:11 config-service
drwxr-xr-x   5 zouwencong  staff   160 Jun 22 17:51 script
MacBook-Pro:springcloudalibaba-nacos-config zouwencong$ 
  1. 如果是Mac用戶,先輸入命令chmod +x script/quick-start/nacos-install.sh,然後再輸入命令./script/quick-start/nacos-install.sh
  2. 如果是Windows用戶,輸入命令script\quick-start\nacos-install.bat
  3. 第一次構建時間會相對久一點,我自己這裏用了大概兩三分鐘的樣子,因爲要到Maven中去下載SpringCloudAlibaba的相關依賴
  4. 如果是Mac用戶,執行完對應命令後會有如下日誌(截取最後關鍵部分):
...省略部分...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 31.655 s
[INFO] Finished at: 2020-07-05T19:41:33+08:00
[INFO] Final Memory: 110M/1630M
[INFO] ------------------------------------------------------------------------
...省略部分...
nacos is starting with standalone
nacos is starting,you can check the /Users/zouwencong/Downloads/SpringCloud-master/springcloudalibaba-nacos-config/config-service/config-master-service/nacos-1.2.1/distribution/target/nacos-server-.2.1/nacos/logs/start.out
[INFO] ----------------------------- end --------------------------------------
  1. 如果是Windows用戶,執行完對應的命令後會有如下日誌(截取最後關鍵部分):
...省略部分...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:09 min
[INFO] Finished at: 2020-07-05T20:02:30+08:00
[INFO] ------------------------------------------------------------------------
...省略部分...
2020-07-05 20:02:38,296 INFO Nacos started successfully in stand alone mode.

2020-07-05 20:02:38,416 INFO Initializing Servlet 'dispatcherServlet'

2020-07-05 20:02:38,425 INFO Completed initialization in 8 ms
  1. 這樣 Nacos Server 就啓動成功了,訪問 Nacos Server 主頁面:http://localhost:8848/nacos
  2. 賬號密碼:nacos, nacos
  3. 這裏對應還有停止的腳本
  4. 如果是Mac用戶,先輸入命令chmod +x script/quick-start/nacos-stop.sh,然後再輸入命令./script/quick-start/nacos-stop.sh
  5. 如果是Windows用戶,發現當前Terminal框並沒有可輸入的地方了,所以這裏想停止的話就先點擊+ (New Session)按鈕,然後再輸入命令script\quick-start\nacos-stop.bat
  6. 那麼如果想再啓動,因爲這裏都構建過了,所以分別使用啓動的腳本
  7. 如果是Mac用戶,先輸入命令chmod +x script/quick-start/nacos-start.sh,然後再輸入命令./script/quick-start/nacos-start.sh
  8. 如果是Windows用戶,輸入命令script\quick-start\nacos-start.bat

5.2.2.2 config-master-service - daily-use 目錄 - 日常使用

我們可能以後項目中經常會用到 Nacos Server 服務,就像RedisMySQL一樣,當做一個服務來啓動,那麼就先把剛剛編譯構建後的目錄(config-master-service/nacos-1.2.1/distribution/target/nacos-server-1.2.1/nacos)複製到本地。由於是作爲日常使用的服務,所以再來設置一下日誌目錄

  1. 打開剛剛複製目錄(config-master-service/nacos-1.2.1/distribution/target/nacos-server-1.2.1/nacos)下的 conf/application.properties 配置文件
  2. Ctrl + F 搜索server.tomcat.basedir
  3. 後面就可以指定存放日誌的目錄路徑

由於Windows中啓動 Nacos Server 不需要指定參數,所以在剛剛複製目錄(config-master-service/nacos-1.2.1/distribution/target/nacos-server-1.2.1/nacos)下的 bin 目錄中的 .bat 腳本可以直接雙擊使用;而Mac中爲了方便,這裏也寫了一個日常使用的腳本,如何使用

  1. 複製 springcloudalibaba-nacos-config 項目中的 script/daily-use/nacos-start.sh 腳本文件和 script/daily-use/nacos-stop.sh 腳本文件到桌面
  2. 賦值執行權限:chmod +x nacos-start.shchmod +x nacos-stop.sh
  3. 右鍵nacos-start.sh文件
  4. 打開方式->其他...
  5. 啓用:選擇所有應用程序
  6. 勾選始終以此方式打開
  7. 點擊實用工具
  8. 雙擊終端
  9. nacos-stop.sh 也同樣設置一遍
  10. 都設置好後,現在只需要雙擊即可啓動停止 Nacos Server 服務
  11. 當然,你具體會把構建後的目錄複製到哪我是不知道的,所以腳本中的具體目錄需要對應的修改一下
  12. nacos-start.sh -> 第 20 行
  13. nacos-stop.sh -> 第 8 行

5.2.2.3 config-master-service - 啓動 Nacos Server

  1. Nacos Server 啓動成功後,訪問 http://localhost:8848/nacos
  2. 賬號密碼:nacos, nacos
  3. 由於在 config-flyway-service 工程中已經把本篇博客需要的測試數據執行了,所以先來看看都有些什麼
  4. 訪問 http://localhost:8848/nacos/#/namespace(命名空間)
  5. 此處就爲每一個服務工程都新建了一個命名空間
  6. 訪問 http://localhost:8848/nacos/#/configurationManagement(配置管理)
  7. 此處就爲每一個服務工程的每一套環境都新建了多個配置集
  8. 點擊詳情按鈕可以查看每一個配置集的具體配置信息

5.2.3 config-order-service

5.2.3.1 config-order-service - POM 文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 繼承父 -->
    <parent>
        <groupId>com.zwc</groupId>
        <artifactId>config-order-service</artifactId>
        <version>1.0.0</version>
    </parent>

    <!-- 三座標 -->
    <groupId>com.zwc</groupId>
    <artifactId>config-order-service-core</artifactId>
    <version>1.0.0</version>

    <!-- 工程名稱描述 -->
    <name>config-order-service-core</name>
    <description>訂單服務工程 - 核心</description>

    <!-- 打包方式 -->
    <packaging>jar</packaging>

    <!-- 在 properties下聲明相應的版本信息,然後在dependency下引用的時候用 ${} 就可以引入該版本jar包了 -->
    <properties>

    </properties>

    <!-- 加入依賴 -->
    <dependencies>
        <!-- commons 工程依賴 -->
        <dependency>
            <groupId>com.zwc</groupId>
            <artifactId>config-commons</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!-- api 工程依賴 -->
        <dependency>
            <groupId>com.zwc</groupId>
            <artifactId>config-order-service-api</artifactId>
            <version>1.0.0</version>
        </dependency>

        <!-- 提供者消費者 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <!-- 插件依賴 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 加入 spring-cloud-starter-alibaba-nacos-discovery 依賴,表示會向 Nacos Server 中註冊自己
  • 加入 spring-cloud-starter-alibaba-nacos-config 依賴,表示會到 Nacos Server 中獲取配置文件

5.2.3.2 config-order-service - bootstrap.yml 配置文件

spring:
  application:
    # 應用名稱
    name: order-config
  cloud:
    nacos:
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 用戶名
        username: nacos
        # 密碼
        password: nacos
        # 命名空間:用來區分不同的服務模塊
        namespace: order-config-namespace
        # 分組:用來區別不同的環境(dev, stg, prd)
        group: dev
        # 配置內容的數據格式:在配置中心以 .yml 結尾的 Data Id(Data Id:配置集,類似於文件名)
        file-extension: yml
        # 擴展配置,加載多配置集:用在把配置文件拆分成多個的場景。
        extension-configs[0]:
          refresh: true
          data-id: redis.yml
          group: stg
        # extension 越往後權重越高
        extension-configs[1]:
          refresh: true
          data-id: mysql.yml
          group: dev
  • Nacos Config 相關的配置文件必須寫在bootstrap.propertiesbootstrap.ym中,因爲這裏需要獲取的是遠程的配置信息,而bootstrap.xxx配置文件是用於應用程序上下文的引導階段
  • 注意此處指定配置中心地址的端口爲 8848 也就是 Nacos Server 的服務端口
  • 注意這裏還配置了 Nacos Server 的用戶名和密碼,那是因爲我在 config-master-service/nacos-1.2.1/distribution/conf/application.properties 配置文件中把 nacos.core.auth.enabled 設置爲了 true,其實默認是 false 關閉的;開啓後這裏必須指定有效的用戶名和密碼,否則會報錯
  • namespace:命名空間,在前言中提到過,會使用命名空間區分業務模塊。如果不指定,那麼默認就是在 public 命名空間下。命名空間 ID 是全局唯一的,可在 Nacos Server 控制檯中添加,當前 Nacos Server 1.2.1 版本中命名空間還可以手動指定
  • group:配置分組,在前言中提到過,會使用配置分組來區分不同環境。如果不指定,那麼默認就是在 DEFAULT_GROUP 組中。相同的組名就可以出現多次,畢竟一組中是可以有多個配置集的,同樣可在 Nacos Server 控制檯中添加
  • file-extension:指定配置集的名稱是以什麼結尾。如果不指定,那麼默認就是找 .properties 結尾的配置集
  • 那麼,有了上面的這些配置信息,當項目啓動後,就會到 Nacos Config 中的 order-config-namespace 命名空間下的 dev 分組下找到以 .yml 結尾的配置集,這些配置集中的配置信息就會被程序獲取
  • 以及這裏還可以指定擴展配置集,爲何還需要擴展配置集,因爲上面只會讀取固定格式的配置集:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
  • 擴展配置集中指定的 extension-configs.group 配置分組權重大於原本的 config.group 配置分組
  • 擴展配置集越往後的權重越高
  • 另一個用戶服務工程(config-user-service) 的配置信息類似於它,當然除了會擁有自己唯一的應用名稱命名空間外,還有一處關鍵點:用戶服務工程(config-user-service) 的擴展配置集的 extension-configs[1].group 指定的是 stg 環境,此處用來體現上面所說的權重

5.2.3.3 config-order-service - application.yml 配置文件

spring:
  # 選擇環境
  profiles:
    ## 動態從 bootstrap.yml 中獲取當前環境
    active: ${spring.cloud.nacos.config.group}
    ## 開發環境
    ## active: dev
    ## 測試環境
    ## active: stg
    ## 生產環境
    ## active: prd

  cloud:
    nacos:
      discovery:
        # 註冊中心地址
        server-addr: 127.0.0.1:8848
        # 用戶名
        username: nacos
        # 密碼
        password: nacos
        # 命名空間:用來區分不同的服務模塊
        namespace: order-config-namespace

---

# 端口
server:
  port: 10000

spring:
  ## 開發環境
  profiles: dev

  ## 單個環境經常改動的配置

---

# 端口
server:
  port: 10000

spring:
  ## 測試環境
  profiles: stg

  ## 單個環境經常改動的配置

---

# 端口
server:
  port: 10000

spring:
  ## 生產環境
  profiles: prd

  ## 單個環境經常改動的配置

---
  • 注意此處配置註冊中心地址的端口爲 8848 也就是 Nacos Server 的服務端口
  • 注意這裏還配置了 Nacos Server 的用戶名和密碼,那是因爲我在 config-master-service/nacos-1.2.1/distribution/conf/application.properties 配置文件中把 nacos.core.auth.enabled 設置爲了 true,其實默認是 false 關閉的;開啓後這裏必須指定有效的用戶名和密碼,否則會報錯
  • 使用 --- 分隔符來分隔多套環境的配置信息
  • 使用 spring.profiles.active 來指定使用哪套環境的配置信息
  • 另一個用戶服務工程(config-user-service) 的配置信息類似於它,當然除了會擁有自己唯一的命名空間外,就是端口不一致了,此處端口爲 10000,另一個端口爲 11000。就不再贅述

5.2.3.4 config-order-service - controller 前端控制器

package com.zwc.order.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName OrderController
 * @Desc TODO   讀取遠程配置信息
 * @Date 2020/7/2 6:14 PM
 * @Version 1.0
 */
@RestController
@RefreshScope
public class OrderController {

    @Value("${order.data.info}")
    String dataInfo;

    @Value("${order.group}")
    String group;

    @Value("${order.ext.name}")
    String extName;

    /*
      * @ClassName OrderController
      * @Desc TODO  讀取遠程配置信息
      * @Date 2020/7/2 6:16 PM
      * @Version 1.0
     */
    @GetMapping(value = "/info")
    public String info() {
        return "dataInfo: " + dataInfo + ", group: " + group + ", extName: " + extName;
    }

}
  • 使用 @Value("${}") 註解讀取配置信息,並輸出
  • 添加了 @RefreshScope 註解表示打開動態刷新功能

5.2.3.5 config-order-service - 啓動類

package com.zwc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigOrderServiceCoreApplication {

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

}
  • 添加 @EnableDiscoveryClient 註解表示此服務要向註冊中心註冊自己

5.2.3.6 config-order-service - 啓動項目

  1. 項目啓動成功後,首先查看控制檯打印的日誌,有部分如下(在最上面一點):
2020-07-05 21:26:00.654  INFO 7493 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='order-config-dev.yml,dev'}, NacosPropertySource {name='order-config.yml,dev'}, NacosPropertySource {name='order-config,dev'}, NacosPropertySource {name='mysql.yml,dev'}, NacosPropertySource {name='redis.yml,stg'}]}
2020-07-05 21:26:00.657  INFO 7493 --- [           main] c.z.ConfigOrderServiceCoreApplication    : The following profiles are active: dev
  1. 可以發現,加載了一些配置集,其中就有 Nacos Server 控制檯中新建的 order-config.yml 配置集,並且還是屬於 dev 配置分組;此外,還加載了指定的擴展配置集
  2. 這時,訪問 http://localhost:10000/info 看到輸出內容dataInfo: order-config-dev.yml, group: dev, extName: mysql-dev
  3. 那麼,對照着 Nacos Server 控制檯中的配置列表中的配置集,以及服務工程中的 bootstrap.yml 配置文件來分析輸出內容,可以得出:在默認的配置集中有的配置信息,權重較高;在有多個擴展的配置集的情況下,越往後寫的擴展配置集權重越高
  4. 現在就把 config-user-service 服務也啓動起來
  5. 項目啓動成功後訪問 http://localhost:11000/info 看到輸出內容dataInfo: user-config-dev.yml, group: stg, extName: mysql-stg
  6. 同樣都是配置的 dev 分組,卻有部分 stg 配置分組中的配置信息,那是因爲,在 config-user-service 服務工程中配置的擴展配置集中,最後指定的是 stg 分組
  7. 再來測試一下動態刷新功能,打開 配置列表頁面,編輯 order-config-namespace 命名空間下的 dev 分組中的 order-config.yml 配置集信息
  8. 點擊編輯按鈕,修改配置內容如下
order:
  data:
    info: order-config-dev666.yml
  1. 依次點擊 發佈 -> 確認發佈 -> 確定 按鈕
  2. 再次訪問 http://localhost:10000/info 看到輸出內容dataInfo: order-config-dev666.yml, group: dev, extName: mysql-dev
  3. 證明動態刷新功能成功

5.3 service 工程 - 項目結構

springcloudalibaba-nacos-config/config-service/
├── config-flyway-service
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── pom.xml
│   └── src
├── config-master-service
│   ├── mvnw
│   ├── mvnw.cmd
│   ├── nacos-1.2.1
│   └── pom.xml
├── config-order-service
│   ├── config-order-service-api
│   ├── config-order-service-core
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── config-user-service
│   ├── config-user-service-api
│   ├── config-user-service-core
│   ├── mvnw
│   ├── mvnw.cmd
│   └── pom.xml
├── mvnw
├── mvnw.cmd
└── pom.xml

6. 把項目使用 IntelliJ IDEA 打開

  1. 把項目從 GitHub 中下載到你的本地
  2. 打開 IntelliJ IDEA
  3. 點擊 File -> Open
  4. 打開你下載到本地的項目目錄
  5. springcloudalibaba-nacos-config(選擇打開此工程)
  6. 如果是高版本的 IntelliJ IDEA,則在右下角會提示有一些工程可以導入,那麼選擇一鍵導入就可以了
  7. 如果是低版本的 IntelliJ IDEA,則手動來導入
  8. 點擊右側 Maven Projects 入口
  9. 點擊 + (Add Maven Projects)
  10. 分別選擇 config-commons 工程和 config-service 工程的 pom.xml 文件,點擊 Open 按鈕


希望能夠幫助到你

over




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章