Nacos 客户端版本从1.x 升级到 2.x 的排坑记

news2025/1/19 5:15:10

问题描述

应用引入 Nacos Config 配置管理功能,应用启动时读取 Nacos 配置中心的配置作为启动参数,其中包括数据源信息 url 。

当 Nacos 正在进行 GC 操作、无法响应客户端请求时,应用端刚启动时发送的登录认证请求 http://IP:PORT/nacos/v1/auth/users/login 就会报超时异常:

2023-11-29 18:08:13.067 [com.alibaba.nacos.client.config.security.updater] ERROR c.a.n.c.s.SecurityProxy - [login,154] - [SecurityProxy] login http request failed url: http://IP:PORT/nacos/v1/auth/users/login, params: {username=xx}, bodyMap: {password=xx}, errorMsg: Read timed out
2023-11-29 18:08:17.061 [main] ERROR c.a.n.c.c.i.ClientWorker - [getServerConfig,304] - [fixed-IP_PORT-public] [sub-server-error] no right, dataId=logging.yaml, group=DEFAULT_GROUP, tenant=public
2023-11-29 18:08:17.071 [main] ERROR c.a.c.n.c.NacosPropertySourceBuilder - [loadNacosData,101] - get data from Nacos error,dataId:logging.yaml 
com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Wed Nov 29 18:08:16 CST 2023</div><div>There was an unexpected error (type=Forbidden, status=403).</div><div>unknown user!</div></body></html>
	at com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig(ClientWorker.java:306)

后面一些列的获取 bootstrap.yml 配置中的配置文件的请求都报未认证异常,应用程序因拿不到配置文件而走了 SpringBoot 的默认配置,SpringBoot 的数据源默认地址是 h2,数据源初始化异常,程序无法启动:

ERROR c.a.d.p.DruidDataSource - [init,936] - init datasource error, url: jdbc:h2:mem:9eede4b5-97dc-4d02-a202-7b3b4c6e8247;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
java.sql.SQLException: connect error, url jdbc:h2:mem:9eede4b5-97dc-4d02-a202-7b3b4c6e8247;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE, driverClass oracle.jdbc.OracleDriver

Nacos 组件偶发的 GC 导致程序启动拿不到数据,这种现象是偶发的,有一个疑问,为什么 Nacos 配置认证失败时,没有去加载本地的快照信息呢?
nacos server 部署的版本是 2.X ,但是客户端引入的 nacos 版本是 1.X 的,按网上的说法,思考升级 nacos-client 版本跟服务端一致能够解决这个问题呢。

还是一个问题就是经常出现 Nacos 不可用的异常:

java.net.ConnectException: no available server

想着升级一下来解决这个问题,本文记录升级客户端的坑。

升级 2.x 的客户端

官网给出的兼容 2.x 服务器的版本是 2021.1,用这个版本的客户端经常出现前文说的问题。支持 2.x 版本的 2022 及 2.2.X.RELEASE,选一个版本 2.2.9.RELEASE。

以为只是换个依赖包的问题,谁知道这里面有一个大坑,就是 nacos.config 配置用默认 namespace 时,不能在配置文件中进行设置,否则会获取不到配置。

客户端 spring-cloud-alibaba 升级为 2.2.9.RELEASE 之后,配置配置文件需要调整,应用使用默认命名空间时,必须注释掉 namespace: public 配置项:

    nacos:
      # nacos 服务器地址,依旧保持 8848 这个端口
      server-addr: IP:8848
      config:
        enabled: true
        username: xx
        password: xx
        # 引用的配置文件所属的命名空间,默认 public 时不能有该配置
#        namespace: public

2.x 客户端版本注意事项

《nacos 默认 namespace: public 拿不到数据》,搜到了这篇文章。根本的原因是在 Server 端的处理上,源码分析:
在这里插入图片描述

服务端是按上面的规则处理的,存储数据的 tenant_idpublic 命名空间是是空的。而客户端请求代码中 tenant 就是 namespace, 当不指定时, params 里面没有 tenant 项, 只有在指定了namespace 时才会有这个请求参数,与服务端存储的不一致,导致怎么都获取不到数据。

