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

全棧程式猿發表於2021-10-31

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

  • 安全性:配置跟隨原始碼儲存在程式碼庫中,容易造成配置洩漏。
  • 時效性:修改配置,需要重啟服務才能生效。
  • 侷限性:無法支援動態調整:例如日誌開關、功能開關。
    因此,分散式配置中心應運而生!
    使用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="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>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、啟動專案,開啟瀏覽器訪問:http://127.0.0.1:8001/doc.html,點選Nacos讀取配置檔案測試介面選單,進行測試,可以檢視讀取到的配置資訊,因為新增了@RefreshScope,我們測試實時重新整理功能,手動修改Nacos裡面的spring.datasource.maxActive配置,再次執行測試介面,可以看到讀取到的配置資訊已重新整理
image.png

本文原始碼在https://gitee.com/wmz1930/GitEgg的chapter-10分支。

相關文章