前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nacos 与项目整合

Nacos 与项目整合

原创
作者头像
啵啵肠
发布2023-11-20 14:19:26
1910
发布2023-11-20 14:19:26
举报

1、Nacos 与项目整合

1.1、最外层 pom 文件内容
代码语言:html
复制
<!-- spring boot 版本 -->
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
	
   <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
	
	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
1.2、模块 pom
代码语言:html
复制
 <dependencies>

        <!-- nacos -->
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

** bootstrap.yml **

代码语言:yaml
复制
spring:
  application:
    name: order
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS-HOST:127.0.0.1}:${NACOS-PORT:8848}
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml


  profiles:
    active: dev

为什么要使用 bootstrap.yml 而不是 application.yml 呢?

第一是因为 bootstrap 优先于 application 加载。 第二是保证 Bootstrap ContextApplication Context 配置的分离,具体可以看 https://www.baeldung.com/spring-cloud-bootstrap-properties 的 Conclusion 与 https://www.cnblogs.com/blognetspace/p/8469033.html

项目启动的时候会默认加载一个 prefix + '-' + ${spring.active.profile} + . + ${spring.cloud.nacos.config.file-extension} 的配置文件,而 prefix 默认是 spring.application.name,当然也可以重置: spring.cloud.nacos.config.prefix

示例项目地址https://gitee.com/rookiesJ/nacos-test.git

2、配置读取

2.1、定位其他配置集

看过之前的章节可以知道,我们之前创建过命名空间,设定过 group,那之前的操作怎么使用呢?

我们只需要配置 spring.cloud.nacos.config.namespace 就可以指定命名空间,配置 spring.cloud.nacos.config.group 就可以指定分组。如果 namespace 不填的话默认是 “public” 的 ID,group 不填的话默认是 “DEFAULT_GROUP” 。

那 namespace 与 group 怎么填呢?

namespace 填的是 “命名空间 ID”,在菜单中的命名空间可以看到,或者看这个位置。

而 group 就在配置列表的配置集中的 Group 字段。

例子:

代码语言:yaml
复制
spring:
  cloud:
    nacos:
      config:
        namespace:
        group:
2.2、项目中读取环境配置

既然我们在 Nacos 中配置了一些配置项,那里我们在项目中是如何去读取 Nacos 配置的呢?

其实和我们平时读取配置的操作是一模一样的。

代码语言:text
复制
 @Value("${haha}")
 private String test;

就这样。

2.3、配置文件自动刷新

我们修改 Nacos 配置集中的配置项,然后控制台也有提示说某某属性已被更新成啥东西,但是为什么刷新后还是原来的值呢?spring.cloud.nacos.config.refresh-enabled 是 true 啊(默认是 true),自动刷新已经启动了啊,为什么还是最开始读取的?

这个跟 @Value 注解读取配置有关系,具体有啥关系,我后续再补上。反正它读取的是最开始加载的配置,要想刷新它读取的配置,必须在需要刷新的类上加上 @RefreshScope 注解(spring cloud 提供的),就比如像下面的:

代码语言:less
复制
@RestController
@RefreshScope
public class TestController {


    @Value("${you}")
    private String test;

    @RequestMapping("test")
    public String test(){
        return test;
    }
}

这样就可以动态读取环境配置了。还有其他方法,我就不一一描述了。

2.3、一个模块对应多个配置文件

既然项目可以读取 Nacos 配置集,那能不能读取多个呢? ok,这个问题开发者也想到了,下面来看看如何操作。

第一种方式是采用 extension-configs 的配置方式:

代码语言:yaml
复制
spring:
  cloud:
    nacos:
      config:
        extension-configs:
          -
            data-id: extends-base-dev.yml 
			refresh: true

refresh 是开启自动刷新配置功能。这个也可以指定 group 这样的配置,和上面的是一样的。如果是 .properties 格式化的,就写成spring.cloud.nacos.config.extension-configs[0].data-id=这样。

第二种方式是采用 shared-configs 的方式:

代码语言:yaml
复制
spring:
  cloud:
    nacos:
      config:
        shared-configs:
          -
            data-id: extends-base-dev.yml
			refresh: true

他们之间的区别就在于加载优先级的问题,不过老的版本是 shared-configs 不能指定 group 等其他属性,1.4 版本没有这个问题。

2.4、配置文件加载优先级

bootstrap > application > extension-configs > shared-configs

在 extension-configs 等中的数组配置文件的下标越大,则优先级越高,后续加载的属性会覆盖掉前面的属性。越后加载,属性冲突后面加载的属性就会覆盖前面的属性。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Nacos 与项目整合
    • 1.1、最外层 pom 文件内容
      • 1.2、模块 pom
      • 2、配置读取
        • 2.1、定位其他配置集
          • 2.2、项目中读取环境配置
            • 2.3、配置文件自动刷新
              • 2.3、一个模块对应多个配置文件
                • 2.4、配置文件加载优先级
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档