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


    导入依赖

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

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

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

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

        
        
            org.springframework.boot
            spring-boot-starter-parent
            2.2.6.RELEASE
        
    
     
            
                org.springframework.boot
                spring-boot-starter-web
            
    
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-config
                2.2.6.RELEASE
            
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    创建命名空间

    "命名空间"视为项目。

    下载好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.yaml中配置的那样。配置完后点击**“发布”** 就好啦。

    配置完返回并查看,点击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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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 是 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. 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文件,另外还根据启动分支,也尝试去读取

    s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    看我的调用效果:

    配置文件动态刷新

    刚才启动的项目先不要关闭,我们接着在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
    
    • 1
    • 2
    • 3
    • 4

    既然是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
    
    #更多额外的配置文件....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    测试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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    浏览器访问查看,localhost:8081/db ,读取到了我们在nacos中的database.yaml中的${spring.datasource.mysql.driver-class-name} 配置的值。嘎嘎。

    总结

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

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

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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【C语言】每日一题,快速提升(2)!
    神经网络在控制中的作用,神经网络控制基本原理
    【QT】信号和槽
    【笔试题】【day20】
    UDP通信程序的详细解析
    nginx学习(3)Nginx 负载均衡
    Scala第三章节
    【LaTex】LaTex的下载与安装(超详细、超简洁)
    Webpack 安装教程
    2023年天津财经大学珠江学院专升本报名缴费准考证下载考试须知
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126115755