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

2023-12-03 06:30

本文主要是介绍Nacos 客户端版本从1.x 升级到 2.x 的排坑记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

应用引入 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:8848config:enabled: trueusername: xxpassword: 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 部署在同一台主机上,也没法避免。

哎!路漫漫啊呀……

这篇关于Nacos 客户端版本从1.x 升级到 2.x 的排坑记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/448446

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

macOS升级后SVN升级

问题 svn: error: The subversion command line tools are no longer provided by Xcode. 解决 sudo chown -R $(whoami) /usr/local/Cellar brew install svn

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

JeecgBoot 升级springboot版本到2.6.0

1. 环境描述 Jeecgboot 3.0,他所依赖的springboot版本为2.3.5Release,将springboot版本升级为2.6.0。过程全纪录,从2开始描述。 2. 修改springboot版本号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧

Windows 10 各版本

对应于服务选项的 Windows 10 当前版本 Version服务选项上市日期OS build最后修订日期1803半年频道7/10/201817134.1917/24/2018Microsoft 建议使用1803半年频道(定向)4/30/201817134.1917/24/20181709半年频道1/18/201816299.5797/24/20181709半年频道(定向)10/17/2017