微服务架构 | nacos - [标准化接入: springboot]

@

§1 依赖

父 pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.7.RELEASE</version>
</parent>

<!-- 加入版本管理 -->
<properties>
    <nacos-version>0.2.7</nacos-version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>${nacos-version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

子 pom

<!-- 实装引入 -->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
</dependency>

§2 基础配置

### 强烈建议:spring 系的项目,都显示的定义 spring.application.name
### 尤其是 spring cloud 项目
spring.application.name=sdbc-nacos-sb
### 重要,必要的配置
### springboot 下缺省或false,会报错【Could not resolve placeholder】
nacos.config.bootstrap.enable=true

### nacos url
nacos.config.server-addr=192.168.32.3:8848
nacos.config.username=nacos
nacos.config.password=nacos

### 必配
### 实测 springboot 下,不适用 ${prefix}-${spring.profiles.active}.${file-extension},这是 springcloud 的风格
### 命名空间、data-id、后缀必须显示的声明,使用 DEFAULT_GROUP 时,group 可以省略
nacos.config.namespace=sdbc
nacos.config.group=DEFAULT_GROUP
nacos.config.data-id=sdbc-nacos-sb.properties
nacos.config.type=properties

配置中缺少命名空间、data-id、后缀时,可能报如下异常

命名空间

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sdbc.nacos.sb.a' in value "${sdbc.nacos.sb.a}"
        at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]

data-id

java.lang.NullPointerException: null
        at com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqNacosConfig(NacosConfigLoader.java:164) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqGlobalNacosConfig(NacosConfigLoader.java:127) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at com.alibaba.boot.nacos.config.util.NacosConfigLoader.loadConfig(NacosConfigLoader.java:67) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer.initialize(NacosConfigApplicationContextInitializer.java:88) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) [spring-boot-2.3.7.RELEASE.jar:2.3.7.RELEASE]

后缀

java.lang.IllegalArgumentException: 'value' must not be null
        at org.springframework.util.Assert.notNull(Assert.java:201) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:123) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.core.env.AbstractPropertyResolver.resolvePlaceholders(AbstractPropertyResolver.java:202) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at org.springframework.core.env.AbstractEnvironment.resolvePlaceholders(AbstractEnvironment.java:566) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
        at com.alibaba.boot.nacos.config.util.NacosConfigLoader.reqGlobalNacosConfig(NacosConfigLoader.java:118) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at com.alibaba.boot.nacos.config.util.NacosConfigLoader.loadConfig(NacosConfigLoader.java:67) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at com.alibaba.boot.nacos.config.autoconfigure.NacosConfigApplicationContextInitializer.initialize(NacosConfigApplicationContextInitializer.java:88) ~[nacos-config-spring-boot-autoconfigure-0.2.7.jar:0.2.7]
        at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) [spring-boot-2.3.7.RELEASE.jar:2.3.7.RELEASE]

§3 静态、动态引用

§3.1 @Value 静态引用

@Value("${sdbc.nacos.sb.a}")
private String a;

§3.2 @NacosValue 动态引用

配置追加 nacos.config.auto-refresh=true

@NacosValue(value = "${sdbc.nacos.sb.b}", autoRefreshed = true)
private String b;

§3.3 @ConfigurationProperties 静态引用

@ConfigurationProperties只是声明了模块化引用,还需要使模块化引用被spring扫描否则是不生效的

声明方式

@ConfigurationProperties(prefix = "sdbc.nacos.sc.l")
public class ModulizedConfig {
    private String x;
    private String y;
}

扫描方式
方式1:直接在声明处增加 @Component
方式2:使用 @Bean 的方式扫描

@Configuration
public class ModulizedActiveConfig {
    @Bean
    public ModulizedConfig modulizedConfig() {
        return new ModulizedConfig();
    }
}

方式3:使用 @EnableConfigurationProperties 扫描

@Configuration
@EnableConfigurationProperties(ModulizedConfig.class)
public class ModulizedActiveConfig {
}

当模块化配置没有被正确的扫描时,会按找不到 bean 报错

***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean of type 'x.ModulizedConfig' that could not be found.

§3.4 @NacosConfigurationProperties 动态引用

配置追加 nacos.config.auto-refresh=true

@NacosConfigurationProperties只是声明了模块化引用,还需要使模块化引用被spring扫描否则是不生效的

声明方式

@NacosConfigurationProperties(dataId = "sdbc-nacos-sb.properties", prefix = "sdbc.nacos.sb.nl",autoRefreshed = true)
public class NacosModulizedConfig {
    private String x;
    private String y;
}

扫描方式
方式1:直接在声明处增加 @Component
方式2:使用 @Bean 的方式扫描

@Configuration
public class NacosModulizedActiveConfig {
    @Bean
    public NacosModulizedConfig nacosModulizedConfig() {
        return new NacosModulizedConfig();
    }
}

§4 多配置文件

data-ids
参考 基本配置,可以将 data-id 替换为 data-ids 以应用多配置文件(推荐,简单易懂)

nacos.config.namespace=sdbc
nacos.config.group=DEFAULT_GROUP
#nacos.config.data-id=sdbc-nacos-sb.properties
nacos.config.data-ids=sdbc-nacos-sb.properties,sdbc-nacos-sb-biz.properties,sdbc-nacos-sb-white.properties
nacos.config.type=properties

ext-config
如果需要引入不同的组,甚至命名空间不同,则需要引入 ext-config 配置

nacos.config.ext-config[0].data-id=sdbc-nacos-sb-xxl.properties
nacos.config.ext-config[0].group=JOB
nacos.config.ext-config[0].auto-refresh=true
nacos.config.ext-config[0].type=properties

需要注意

  • nacos.config.data-id 优先级更高,nacos.config.data-ids 会被 nacos.config.data-id 短路
    即如果同时配置了二者,则后者不生效导致报错,如 Could not resolve placeholder 'muti.place.a' in value "${muti.place.a}"
  • 必须配全了 nacos.config 后,才能配置 nacos.config.ext-config
    springboot 中,nacos.config 下配置都会加载进 NacosConfigProperties 对象,并在启动过程中强制检查参数
    因此,不配置nacos.config.namespace/group/data-id/type
    而是直接使用 ext-config,会启动失败报错,如 java.lang.IllegalArgumentException: 'value' must not be null
posted @ 2025-05-21 11:08  问仙长何方蓬莱  阅读(61)  评论(0)    收藏  举报