SpringCloud微服務實戰——搭建企業級開發框架(十):使用Nacos分散式配置中心

隨著業務的發展、微服務架構的升級,服務的數量、程式的配置日益增多(各種微服務、各種伺服器地址、各種參數),傳統的配置文件方式和資料庫的方式已無法滿足開發人員對配置管理的要求:

  • 安全性:配置跟隨源程式碼保存在程式碼庫中,容易造成配置泄漏。
  • 時效性:修改配置,需要重啟服務才能生效。
  • 局限性:無法支援動態調整:例如日誌開關、功能開關。
    因此,分散式配置中心應運而生!
    使用Nacos之前首先了解一下SpringBoot配置文件bootstrap與application的載入順序:
  • bootstrap.yml(bootstrap.properties)先載入
  • application.yml(application.properties)後載入
  • bootstrap.yml 用於應用程式上下文的引導階段
  • bootstrap.yml 由父Spring ApplicationContext載入
    Nacos的Config默認讀取的是bootstrap.yml配置文件,如果將Nacos Config的配置寫到application.yml裡面,工程啟動時就會一直報錯。

1、在GitEgg-Platform工程的子工程gitegg-platform-cloud中引入spring-cloud-starter-alibaba-nacos-config依賴,重新install GitEgg-Platform工程,然後GitEgg-Cloud項目需要重新在IDEA中執行Reload All Maven Projects。

<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactid>GitEgg-Platform</artifactid>
        <groupid>com.gitegg.platform</groupid>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelversion>4.0.0</modelversion>

    <artifactid>gitegg-platform-cloud</artifactid>
    <name>${project.artifactId}</name>
    <version>${project.parent.version}</version>
    <packaging>jar</packaging>

    <dependencies>
        <!-- Nacos 服務註冊發現-->
        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid>
        </dependency>
        <!-- Nacos 分散式配置-->
        <dependency>
            <groupid>com.alibaba.cloud</groupid>
            <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid>
        </dependency>
    </dependencies>

</project>

2、因為Nacos默認讀取服務配置要寫在 bootstrap.yml 中,所以我們在gitegg-service-system工程下新建 bootstrap.yml文件,同時在 bootstrap.yml 做好Nacos Config的配置

server:
  port: 8001
spring:
  application:
    name: gitegg-service-system
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
        group: DEFAULT_GROUP
        enabled: true

3、在Nacos伺服器上新建gitegg-service-system.yaml配置,將application.yml裡面的配置資訊複製到Nacos伺服器上的配置資訊里,然後刪除application.yml,在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
  • spring.profiles.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profiles.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支援 properties 和 yaml 類型。
    詳細配置資訊可以參考 Spring Boot文檔
    image.png
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1/gitegg_cloud?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
    username: root
    password: root
    initialSize: 1
    minIdle: 3
    maxActive: 20
    # 配置獲取連接等待超時的時間
    maxWait: 60000
    # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一個連接在池中最小生存的時間,單位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打開PSCache,並且指定每個連接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
    filters: config,stat,slf4j
    # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
    # 合併多個DruidDataSource的監控數據
    useGlobalDataSourceStat: true
mybatis-plus:
      mapper-locations: classpath*:/com/gitegg/*/*/mapper/*Mapper.xml
      typeAliasesPackage: com.gitegg.*.*.entity
      global-config:
        #主鍵類型  0:"資料庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";
        id-type: 2
        #欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
        field-strategy: 2
        #駝峰下劃線轉換
        db-column-underline: true
        #刷新mapper 調試神器
        refresh-mapper: true
        #資料庫大寫下劃線轉換
        #capital-mode: true
        #邏輯刪除配置
        logic-delete-value: 1
        logic-not-delete-value: 0
      configuration:
        map-underscore-to-camel-case: true
        cache-enabled: false

4、以上就可以讀取配置文件了,我們在SystemController.java裡面添加讀取配置的測試程式碼,讀取配置的某一個屬性,如果需要讀取實時刷新數據,可以添加@RefreshScope註解

package com.gitegg.service.system.controller;

import com.gitegg.platform.boot.common.base.Result;
import com.gitegg.platform.boot.common.exception.BusinessException;
import com.gitegg.service.system.dto.SystemDTO;
import com.gitegg.service.system.service.ISystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping(value = "system")
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@Api(tags = "gitegg-system")
@RefreshScope
public class SystemController {

    private final ISystemService systemService;

    @Value("${spring.datasource.maxActive}")
    private String nacosMaxActiveType;

    @GetMapping(value = "list")
    @ApiOperation(value = "system list介面")
    public Object list() {
        return systemService.list();
    }


    @GetMapping(value = "page")
    @ApiOperation(value = "system page介面")
    public Object page() {
        return systemService.page();
    }

    @GetMapping(value = "exception")
    @ApiOperation(value = "自定義異常及返回測試介面")
    public Result<string> exception() {
        return Result.data(systemService.exception());
    }

    @PostMapping(value = "valid")
    @ApiOperation(value = "參數校驗測試介面")
    public Result<systemdto> valid(@Valid @RequestBody SystemDTO systemDTO) {
        return Result.data(systemDTO);
    }

    @PostMapping(value = "nacos")
    @ApiOperation(value = "Nacos讀取配置文件測試介面")
    public Result<string> nacos() {
        return Result.data(nacosMaxActiveType);
    }
}

5、啟動項目,打開瀏覽器訪問://127.0.0.1:8001/doc.html,點擊Nacos讀取配置文件測試介面菜單,進行測試,可以查看讀取到的配置資訊,因為添加了@RefreshScope,我們測試實時刷新功能,手動修改Nacos裡面的spring.datasource.maxActive配置,再次執行測試介面,可以看到讀取到的配置資訊已刷新
image.png

本文源碼在//gitee.com/wmz1930/GitEgg的chapter-10分支。