Nacos配置中心搭建及动态刷新配置及踩坑记录

目录
  • 一、Nacos配置中心介绍
  • 二、配置中心搭建
    • 1.配置中心启用
    • 2.创建配置文件
    • 3.工程配置
  • 三、试验结果
  • 四、踩坑经历
  • 五、总结

近期有用到阿里的开源配置中心及注册中心nacos,特此记录并分享一些学习笔记及配置踩坑点。

一、Nacos配置中心介绍

从架构图上可以知道,Nacos提供了两种服务,一种是用于服务注册、发现的Naming Service,一种是用于配置中心、动态配置的Config Service,而他们底层均由core模块来支持。

外层提供OpenAPI供客户端使用,并提供了User Console、Admin Console方便用户使用 。

用户通过管理平台发布配置,通过HTTP调用将配置注册到服务端,服务端将之保存在MySQL等持久化存储引擎中;用户通过客户端SDK访问服务端的配置,同时建立HTTP的长轮询监听配置项变更,同时为了减轻服务端压力和保证容灾特性,配置项拉取到客户端之后会保存一份快照在本地文件中,SDK优先读取本地文件里的配置。

当服务端的配置发生变更时,客户端会通过监听机制,拿到变更后的最新配置信息。

简单来说,Nacos 客户端是怎么实时获取到 Nacos 服务端的最新数据的:

Nacos 并不是通过推的方式将服务端最新的配置信息发送给客户端的,而是客户端维护了一个长轮询的任务,定时去拉取发生变更的配置信息,然后将最新的数据推送给 Listener 的持有者。

二、配置中心搭建

1.配置中心启用

首先需要到官网上下载nacos-server,然后将服务跑起来之后。

根据自己的需要,建立几个命名空间,当然使用默认的public的命名空间也是可以的,如图所示。

2.创建配置文件

在配置列表中创建配置文件,其中配置文件命名方式需要注意。

