Skip to content

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.0

4.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: yml

4.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/info

4.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: true

Nacos 中创建:

text
Data ID: common-dev.yml
Group: DEFAULT_GROUP

4.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: true

4.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_GROUP

4.11 配置优先级理解

常见配置来源:

text
本地 application.yml
Nacos 默认配置
Nacos profile 配置
共享配置
扩展配置
命令行参数
环境变量

实际优先级会受 Spring Boot 外部配置加载顺序影响。

复习时记住核心原则:

text
越具体的配置优先级通常越高。
服务自己的配置通常优先于共享配置。
profile 配置通常优先于默认配置。

Released under the MIT License.