当前位置: 代码网 > it编程>编程语言>Java > SpringCloud alibaba使用Nacos配置中心解读

SpringCloud alibaba使用Nacos配置中心解读

2026年01月17日 Java 我要评论
依赖管理spring cloud alibaba bom 包含了它所使用的所有依赖的版本请将下面的 bom 添加到 pom.xml 中的 部分。 这将允许我们省略任何maven依赖项的版本,而是将版本

依赖管理

spring cloud alibaba bom 包含了它所使用的所有依赖的版本

请将下面的 bom 添加到 pom.xml 中的 部分。 这将允许我们省略任何maven依赖项的版本,而是将版本控制委派给bom。

<dependencymanagement>
    <dependencies>
        <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>

引用时,请注意版本对应关系。比如我们的示例版本为:2021.0.4.0。其与spring boot以及spring cloud的版本对应关系如下(为避免不必要的依赖冲突,请按照如下版本对应关系验证本文示例)

spring cloud alibaba versionspring cloud versionspring boot version
2021.0.4.0*spring cloud 2021.0.42.6.11

目前最新版本是2022.x,支持spring boot 3.0,我们知道spring boot 3.0.x需要使用java 17,针对国内大多数应用来说,目前还是java8,所以本文还是选用java8支持的版本。

更多的版本对应关系请参考官网:spring cloud alibaba maven依赖版本对应关系

完整pom依赖配置

一个完整的spring cloud alibaba的pom.xml依赖如下

dependencies标签中的依赖根据自己实际情况引入即可。此处只是nacos的使用示例

<?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>org.example</groupid>
    <artifactid>clouddemo</artifactid>
    <version>1.0-snapshot</version>

    <properties>
        <build.name>clouddemo</build.name>
        <project.build.sourceencoding>utf-8</project.build.sourceencoding>
        <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
        <java.version>1.8</java.version>

        <spring.cloud.version>2021.0.4</spring.cloud.version>
        <spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
    </properties>

    <parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>2.6.11</version>
    </parent>

    <dependencymanagement>
        <dependencies>
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

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

        <!-- 支持读取bootstrap配置 -->
        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-bootstrap</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <scope>test</scope>
        </dependency>
        <!-- 添加web依赖 -->
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
        </dependency>

    </dependencies>
</project>

添加bootstrap.properties配置

# 引用pom文件中配置的profile(注意名称的对应)
spring.profiles.active=@profileactive@
# 应用名称
spring.application.name=mycloud
# nacos配置
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置的group(默认default_group)
spring.cloud.nacos.config.group=default_group
# 配置后缀默认是properties(只支持properties和ymal)
spring.cloud.nacos.config.file-extension=properties
# 是否开启自动刷新配置(默认true)
spring.cloud.nacos.config.refresh-enabled=true

注意当你使用域名的方式来访问 nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。

例如 nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。

在 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 类型。

注:nacos config相关的配置必须放在 bootstrap.properties 配置文件中,放在application.properties中自动刷新配置不会生效。

一般情况下,我们的应用,应该需要配置profile,而且要应用spring boot和maven的profile组合配置。所以,我们的pom文件丰富一下

<?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>org.example</groupid>
    <artifactid>clouddemo</artifactid>
    <version>1.0-snapshot</version>

    <properties>
        <build.name>clouddemo</build.name>
        <project.build.sourceencoding>utf-8</project.build.sourceencoding>
        <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
        <java.version>1.8</java.version>

        <spring.cloud.version>2021.0.4</spring.cloud.version>
        <spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
    </properties>

    <parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>2.6.11</version>
    </parent>

    <dependencymanagement>
        <dependencies>
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

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

        <!-- 支持读取bootstrap配置 -->
        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-bootstrap</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <scope>test</scope>
        </dependency>
        <!-- 添加web依赖 -->
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
        </dependency>

    </dependencies>


    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profileactive>dev</profileactive>
            </properties>
            <activation>
                <activebydefault>true</activebydefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profileactive>test</profileactive>
            </properties>
        </profile>
        <profile>
            <id>pre</id>
            <properties>
                <profileactive>pre</profileactive>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profileactive>prod</profileactive>
            </properties>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
            </plugin>
        </plugins>

        <finalname>${build.name}</finalname>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>mapper/**/*.xml</include>
                    <include>application.properties</include>
                    <include>application-${profileactive}.properties</include>
                    <include>bootstrap.properties</include>
                    <include>logback-spring.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

