SpringBoot集成nacos实现统一配置中心

导入依赖

咳咳,划重点,从导入依赖开始,坑就已经来了,哈哈!!!

导入的依赖很有讲究,你是啥springboot版本,然后下面的nacos版本配置就是啥,我也是醉啦。详情看我的配置,我的springboot依赖版本是2.2.6.RELEASE,然后我的nacos赖版版本也是2.2.6.RELEASE。

我强烈建议兄弟你先按照我的springboot 2.2.6.RELEASE 版本来,等看完本篇文章后你再切换成你自己的springboot版本也不迟。

下面罗列了关键的nacos依赖配置及springboot的版本。

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
    </parent>
 
 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
 </dependencies>

创建命名空间

"命名空间"视为项目。

下载好nacos服务器,我下载的版本是nacos1.1.4。启动 nacos服务器后,创建第一个命名空间"MY_PROJECT"。

这个命名空间专门用于给某个项目专用,刚创建的命名空间,如图ID是"3dab7b44-83fa-429a-8496-528986c6f54a",记住这个命名空间的id,待会要用到。

创建启动分支分组

项目的配置文件空间创建好了,下一步就是创建不同的开发分支。正常会有dev、test、pro分支。

这个分支在nacos中对应的概念就是"Group"。我们简单理解就是开发环境,例如dev、test、pro。

如下图,我们点击"MY_PROJECT",到我们这个项目的统一配置中心来,目前还没有任何配置。

我们尝试创建dev环境的分组。如下图,创建dataId为 "demo.properties",group为"dev"的第一个配置文件。配置文件的内容是指定端口为8081,然后自定义一个"author=dayu"的变量,详情请看下图。

这个过程就像我们在以前的application.properties中配置的那样。配置完后点击"发布" 就好啦。

 

配置完返回并查看,点击MY_PROJECT命名空间下,我们就配置好了一个dataId是demo.properties的配置文件,且该配置文件属于分组dev,我们把它设计为开发环境需要的参数。未来可以增加更多的分组对应不同的环境,例如test环境、pro环境。

该demo.properties文件的内容很简单,就是"server.port=8081",还有"author=dayu"

 代码接入nacos

我们在springboot工程中创建一个bootstrap.properties文件,它的加载优先级是最高的。配置详情如下:

# 我是bootstrap.properties配置文件
 
#服务器地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#项目的命名空间的ID,每个人的都不一样
spring.cloud.nacos.config.namespace=3dab7b44-83fa-429a-8496-528986c6f54a
#当前的Group,配置的是啥Group,读取的就是啥group下的配置文件
spring.cloud.nacos.config.group=dev
#配置文件的文件后缀
spring.cloud.nacos.config.fileExtension=properties
#项目名称
spring.application.name=demo

spring.cloud.nacos.config.server-addr,nacos服务器地址

spring.cloud.nacos.config.namespace,读取的命名空间,就是本文一开始的那个命名空间的id。

spring.application.name=demo,设计我们的项目名称是"demo"。

spring.cloud.nacos.config.fileExtension ,配置文件的文件后缀设计为"properties"。

spring.cloud.nacos.config.group=dev。读取group为dev的配置文件

这段在bootstrap.properties中的配置究竟功能是什么呢?我总结了一段话来描述:

让我们去读取指定 nacos服务器下的指定的命名空间中的配置文件。这个配置文件的ID 是 ${spring.application.name}.${spring.cloud.nacos.config.fileExtension},且它的group是${spring.cloud.nacos.config.group}。

用配置文件替换上面的这段话:

让我们去读取指定 nacos服务器下的指定的命名空间中的配置文件。这个配置文件的DataId 是 demo.properties,且它的group是dev。

 再回头看看我们的配置文件,确实就是DataId = demo.properties、Group=dev

 启动项目:

控制台打印:

 控制台说明加载dataId[demo],默认后缀是properties被省略掉了,group是dev。说明正确。

配置文件中规定了启动端口是8081,项目真的按照了8081端口启动了耶!!!说明了我们已经读取到了nacos统一配置平台的配置。

 加载多个配置

在项目中创建application.yaml文件,配置启动分支以dev分支启动。

 再次启动项目,除了之前based on dataId[demo] ,我们看到控制台上显示:based on dataId[demo-dev.properties] 。