所以注释掉 nacos.config.namespace 配置后,请求配置时 tenant 为空,才能拿到默认命名空间 public 的配置信息。

启示录

本周看到一个概念「知识错觉」,定义如下:

“知识错觉”(the illusion of knowledge)指的是,你自以为懂得或掌握了某种知识和技能,但是实际上并不懂。最近的一项研究表明,互联网可能会助长人们的"知识错觉",过度自信自己的技能水平。
研究人员让实验的参与者,重复观看某种技能的视频,例如投飞镖或者跳霹雳舞的视频,最多可以看20次。
看完以后,参与者需要预估一下,自己对这项技能的掌握程度。
大多数人表示,通过观看视频,他们已经一定程度上掌握了该项技能。而且,观看视频次数越多的人,回答越确定,自信心越强。
然后,每个人需要当众展示该项技能。结果令人非常失望,他们显然都没有掌握。研究人员说"他们的实际表现没有显示出任何学会的迹象。"

但其实,对技术领域来说,还不能用“知识错觉”来形容技术实践过程和教程之间不能顺利匹配的问题。很多技术的官方文档描述的很简单,实践时总会碰到各种诡异的问题,所以需要排坑!

本文 nacos 组件估计升级客户端还是解决不了问题,根源在于 nacos 面临的频繁的 GC 问题导致总会有一瞬间提供不了服务导致响应超时。即使微服务和 nacos 部署在同一台主机上,也没法避免。

哎!路漫漫啊呀……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1280495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地仓库设置阿里云镜像

一、maven 修改maven配置文件conf/settings&#xff0c;在mirrors节点下添加以下内容 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public&l…

JVM垃圾回收机制GC

一句话介绍GC&#xff1a; 自动释放不再使用的内存 一、判断对象是否能回收 思路一&#xff1a;引用计数 给这个对象里安排一个计数器&#xff0c; 每次有引用指向它&#xff0c; 就把计数器1&#xff0c; 每次引用被销毁&#xff0c;计数器-1&#xff0c;当计数器为0的时候…

电源自动切换初识

【前提&#xff1a;这里以一般的单片机产品为例&#xff0c;使用3.3V的供电系统&#xff0c;常见的USB供电、外接电源设配器供电和电池供电】 一、经典二极管切换电路 这是最简单的电源切换电路&#xff1a;二极管并联&#xff0c;理论上支持无数个电源切换&#xff0c;缺点是…

【STL】手撕 string类

目录 1&#xff0c;string类框架 2&#xff0c;string&#xff08;构造&#xff09; 3&#xff0c;~string&#xff08;析构&#xff09; 4&#xff0c;swap&#xff08;交换&#xff09; 5&#xff0c;string&#xff08;拷贝构造&#xff09; 1&#xff0c;常规法 2&a…

LTO编译器优化介绍以及开启方法

文章目录 LTO介绍LTO 开启方法 LTO介绍 LTO&#xff08;Link Time Optimization&#xff0c;链接时优化&#xff09;是一种在链接阶段进行优化的技术。传统的编译过程中&#xff0c;编译器仅能对单个编译单元进行优化。LTO 允许编译器看到跨编译单元的代码&#xff0c;从而进行…

【Linux服务器Java环境搭建】03 Git工具安装

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…

基于SSM的新闻网站浏览管理实现与设计

基于ssm的新闻网站浏览管理实现与设计 摘要&#xff1a;在大数据时代下&#xff0c;科技与技术日渐发达的时代&#xff0c;人们不再局限于只获取自己身边的信息&#xff0c;而是对全球信息获取量也日渐提高&#xff0c;网络正是打开这新世纪大门的钥匙。在传统方式下&#xff…

【合集】从Java基础到JavaWeb网络开发——Java基础文章合集 JavaWeb网络开发文章合集

前言 本篇博客是Java开发的合集文章&#xff0c;内容涵盖了Java基础相关的博客&#xff0c;JavaWeb开发相关的博客&#xff0c;并且给出了小项目的案例。 目录 前言引出Java基础1、基本数据类型2、数组和集合List3、运算符4、逻辑控制5、IO流6、面向对象初步7、数据库入门8、J…

EasyMetagenome易宏基因组——简单易用的宏基因组分析流程-来自刘永鑫团队的秘密武器