application.properties配置

# 当前应用的访问端口
server.port=8701
# 当前应用的访问上下文
server.servlet.context-path=/mycloud

编写启动类

package com.yyoo.cloud;

import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;

@springbootapplication(scanbasepackages = {"com.yyoo"})
public class application {

    public static void main(string[] args) {
        springapplication.run(application.class, args);
    }

}

本示例的启动类和普通的spring boot项目启动类没什么两样.

编写测试controller

package com.yyoo.cloud.controller;

import org.springframework.beans.factory.annotation.value;
import org.springframework.cloud.context.config.annotation.refreshscope;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

@restcontroller
@requestmapping("conf")
@refreshscope
public class testconfcontroller {

    @value("${name:默认值}")
    private string name;

    @requestmapping("getname")
    public string getname(){
        system.out.println(this.name);
        return this.name;
    }

}

@refreshscope是spring cloud 的原生注解,用于实现配置自动更新。

在nacos界面上添加对应的配置

启动应用并访问

启动后访问 http://localhost:8701/mycloud/conf/getname

界面显示结果:没事儿写两篇

在界面修改配置 name=没事儿写两篇2 ,再次访问链接

界面显示结果:没事儿写两篇2

自定义扩展的 data id 配置

我们上面的示例,配置的dataid是通过特定的规则来自动匹配的,这样很方便,但是也限制的很死。我们的同样的应用部署在不同的服务器,可能只是些许配置不一样,怎样能共用一样的配置呢?上面的方式显然是不行的。

spring cloud alibaba nacos config 从 0.2.1 版本后,可支持自定义 data id 的配置。

使用spring.cloud.nacos.config.extension-configs配置

# 自定义扩展dataid ,extension-configs是个列表,意味着可以配置多个
# 必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。
# 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 data id 文件扩展名没有影响。
spring.cloud.nacos.config.extension-configs[0].data-id=mycloud-common1.yml
# 配置的group,默认default_group
spring.cloud.nacos.config.extension-configs[0].group=common_group
# 是否自动刷新(注意:这里默认是false,如果需要自动刷新,必须配置为true)
spring.cloud.nacos.config.extension-configs[0].refresh=true

注意以上配置也是在bootstrap.properties中配置

在nacos中新增配置

使用configurationproperties来接收

package com.yyoo.cloud.conf;

import lombok.data;
import org.springframework.boot.context.properties.configurationproperties;
import org.springframework.context.annotation.configuration;

@data
@configuration
@configurationproperties("my.mycloud")
public class commonconf {

    private string name;

    private int age;

    private string desc;

}

我们这里没有添加@refreshscope注解,因为我们使用spring.cloud.nacos.config.extension-configs[0].refresh=true配置了,所以配置是会自动刷新的。

testcontroller读取配置

    @resource
    private commonconf conf;
    
    @requestmapping("getcommonconf")
    public string getcommonconf() throws jsonprocessingexception {
        system.out.println(conf);
        return this.conf.tostring();
    }

访问链接后输出结果:commonconf(name=没事儿写两篇, age=12, desc=spring cloud 学习)

注意:testcontroller中的commonconf 是被代理之后的对象,包含很多内容,建议不要用json进行转换打印。

spring.cloud.nacos.config.shared-configs配置

spring.cloud.nacos.config.shared-configs[0].data-id=mycloud-common1.yml
spring.cloud.nacos.config.shared-configs[0].group=common_group
spring.cloud.nacos.config.shared-configs[0].refresh=true

其用法和extension-configs一样。其主要作用是为了更加清晰的在多个应用间配置共享的 data id。

各种配置方式的优先级

  • a: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 data id 的配置
  • b: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 data id 的配置
  • c: 通过内部相关规则(应用名、应用名+ profile )自动生成相关的 data id 配置

当三种方式共同使用时,他们的一个优先级关系是:a < b < c

总结

我们实际项目当中可能涉及到要在nacos中添加很多配置,这些配置如何区分,如何定位?

nacos的概念中,dataid、group、namespace是主要的区分和定位作用。本文示例中没有使用namespace,其实如果我们命名规则定义的好,只通过dataid和group也能精准定位。根据自身的需要制定合理的规则即可。

spring.cloud.nacos.config.namespace用于指定namespace,在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 nacos 上 public 这个namespace

通过设置 spring.cloud.nacos.config.enabled = false 可以完全关闭 spring cloud nacos config

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com