这就说明nacos除了刚才加载的dataId=demo.properties文件,另外还根据启动分支,也尝试去读取

${spring.application.name}-${启动分支}.${spring.cloud.nacos.config.fileExtension} ,即demo-dev.properties文件。

于是我们顺水推舟,在nacos上创建dataId为[demo-dev.properties] ,同时配置GroupId为dev,如下图,切记别忘了配置分组!!!

配置的内容就配一个 age=26 吧。兄弟,看这里,别漏了age变量的配置,下面做测试要用到的哦。

 返回并查看,现在就有两个配置了。

 代码验证

我们写一个Controller试试看,这里代码中需要加上 @RefreshScope 注解,注解作用就是当nacos中的配置文件更新的时候,同步更新到代码中!!! 

 启动后不要关闭项目哈!

@RestController
@RequestMapping(value = "/")
@RefreshScope
public class HelloController {
 
    @Value("${author}")
    private String author; // 在demo.properties文件中配置了
    @Value("${age}")
    private String age; // 在demo-dev.properties文件中配置了
 
    @GetMapping(value = "/hello")
    public String function() {
        return "hello " + author + ",your age is " + age;
    }
}

看我的调用效果:

 配置文件动态刷新

刚才启动的项目先不要关闭,我们接着在nacos上编辑demo-dev.properties文件,我们尝试修改age值

 改成18岁,然后点击"发布"按钮,相当于重新刷新一下配置的值。

 

 重新发布后,控制台上打印出 Refresh keys changed: [age] ,说明重新刷新了age的值。

 再次访问,值就已经刷新啦!

 更多的配置文件

目前我们的应用可以读取demo.properties文件与demo-dev.properties文件,如果想把更多的配置文件加入到nacos中,应该怎么读取呢?

假设我们有一个数据库的配置要抽出来单独放到 database.yaml中。我们可以这样配。

在nacos中增加一个database.yaml的配置,如下图

 database.yaml的配置内容如下:

spring:
  datasource:
    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver

既然是yaml格式,那么在配置的时候,配置格式选择"yaml"。 为了测试,我们把Group设计为"common"。

因为有同学可能会问Group一定要为"dev"吗。我的答案是dev开发环境最好设计为"dev"。这里为了测试,所以才设置的是"Group=common"。

 配置好了以后,怎么让项目启动的时候读取除了刚才的demo.properties以及demo-dev.properties,怎么额外读取这个database.yaml,且分组是common的配置文件呢?

我们在bootstrap.properties文件中追加这段配置。

#额外的配置文件
#额外的第一个配置文件的dataId
spring.cloud.nacos.config.extension-configs[0].data-id=database.yaml
#额外的第一个配置文件的分组
spring.cloud.nacos.config.extension-configs[0].group=common
#开启自动刷新
spring.cloud.nacos.config.extension-configs[0].refresh=true
 
 
#额外的第二个配置文件只需要改变角标即可
#spring.cloud.nacos.config.extension-configs[1].data-id=xxxx
#spring.cloud.nacos.config.extension-configs[1].group=xxxx
#spring.cloud.nacos.config.extension-configs[1].refresh=true
 
#额外的第三个配置文件
#spring.cloud.nacos.config.extension-configs[2].data-id=xxxx
#spring.cloud.nacos.config.extension-configs[2].group=xxxx
#spring.cloud.nacos.config.extension-configs[2].refresh=true
 
#更多额外的配置文件....

 测试Controller代码如下:

@RestController
@RequestMapping(value = "/")
@RefreshScope
public class DBController {
 
    @Value("${spring.datasource.mysql.driver-class-name}")
    private String driver;
 
    @GetMapping(value = "/db")
    public String function() {
        return driver;
    }
}

浏览器访问查看,localhost:8081/db ,

读取到了我们在nacos中的database.yaml中的${spring.datasource.mysql.driver-class-name} 配置的值。嘎嘎。

 总结 

  你真是太棒啦!这是伟大的第一步,我们终于成功入门了nacos!

你看我都这么努力的分享知识给你了,鼓励一下又何妨O(∩_∩)O

大宇期待与你们共同进步!同时非常感谢最近兄弟们的支持!

 

posted @ 2022-07-10 18:58  小大宇  阅读(653)  评论(0编辑  收藏  举报