首页 > 其他分享 >nacos启动异常和动态配置未生效

nacos启动异常和动态配置未生效

时间:2024-05-23 11:56:09浏览次数:19  
标签:spring boot nacos alibaba 版本 生效 动态 cloud

最近打算研究一下nacos动态配置的原理,于是开始照着Nacos 官网快速入门。但是发现在和SpringBoot以及SpringCloud适配启动的时候,总是报错无法启动,于是深入排查了一下并作以记录。

1. nacos和SpringBoot启动报错

Invalid default: public abstract com.alibaba.nacos.api.config.ConfigType com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource.type()�
翻看源码会发现@NacosPropertySource这个注解的type值是一个不存在的枚举,导致在初始化默认值的时候报错了
image.png

image.png
经排查,发现是ConfigType所属jar包版本过低的原因,从上图可以看出是1.2.1的版本。但是明明我的pom版本中的starter是0.2.12,底层依赖的api版本是2.1.0,为什么实际判定的依然是1.2.1呢?

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.0</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.12</version>
  </dependency>
</dependencies>

发现在父项目中,指定了spring-cloud-alibaba-dependencies的版本,虽然我在boot这个模块中没有使用cloud的相关版本,但是由于Maven 父pom中dependencyManagement版本优先级高于传递依赖版本,而spring-cloud-alibaba-dependencies的nacos-api是1.2.1版本,nacos-config-spring-boot-starter下又是传递依赖,最终就以前者为准了。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.1.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

解决方案有两种,一种是在cloud.pom中删掉spring-cloud-alibaba-dependencies,另一种则是在nacos-spring-boot.pom新增依赖,在2.1.0的版本中,nacos-api和nacos-client中都有ConfigType.UNSET这个枚举了

<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-api</artifactId>
  <version>2.1.0</version>
</dependency>
或者
<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
  <version>2.1.0</version>
</dependency>

2. nacos和SpringCloud启动报错

Error creating bean with name 'requestMappingHandlerAdapter' defined in class path
......
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.StreamReadFeature
单看这个报错,是因为找不到类导致的。
这个项目的pom是这样的,版本也是参考官网的版本

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.1.RELEASE</version>
  </dependency>
</dependencies>

既然是找不到com.fasterxml.jackson.core包里的类,那就观察依赖中的情况,可以明显发现,core包是2.9.10,其他都是2.10.2,直觉告诉我都不太对,那为啥是这样的呢?
image.png
通过idea提供的依赖分析工具来看,jackson-core分别在两个jar包下都存在,只不过在spring-cloud-starter-alibaba-nacos-config中处于第三级,在spring-boot-starter-web中处于第四级,传递依赖里层级越小的优先级越高,所以就以2.9.10为准了
image.png
但这个时候,你可能会疑问,说不是官网推荐的版本吗?怎么会有这样的问题呢?官网的意思是让你总pom使用这个版本,你可以尝试将下面这段加到pom文件中,你会发现就不存在这样的问题了。这是因为在spring-boot-dependencies的下一级就直接定义了jackson-bom的版本为2.10.2.20200130,结合我们问题1中提到的Maven 父pom中dependencyManagement版本优先级高于传递依赖版本,现在起效的就是2.10.2版本了

<dependencyManagement>
  <dependencies>
    <!--            实际上是因为在spring-boot-dependencies定义jackson版本的层级是最近的-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.2.5.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.1.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

image.png

3. 启动之后动态配置未生效

先排查nacos和boot或者cloud的版本是否是官方推荐的版本,如果不是,建议先改成推荐版本。
在boot中,核心类是NacosConfigService,如果动态配置一直不生效,可以研究一下是否注册了listener,修改时是否有走到safeNotifyListener
在cloud中,需要额外注意一点是,NacosPropertySourceLocator这个bean是否有被实例化,他在NacosConfigBootstrapConfiguration中。如果NacosPropertySourceLocator没有实例化,启动时根本不会拉取nacos云上的配置。

标签:spring,boot,nacos,alibaba,版本,生效,动态,cloud
From: https://www.cnblogs.com/qisi/p/18208123/nacos_spring_boot_cloud

相关文章

  • 第一阶段复习——基础动态规划
    背包知识点总结:01背包、完全背包的转移方程滚动数组和倒序初始化问题:完全放满和不一定放满多重背包二进制优化,边界问题。处理完之后跑完全背包。“在这一讲中,我们看到了将一个算法的复杂度由O(VΣMi)改进到O(VΣlogMi)的过程,还知道了存在复杂度为O(VN)的算法。”单......
  • Nacos的配置管理
    为什么需要配置管理?在单体应用中,配置管理可能不是什么大的事情,通常会以配置文件的方式。常见的方法比如将配置通过打包脚本打入应用包中,或者直接放到运行应用的服务器的特定目录下,或者存储到数据库中。这种方式在传统的单体应用中简单有效,但是也会有些比较棘手的问题,比如:配置......
  • QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
     Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator支持Windows、Linux、M......
  • SpringBoot动态定时任务
    其实SchedulingConfigurer实现方法很简单,只需要实现SchedulingConfigurer并重写configureTasks方法,在启动类必须加上@EnableScheduling注解即可。@Configuration@EnableScheduling@Slf4jpublicclassRuleTaskimplementsSchedulingConfigurer{privatevolatileSch......
  • Nacos的服务分级模型
    分级模型为了提升整个系统的容灾性,Nacos引入了地域(Zone)的概念,如上图中的北京、上海和杭州。把同一个服务的多个实例部署到不同地域的机房中(鸡蛋分开不同的篮子放);又把在同一个地域的机房的多个服务实例称为集群(Cluster)。比如,杭州机房的2个用户服务user-servi......
  • Nacos注册中心
    Nacos是springcloud的扩展,注册中心功能通过NacosDiscoveryClient继承DiscoveryClient,在springcloud中,与Eureka可以无侵入的切换。注册中心可以手动剔除服务实例,通过消息通知客户端更新缓存的实例信息,完整调用链路示例如下:Nacos的关键特性包括:服务发现和服务健康监测动......
  • 动态sbm模型dsbm复现
    大家新年好!今天推出的是动态SBM模型,参考文献是:《DynamicDEA:Aslacks-basedmeasureapproach》,文献doi是:10.1016/j.omega.2009.07.003不同于常见的DEA模型只能处理截面数据,动态SBM模型能够处理面板数据,其结构如下:其中的链接变量,carry-over分为以下四种:(1)理想的(好的)链接,这......
  • 2022-05-18-空间静态kernel核密度、空间动态kernel核密度工具更新
    在前版本基础上,针对有用户反映当数据有极端大的异常值时,画出的图不美观,具体表现在等高线集中在某一小块区域的问题,对此做出改进如下:增加坐标轴范围的选项,该选项的范围为1-100,代表将数据从小到大排列后,取前百分之多少的量,以剔除极端大值。当数据中没有极端大值时,该项填100,当极端大......
  • 2022-05-07-无条件、空间静态、空间动态kernel核密度工具
    今天要介绍的是一个目前论文中常用到的方法:无条件kernel核密度、空间静态kernel核密度和空间动态kernel核密度。Kernel核密度估计属于非参数估计方法,不过分依赖模型,可以用来研究各地区的不平衡分布问题。假设f(x)是随机变量X的的密度函数,Xi为独立同分布的观测值,x为均值,h为带宽。......
  • element ui 动态表头不刷新问题
    今天弄vue前端,动态表头出现如题问题。代码如下<el-table-columnv-for="(item,index)intableHeads":key="index"><templateslot="header">//处理表头业务逻辑……<div>{{item.num}}</div></template></el-table-column>......