一、結構說明:基于Spring Cloud Alibaba的微服務示例
nacos-spring-cloud-config-example :? ? 服務提供者?
二、技術棧:Spring Boot+Spring Cloud+Spring Cloud Alibaba Nacos + Actuator(可選:監控)
三、使用環境
安裝nacos參考:
Nacos 安裝配置步驟詳解_nacos:2.5.1 mysql-CSDN博客
Nacos 服務注冊與發現參考:Nacos 服務注冊發現案例:nacos-spring-cloud-example 詳解-CSDN博客
- 安裝Nacos服務(nacos-server-2.5.1)
- 確保JDK17環境(根據pom.xml中的配置)
- Maven環境 3.6.3 +
?四、項目結構示例:
五、代碼詳解配置:
(1):nacos-spring-cloud-example----父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.alibaba.nacos</groupId><artifactId>nacos-spring-cloud-example</artifactId><packaging>pom</packaging><version>0.2.0-SNAPSHOT</version><modules><module>nacos-spring-cloud-provider-example</module><module>nacos-spring-cloud-consumer-example</module></modules><properties><spring-boot.version>3.0.2</spring-boot.version><spring-cloud.version>2022.0.0</spring-cloud.version><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencyManagement><dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.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.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.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><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
(2):配置管理 nacos-spring-cloud-config-example?
1、添加依賴: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"><parent><artifactId>nacos-spring-cloud-example</artifactId><groupId>com.alibaba.nacos</groupId><version>0.2.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>nacos-spring-cloud-config-example</artifactId><dependencies><!-- Spring Boot Web 啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Nacos 配置中心依賴 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud 基礎依賴提供了 Spring Cloud 的核心功能包含 @RefreshScope 等注解的支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId></dependency><!-- Spring Boot 配置處理器用于處理 @ConfigurationProperties 注解提供配置屬性的元數據支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- 添加 actuator 監控 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Spring Boot 注解處理器提供 AOP 支持用于實現配置刷新等功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build>
</project>
2、配置application.yml
中配置 Nacos server 的地址:
server:port: 8080spring:application:name: nacos-config-exampleprofiles:active: devconfig:import:- optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 主配置文件 # optional 表示配置可選,找不到也不報錯- optional:nacos:common-db.yaml # 共享配置-數據庫- optional:nacos:common-redis.yaml # 共享配置-Redis- optional:nacos:ext-config-common.yaml # 擴展配置-通用- optional:nacos:ext-config-${spring.profiles.active}.yaml # 擴展配置-環境特定cloud:nacos:config:server-addr: localhost:8848namespace: publicgroup: DEFAULT_GROUPfile-extension: yamlrefresh-enabled: true# actuator 配置:用于監控和管理應用程序
management:endpoints:web:exposure:include: '*' # 開啟所有監控端點endpoint:health:show-details: always # 顯示詳細的健康信息
通過spring:config:import:- optional:nacos:? 后面跟的是dataId是在Nacos配置中心配置將?dataId
?為common-db.yaml共享配置-數據庫
group: DEFAULT_GROUP
的配置作為配置源
3、在 Nacos 控制臺配置:訪問地址http://localhost:8848/nacos? 默認用戶名nacos 密碼nacos
需要在 Nacos 控制臺創建以下配置:
3.1.?主配置文件-dev環境:?nacos-config-example-dev.yaml
填寫好配置:點擊發布即可
3.2.?主配置文件-test環境:?nacos-config-example-test.yaml ,參照上述圖創建如下信息:
# Data ID: nacos-config-example-test.yaml
# Group: DEFAULT_GROUP
# 配置格式選擇 YAML
# 配置內容??
app.config:appName: "Nacos配置管理測試"env: "測試環境"
3.3.?Redis配置文件-通用:?common-redis.yaml
# Data ID: common-redis.yaml
# Group: DEFAULT_GROUP
# 配置格式選擇 YAML
# 配置內容??
common:title: "配置中心測試"version: "1.0.0"
3.4.?數據庫配置文件-通用:?common-db.yaml
# Data ID: common-db.yaml
# Group: DEFAULT_GROUP
# 配置格式選擇 YAML
# 配置內容??
database:url: jdbc:mysql://localhost:3306/test2222username: rootpassword: 123456driverClassName: com.mysql.cj.jdbc.Driver
3.5. 擴展配置文件-通用:?ext-config-common.yaml
# Data ID: ext-config-common.yaml
# Group: DEFAULT_GROUP
# 配置格式選擇 YAML
# 配置內容??
ext.config:timeout: 3000 # 通用超時時間maxRetry: 3 # 通用重試次數appName: "配置中心示例" # 應用名稱
3.6. 擴展配置文件-dev環境:?ext-config-dev.yaml
# Data ID: ext-config-dev.yaml
# Group: DEFAULT_GROUP
# 配置格式選擇 YAML
# 配置內容??
ext.config:env: "開發環境" # 環境標識debug: true # 是否開啟調試logLevel: "DEBUG" # 日志級別
4、編寫屬性類
4.1.數據庫屬性類--DatabaseProperties
package com.alibaba.nacos.example.spring.cloud.config.properties;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;/*** @RefreshScope:* 實現配置的動態刷新* 當配置更新時,使用此注解的類會重新注入新的配置值*/
@Component
@RefreshScope
@ConfigurationProperties(prefix = "database")// 對應配置文件中 database 前綴的配置
public class DatabaseProperties {/*** 數據庫地址 - 來自數據庫配置*/private String url;/*** 數據庫用戶名 - 來自數據庫配置*/private String username;/*** 數據庫密碼 - 來自數據庫配置*/private String password;/*** 數據庫驅動程序類名稱 - 來自數據庫配置*/private String driverClassName;// Getters and Setterspublic String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}
}
4.2.擴展配置屬性類屬性類--ExtConfigProperties
package com.alibaba.nacos.example.spring.cloud.config.properties;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;/*** 擴展配置屬性類* 用于映射 ext.config 前綴的配置項* 包含通用配置和環境特定配置的屬性*/
@Component
@RefreshScope // 支持配置動態刷新
@ConfigurationProperties(prefix = "ext.config") // 對應配置文件中 ext.config 前綴的配置
public class ExtConfigProperties {/*** 應用名稱 - 來自通用配置*/private String appName;/*** 超時時間 - 來自通用配置*/private Integer timeout;/*** 最大重試次數 - 來自通用配置*/private Integer maxRetry;/*** 環境標識 - 來自環境特定配置*/private String env;/*** 是否開啟調試 - 來自環境特定配置*/private Boolean debug;/*** 日志級別 - 來自環境特定配置*/private String logLevel;// Getters and Setterspublic String getAppName() {return appName;}public void setAppName(String appName) {this.appName = appName;}public Integer getTimeout() {return timeout;}public void setTimeout(Integer timeout) {this.timeout = timeout;}public Integer getMaxRetry() {return maxRetry;}public void setMaxRetry(Integer maxRetry) {this.maxRetry = maxRetry;}public String getEnv() {return env;}public void setEnv(String env) {this.env = env;}public Boolean getDebug() {return debug;}public void setDebug(Boolean debug) {this.debug = debug;}public String getLogLevel() {return logLevel;}public void setLogLevel(String logLevel) {this.logLevel = logLevel;}
}
5、配置控制器ConfigController:用于展示各種配置的獲取方式和使用方法
package com.alibaba.nacos.example.spring.cloud.config.controller;import com.alibaba.nacos.example.spring.cloud.config.properties.DatabaseProperties;
import com.alibaba.nacos.example.spring.cloud.config.properties.ExtConfigProperties;
import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** 配置控制器* 用于展示各種配置的獲取方式和使用方法* @RefreshScope:* 實現配置的動態刷新* 當配置更新時,使用此注解的類會重新注入新的配置值* @Value:* 注入配置值* 格式:@Value("${key:defaultValue}")* defaultValue 為配置不存在時的默認值,如果沒有設置默認值:不存在是就是為空*/
@RestController
@RequestMapping("/config")
@RefreshScope // 支持配置動態刷新
public class ConfigController {/*** 使用 @Value 注解直接注入配置項* 來自共享配置文件 nacos-config-example-dev.yaml 或 nacos-config-example-test.yaml 動態配置*/@Value("${ext.config.appName:}")private String appName;@Value("${ext.config.env:}")private String env;/*** 使用 @Value 注解直接注入配置項* 來自共享配置文件 common-redis.yaml*/@Value("${common.title:}")private String commonTitle;@Value("${common.version:}")private String commonVersion;/*** 注入擴展配置屬性類* 通過 @ConfigurationProperties 方式注入的配置*/@Autowiredprivate ExtConfigProperties extConfigProperties;/*** 注入數據庫配置屬性類*/@Autowiredprivate DatabaseProperties databaseProperties;/*** 獲取所有配置信息* 包括:通用Redis配置、環境特定配置、數據庫配置等*/@GetMapping("/get")public Map<String, Object> getConfig() {Map<String, Object> config = new HashMap<>();// 應用配置 nacos-config-example-dev.yaml 或 nacos-config-example-test.yaml 動態配置Map<String, Object> applicationConfig = new HashMap<>();applicationConfig.put("applicationName", appName);applicationConfig.put("environment", env);config.put("application", applicationConfig);// 數據庫配置 common-db.yamlMap<String, String> dbConfig = new HashMap<>();dbConfig.put("url", databaseProperties.getUrl());dbConfig.put("username", databaseProperties.getUsername());dbConfig.put("password", databaseProperties.getPassword());dbConfig.put("driverClassName", databaseProperties.getDriverClassName());config.put("common-db", dbConfig);// 通用配置 common-redis.yamlMap<String, Object> commonConfig = new HashMap<>();commonConfig.put("title", commonTitle);commonConfig.put("version", commonVersion);config.put("common-redis", commonConfig);// 擴展配置ext-config-common.yaml(包含通用和環境特定的配置ext-config-dev.yaml)Map<String, Object> extConfig = new HashMap<>();extConfig.put("appName", extConfigProperties.getAppName());extConfig.put("timeout", extConfigProperties.getTimeout());extConfig.put("maxRetry", extConfigProperties.getMaxRetry());extConfig.put("env", extConfigProperties.getEnv());extConfig.put("debug", extConfigProperties.getDebug());extConfig.put("logLevel", extConfigProperties.getLogLevel());config.put("extConfig", extConfig);return config;}
}
6、測試步驟:
6.1 首先啟動Nacos服務
訪問地址:http://localhost:8848/nacos??
默認用戶名/密碼:nacos/nacos
?配置上述的數據庫,reids等配置
6.2啟動應用程序服務
6.3訪問接口?http://localhost:8080/config/get?
返回數據成功:開始是使用的是dev環境
6.4? 修改配置測試動態刷新
測試1:修改application.yml文件,換成test環境
訪問接口:測試結果:配置成功------調用的是nacos-config-example-test.yaml 中的配置
測試2:在nacos配置管理:動態修改common-redis.yaml配置文件
點擊發布:--->確認發布
在修改一個數據庫配置:common-db.yaml? :修改數據庫名為test111
修改完成后點擊發布
再次訪問接口:測試結果:動態修改成功
六、監控控制:用于展示 Actuator 監控功能
Spring Boot Actuator 是一個用于監控和管理應用程序的強大功能模塊
Actuator 的主要作用
1、健康檢查檢查應用程序的健康狀態監控數據庫連接、磁盤空間等
2、配置信息查看查看當前應用的所有配置信息查看配置的來源和優先級
3、度量指標監控JVM 內存使用線程使用
4、HTTP 請求統計運行時信息查看運行環境系統屬性環境變量
package com.alibaba.nacos.example.spring.cloud.config.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.HealthComponent;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.HashMap;
import java.util.Map;/*** 監控控制器* 用于展示 Actuator 監控功能*/
@RestController
@RequestMapping("/monitor")
public class MonitorController {@Autowiredprivate HealthEndpoint healthEndpoint;/*** 獲取應用健康狀態* 包括:* - 應用狀態* - 磁盤空間* - 數據庫連接* 等系統組件的狀態*/@GetMapping("/health")public HealthComponent health() {return healthEndpoint.health();}/*** 獲取應用基本信息* 包括:* - 應用名稱* - 啟動時間* - JVM 信息* - 系統信息等*/@GetMapping("/info")public Map<String, Object> info() {Map<String, Object> info = new HashMap<>();// 運行時信息Runtime runtime = Runtime.getRuntime();Map<String, Object> jvm = new HashMap<>();jvm.put("totalMemory", runtime.totalMemory());//JVM 當前總內存jvm.put("freeMemory", runtime.freeMemory());//JVM 當前可用內存jvm.put("maxMemory", runtime.maxMemory());//JVM 最大可申請內存jvm.put("availableProcessors", runtime.availableProcessors());//可用CPU核心數// 獲取JVM啟動參數(如 -Xmx 設置的值)RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();jvm.put("inputArguments", runtimeMxBean.getInputArguments());info.put("jvm", jvm);// 系統信息Map<String, String> system = new HashMap<>();system.put("javaVersion", System.getProperty("java.version"));//Java 版本system.put("osName", System.getProperty("os.name"));//操作系統名稱system.put("osArch", System.getProperty("os.arch"));//操作系統架構system.put("osVersion", System.getProperty("os.version"));//操作系統版本info.put("system", system);return info;}
}
接口測試---獲取應用健康狀態??http://localhost:8080/monitor/health
?接口測試---獲取應用基本信息 :http://localhost:8080/monitor/info?
直接訪問接口:查看對應的信息?
# 查看應用健康狀態
http://localhost:8080/actuator/health# 查看所有配置屬性
http://localhost:8080/actuator/configprops# 查看環境信息
http://localhost:8080/actuator/env# 查看所有可用的指標
http://localhost:8080/actuator/metrics# 手動刷新配置
POST
http://localhost:8080/actuator/refresh# 查看 JVM 內存指標
http://localhost:8080/actuator/metrics/jvm.memory.used# 查看 HTTP 請求指標
http://localhost:8080/actuator/metrics/http.server.requests