原仓库地址如下&#xff0c;github有时候无法访问&#xff0c;等一段时间再试就行&#xff1a; YongxinLiu/EasyMetagenome: Easy Metagenome Pipeline (github.com) 相关文章&#xff0c;看文章更清晰这个可干啥&#xff1a; EasyAmplicon: An easy‐to‐use, open‐source…

【源码解析】聊聊线程池 实现原理与源码深度解析(一)

一、Java 线程池 实现原理与源码深度解析 架构 总揽线程池设计&#xff0c;其实可以发现都是符合顶层的接口设计&#xff0c;中间抽象类&#xff0c;最终是实际工作类 使用示例 public class MyRunnable implements Runnable{Overridepublic void run() {System.out.println…

关于前端学习的思考-word-wrap和word-break的区别

如上图word-wrap里面的break-word就是按照单词来换行的&#xff0c;空格在前&#xff0c;连字符在后的时候&#xff0c;按照连字符进行换行&#xff0c;那么空格和连字符哪一个拥有优先级呢&#xff1f; 连字符在前&#xff0c;空格在后的时候&#xff0c;还是按照连字符进行换…

分享87个节日PPT,总有一款适合您

分享87个节日PPT&#xff0c;总有一款适合您 87个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1eUxA59uQ-hZWWpFzzDuCkQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器 对象这个词在Spring范围内&#xff0c;称为bean Spring两大核心思想 1.IOC (IOC是控制反转&#xff0c;意思是控制权反转-控制权&#xff08;正常是谁用这个对象&#xff0c;谁去创建&#xff0c;&#xff09;-控制对象的控制权&#xf…

中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历 **思路&#xff1a;我们每一次一定可以根据递归确定根节点是哪个&#xff0c;就是前序第一个数&#xff0c;然后找中序遍历这个点&#xff0c;看左子树有几个节点&#xff0c;右子树有几个节点&#xff0c;然后就可以根据节点个数&#xff0c;递归左子树和右…

分享66个焦点幻灯JS特效,总有一款适合您

分享66个焦点幻灯JS特效&#xff0c;总有一款适合您 66个焦点幻灯JS特效下载链接&#xff1a;https://pan.baidu.com/s/10bqe09IAZt_hbsZlXaxkxw?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

搭建若依框架完成医疗项目 ——业务流程及页面展示

目录 一、搭建若依项目 1.1 快速了解 1.1.1 技术选型 1.1.2 内置功能 1.2 环境部署 二、医疗项目业务 2.1 门诊模块 2.2 住院模块 2.3 药房药库 2.4 表设计 三、项目展示 3.1 项目背景 3.2 门诊功能模块 3.2.1 患者档案 3.2.2 门诊卡信息 ​编辑 3.2.3 患者…

QueryRunner报红处理

如图&#xff0c;有同学反映QueryRunner报红&#xff0c;就是没有导包 自己去找项目的地址&#xff0c;找到web文件夹下的WEB-INF 把这些jar包都粘贴进去&#xff0c;以后项目基本都会用到的&#xff0c;资源自己去找 粘贴好后打开文件的Project Structure 点击Dependencies 点…

探索Java中的synchronized关键字

第1章&#xff1a;引言 咱们程序员在面对多线程编程时&#xff0c;经常会听到一个词——synchronized。这个词在Java世界里就像是一把万能钥匙&#xff0c;打开并发编程的大门。但是&#xff0c;你知道吗&#xff1f;虽然synchronized用得多&#xff0c;但真正深入理解它的人并…

solidity实现ERC721代币标准发布NFT

文章目录 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科2、IERC1653、IERC7214、IERC721Receiver5、IERC721Metadata6、ERC7217、ERC721 NFT 的实现8、编译部署 1、非同质化货币&#xff08;NFT&#xff09;- 维基百科 非同质化代币&#xff08;英语&#xff1a;Non-F…

【滑动窗口】水果成篮

水果成篮 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09; 文章目录 水果成篮题目描述问题转化 算法原理解法一解法二 代码编写C代码&#xff1a;使用容器数组模拟哈希表 Java代码使用容器数组模拟哈希表 题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一…