Nacos 分布式配置中心 Config
4.1 Nacos Config 是什么?
Nacos Config 是分布式配置中心组件。
它解决的问题是:
text
配置散落在各个服务本地
修改配置需要重启服务
多环境配置管理困难
配置无法动态刷新4.2 Nacos Config 依赖
在需要使用配置中心的服务中引入:
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>4.3 配置 DataId
在 Nacos 控制台创建配置:
text
Data ID: order-service-dev.yml
Group: DEFAULT_GROUP
配置格式: YAML配置内容示例:
yaml
demo:
name: order-service
version: 1.0.04.4 Spring Boot 2.4+ 配置导入方式
推荐使用 spring.config.import 方式:
yaml
spring:
application:
name: order-service
profiles:
active: dev
config:
import:
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yml
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
namespace: public
group: DEFAULT_GROUP
file-extension: yml4.5 读取 Nacos 配置
使用 @Value 注解读取配置:
java
package com.demo.order.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${demo.name:default-name}")
private String demoName;
@Value("${demo.version:default-version}")
private String version;
@GetMapping("/info")
public String info() {
return "demo.name=" + demoName + ", demo.version=" + version;
}
}访问:
text
http://localhost:8081/config/info4.6 动态刷新配置
如果希望修改 Nacos 配置后应用自动刷新,可以使用:
java
@RefreshScope示例:
java
package com.demo.order.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
@RefreshScope
@RestController
@RequestMapping("/config")
public class RefreshConfigController {
@Value("${demo.name:default-name}")
private String demoName;
@GetMapping("/refresh")
public String refresh() {
return "demo.name=" + demoName;
}
}修改 Nacos 配置后,再访问接口,通常可以看到最新值。
4.7 使用 ConfigurationProperties
推荐复杂配置使用:
java
package com.demo.order.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
private String name;
private String version;
public String getName() {
return name;
}
public DemoProperties setName(String name) {
this.name = name;
return this;
}
public String getVersion() {
return version;
}
public DemoProperties setVersion(String version) {
this.version = version;
return this;
}
}Controller:
java
package com.demo.order.controller;
import com.demo.order.config.DemoProperties;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/config")
public class PropertiesController {
private final DemoProperties demoProperties;
public PropertiesController(DemoProperties demoProperties) {
this.demoProperties = demoProperties;
}
@GetMapping("/props")
public DemoProperties props() {
return demoProperties;
}
}4.8 shared-configs 共享配置
有些配置多个服务都要用:
text
数据库连接池配置
Redis 配置
日志配置
公共业务开关可以放到共享配置:
yaml
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common-dev.yml
group: DEFAULT_GROUP
refresh: trueNacos 中创建:
text
Data ID: common-dev.yml
Group: DEFAULT_GROUP4.9 extension-configs 扩展配置
可以引入多个额外配置:
yaml
spring:
cloud:
nacos:
config:
extension-configs:
- data-id: redis-dev.yml
group: DEFAULT_GROUP
refresh: true
- data-id: logging-dev.yml
group: DEFAULT_GROUP
refresh: true4.10 配置中心最佳实践
推荐 DataId 命名:
text
服务名-环境.yml示例:
text
order-service-dev.yml
order-service-test.yml
order-service-prod.yml推荐 namespace:
text
dev namespace
test namespace
prod namespace推荐 group:
text
DEFAULT_GROUP或者按业务分组:
text
MALL_GROUP
PAYMENT_GROUP4.11 配置优先级理解
常见配置来源:
text
本地 application.yml
Nacos 默认配置
Nacos profile 配置
共享配置
扩展配置
命令行参数
环境变量实际优先级会受 Spring Boot 外部配置加载顺序影响。
复习时记住核心原则:
text
越具体的配置优先级通常越高。
服务自己的配置通常优先于共享配置。
profile 配置通常优先于默认配置。