在Nacos-Server中新建配置,其中Data ID它的定义规则是:${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
  • spring.profiles.active 即为当前环境对应的 profile,可以通过配置项 spring.profiles.active 来配置。
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 prefix.{prefix}.prefix.{file-extension}

在本文中,我的项目名称为vaso-core,配置文件使用的是dev环境,因此我的配置文件如下:

其中的文件内容就是正常的yaml格式的内容填写就行,这边就不具体展示了。

3.工程配置

首先我们需要导入nacos-config的依赖(注:我这边没有使用nacos的注册发现,依旧沿用自身使用的eureka)。

其中依赖版本的对应关系可以在官网中查找。

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

其次我们需要在配置文件中进行配置,采用bootstrap.yml文件进行配置,因为springboot会优先启动bootstrap.yml文件中的配置。其中文件内容如下:

bootstrasp.yml:

spring:
  application:
    name: vaso-core
    cloud:
    nacos:
#      discovery:
#        server-addr: xx.xx.xxx.xx:8848
#        namespace: 8b387ec4-e60d-4878-baf4-f2246e58a1d6
      config:
        server-addr: xx.xx.xxx.xx:8848
        file-extension: yml
        namespace: 8b387ec4-e60d-4878-baf4-f2246e58a1d6
  profiles:
    active: dev

namespace的内容为上文中配置的dev命名空间的id。

最后我们需要引入@refreshscope关键字,保证可以实时刷新配置。在controller层或者要刷新的值所在的类上进行注释就行。

其中我们的demo是如下所示:

三、试验结果

将工程跑起来,可以看到一开始就已经去配置中心读取配置了,如图:

此时将配置中心内容修改,可以看到已经实时刷新了配置。

四、踩坑经历

其实在正式使用之前也碰到过nacos无法试试实时刷新的问题,打断点却发现实际已经读取到本地,通过进入spring的源码中查看,也发现其实已经可以拿到配置了,但是却一直无法刷新配置。

最后通过一个礼拜的定位源码,断点查询才发现一个本质性的问题。欲哭无泪

@RefreshScope与数据源之间存在冲突!!

具体如下:

  • 因为项目是多数据源,所以使用的是自定义数据源配置的DataSource,用@Bean注入。
  • 在SpringBoot 2.0以上默认使用Hikari连接池,一旦连接池启动,就无法再修改HikariDataSource,所以刷新配置时连带数据源一起刷新,于是会报错。

Caused by: java.lang.IllegalStateException: The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes.

解决方法: 在自定义的DataSource上加入注解@RefreshScope,或者使用spring.scloud.refresh.extra-refreshable配置指定classname列表即可。

查看Hikari的默认配置即可发现,这个与刷新配置之间是存在冲突的。

因此在数据源配置类中加入注释,这样每次刷新配置的时候会重新刷新这个Bean,那么就可以保证不会报错,这样的spring的刷新机制就可以顺利执行下去了。

五、总结

通过这次经历,我发现定位问题的过程是一门极高的学问,学会怎么去看源码,懂原理才能更好的更精准的分析问题所在之处。

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

(0)

相关推荐

  • nacos配置中心远程调用读取不到配置文件的解决

    目录 nacos配置中心远程调用读取不到配置文件 下面引用官方文档的一段内容 读取不到nacos配置中心内容的坑 这是出错的配置 这是正确的配置 nacos配置中心远程调用读取不到配置文件 1.由于公司要求,对nacos做了命名空间的配置.(这个开始我步入了迷途....) 为了更好的区分配置文件,我们创建了两个命名空间,dev和test,在学习的时候,我们并未创建这些命名空间,所以一直正常使用,创建命名空间后我们无法读取到配置文件. 那么添加命名空间后需要在配置文件中支持命名空间,类似你创建了g

  • SpringCloud安装Nacos完成配置中心

    目录 1. Nacos介绍 2. docker安装Nacos 2.1 docker-compose.yaml 2.2 启动后访问控制台 3.Springboot集成Nacos 3.1 pom依赖 3.2 yaml配置 3.3 测试配置动态化 3.4 测试日志 eureka注册中心 1. Nacos介绍 官网说明:Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. 2. docker安装Nacos 基

  • 详解Nacos配置中心的实现

    目录 基础配置 pom文件 YML文件 配置配置中心文件 Nacos中的匹配规则 Nacos作为配置中心-分类配置 Nacos的图形化管理界面 三种方案加载配置 DataID方案 Group方案 Namespace方案 基础配置 新建module:cloudalibaba-config-nacos-client3377 pom文件 版本号已经由父工程控制 <?xml version="1.0" encoding="UTF-8"?> <project

  • Nacos配置中心的配置文件的匹配规则及说明

    目录 Nacos配置中心配置文件的匹配 1.配置微服务配置中心文件 2.常用细节 3.从一个配置中心加载多个配置集 Nacos配置中心配置不成功问题 1.扫描包 2.关于配置nacos 3.为何没有热加载? 4.配置好为何还是没有热加载? 5.另一个坑 6.如何打开项目中的nacos Nacos配置中心配置文件的匹配 详情见nacos的官方文档 1.配置微服务配置中心文件 在 Nacos Spring Cloud 中,数据集(Data Id) 的配置完整格式如下: ${prefix}-${spr

  • 详解Nacos中注册中心和配置中心的实现

    目录 1.Nacos 简介 Nacos 特性介绍 2.注册中心实现 2.1 创建服务提供者 2.2 创建服务消费者 3.配置中心实现 3.1 新建项目并添加依赖 3.2 配置 Nacos Config 信息 3.3 编写代码读取配置文件 3.4 Nacos 控制台添加配置信息 3.5 动态刷新功能 4.项目源码 小结 Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud A

  • Nacos配置中心搭建及动态刷新配置及踩坑记录

    目录 一.Nacos配置中心介绍 二.配置中心搭建 1.配置中心启用 2.创建配置文件 3.工程配置 三.试验结果 四.踩坑经历 五.总结 近期有用到阿里的开源配置中心及注册中心nacos,特此记录并分享一些学习笔记及配置踩坑点. 一.Nacos配置中心介绍 从架构图上可以知道,Nacos提供了两种服务,一种是用于服务注册.发现的Naming Service,一种是用于配置中心.动态配置的Config Service,而他们底层均由core模块来支持. 外层提供OpenAPI供客户端使用,并提供

  • spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

  • Spring Cloud 配置中心内容加密的配置方法

    从配置获取的配置默认是明文的,有些像数据源这样的配置需要加密的话,需要对配置中心进行加密处理. 下面使用对称性加密来加密配置,需要配置一个密钥,当然也可以使用RSA非对称性加密,但对称加密比较方便也够用了,这里就以对称加密来配置即可. 1.安装JCE JDK下的JCR默认是有长度限制的,需要替换没有长度限制的JCE版本. http://www.oracle.com/technet... 把下载包里面的两个jar文件复制替换到JAVA_HOME/jre/lib/security目录下. 2.添加加

  • SpringMVC配置404踩坑记录

    目录 前言 错误 原因 总结和教训 前言 在学习SpringMVC的路上真是开门就遇见拦路虎了,在配置的时候一直是按照硅谷的视频配置的.但是跑起来就一直是404,这个就很搞人心态了.在配置环境时是在晚上11:00然后配置到11:30,而找错误就十分的痛苦了,从当天晚上的12.00一直到半夜1.30还没找出来,第二天又是卡了一天,直到快到第三天的前一个小时可算让我找出来了. 首先在这里先感谢夜星大佬和杨总.夜星大佬远程帮我找错误,杨总帮我提意见!在此90°的鞠躬.同时也希望本篇博客能够帮助更多的小

  • 详解配置Django的Celery异步之路踩坑

    人生苦短,我用python. 看到这句话的时候,感觉可能确实是很深得人心,不过每每想学学,就又止步,年纪大了,感觉学什么东西都很慢,很难,精神啊注意力啊思维啊都跟不上.今天奶牛来分享自己今天踩的一个坑. 先说说配置过程吧,初学Django,啥都不懂,当然,python也很水,啥东西都得现查现用.Django安装还是很简单的. apt-get install python3 pip3 install django 嗯,就是两条命令的事儿. 再说celery的安装: pip3 install cel

  • 详解多页应用 Webpack4 配置优化与踩坑记录

    前言 最近新起了一个多页项目,之前都未使用 webpack4,于是准备上手实践一下.这篇文章主要就是一些配置介绍,对于正准备使用 webpack4 的同学,可以做一些参考. webpack4 相比之前的 2 与 3,改变很大.最主要的一点是很多配置已经内置,使得 webpack 能"开箱即用".当然这个开箱即用不可能满足所有情况,但是很多以往的配置,其实可以不用了.比如在之前,压缩混淆代码,需要增加uglify插件,作用域提升(scope hosting)需要增加ModuleConca

  • Nacos客户端配置中心缓存动态更新实现源码

    目录 客户端配置缓存更新 长轮训任务启动入口 ClientWorker checkConfigInfo LongPollingRunnable.run checkLocalConfig checkListenerMd5 检查服务端配置 checkUpdateDataIds checkUpdateConfigStr 客户端缓存配置长轮训机制总结 服务端配置更新的推送 doPollingConfig addLongPollingClient ClientLongPolling allSubs Lon

  • Spring Cloud Alibaba使用Nacos作为注册中心和配置中心

    目录 前言 Nacos简介 使用Nacos作为注册中心 安装并运行Nacos 创建应用注册到Nacos 负载均衡功能 使用Nacos作为配置中心 创建nacos-config-client模块 在Nacos中添加配置 Nacos的动态刷新配置 使用到的模块 前言 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Nacos 作为其核心组件之一,可以作为注册中心和配置中心使用,本文将对其用法进行详细介绍. Nacos简介 Nacos 致力于帮助您发现.配置和管理微服务

  • 阿里面试Nacos配置中心交互模型是push还是pull原理解析

    目录 引言 配置中心 长轮询 Nacos初识 几个概念 客户端源码分析 结束语 引言 对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现.配置管理,非常好用的一个工具.然而这样的技术用的人越多面试被问的概率也就越大,如果只停留在使用层面,那面试可能要吃大亏. 比如我们今天要讨论的话题,Nacos在做配置中心的时候,配置数据的交互模式是服务端推过来还是客户端主动拉的? 这里我先抛出答案:客户端主动拉的! 接下来咱们扒一扒Nacos的源码,来看看它具体是如何实现的? 配置中心 聊N

  • Spring Cloud之配置中心的搭建

    Spring Cloud是现在流行的分布式服务框架,它提供了很多有用的组件.比如:配置中心.Eureka服务发现.消息总线.熔断机制等. 配置中心在Spring Cloud的众多组件中是比较基础的,它提供了配置文件的统一管理,可以很轻松的切换不通的环境. 它的具体结构如下: 存储配置文件的文件系统(通常使用git) 配置中心服务端(从文件系统获取最新的配置文件,为客户端提供配置信息) 配置客户端(从配置中心获取配置信息) Spring Cloud是建立在Spring Boot基础上的,Sprin

随机推荐