【Nacos】Nacos 双端版本升级实战手册

在这里插入图片描述

背景

由于原来使用的 Nacos 版本(1.1.4)存在安全漏洞,需要进行升级修复。经过查询后,决定将版本升级到2.2.4。

Nacos 服务共有三个:

  • 192.168.2.190:8848
  • 192.168.2.191:8848
  • 192.168.2.192:8848

步骤

  1. 服务端升级(不开鉴权)
  2. 客户端升级
  3. 服务端开启鉴权

说明:服务端升级到 2.2.4 版本,如果不需要开启鉴权,则客户端可以不升级,因为配置中心兼容支持 Nacos1.0 起的所有版本客户端,服务发现兼容 Nacos1.2 起所有版本客户端。
具体参考:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.html(FAQ)

一、服务端升级

1. 修改 Nginx 代理配置(nginx.conf)

说明:在1.1.4版本时,我们对 Nacos 服务端的协议进行了升级(即 http -> https),方式是通过 Nginx 进行代理转发,从 8848 转发到 8849 端口。而在 2.2.4 版本的 Nacos 中,新增了 gRPC 的通信方式,需要新增端口,因此这里在 nginx.conf 需要新增一些端口转发配置。
具体参考:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.html(新版本部署)

# 具体路径以实际为准,这里仅供参考
# 若不知道配置文件位置,可通过 history 或 find ./ -name "nginx.conf" 2> /dev/null 命令查找
# 备份配置文件
cp /home/appuser/nginx/conf/nginx.conf /home/appuser/nginx/conf/nginx.conf_20240114_bak# 修改配置文件
vim /home/appuser/nginx/conf/nginx.conf# 在 http{} 同层级下添加以下内容
stream {upstream nacos-tcp {# IP 与所在服务器需对应server 192.168.2.190:9849;}server {listen 9848;proxy_pass nacos-tcp;}
}# 检查配置修改是否正确
/home/appuser/nginx/sbin/nginx -t# 重新加载配置文件
/home/appuser/nginx/sbin/nginx -s reload
2. 执行SQL

Nacos 2.x 版本相比 Nacos 1.x 版本,数据结构有所变更,以下是相应 SQL 脚本:

注意:SQL 脚本需在新版本启动前执行,否则将启动报错

ALTER TABLE nacos_config.config_info ADD encrypted_data_key TEXT NOT NULL COMMENT '秘钥';
ALTER TABLE nacos_config.config_info_beta ADD encrypted_data_key TEXT NOT NULL COMMENT '秘钥';
ALTER TABLE nacos_config.his_config_info ADD encrypted_data_key TEXT NOT NULL COMMENT '秘钥';CREATE TABLE nacos_config.`permissions` (`role` varchar(50) NOT NULL,`resource` varchar(255) NOT NULL,`action` varchar(8) NOT NULL,UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
3. 修改配置文件

建议直接在本地修改好相应的配置文件之后,再压缩上传到服务器,避免配置文件修改不一致出现问题。

  • application.properties
    ### 服务端端口号
    server.port=8849### 使用数据库类型
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://192.168.2.193:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=root### 是否开启鉴权(这里暂时不开启,因为客户端是1.1.4,开启后将会导致服务注册不了)
    nacos.core.auth.enabled=false### 开启旧版本服务之间的鉴权方式,升级完成后关闭
    nacos.core.auth.enable.userAgentAuthWhite=true### 白名单授权,用于标识来自其他nacos服务器的请求。(根据需要自行修改,需要保证每台nacos服务器都是一样配置)
    nacos.core.auth.server.identity.key=identityRegexp
    nacos.core.auth.server.identity.value=identityRegexp### 用于生成accessToken的密钥(根据需要自行修改,需要保证每台nacos服务器都是一样配置)
    # 官方推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符
    nacos.core.auth.plugin.nacos.token.secret.key=aWRlbnRpdHlpZGVudGl0eWlkZW50aXR5aWRlbnRpdHlpZGVudGl0eQ==
    
  • cluster.conf
    192.168.2.190:8848
    192.168.2.191:8848
    192.168.2.192:8848
    
4. 升级服务端(依次升级)
## 上传安装包(可以通过rz命令或sftp上传)
rz## 解压缩
unzip nacos-2.2.4.zip -d /home/appuser## 停止旧服务
sh /home/appuser/nacos-1.1.4/bin/shutdown.sh## 启动新服务
sh /home/appuser/nacos-2.2.4/bin/startup.sh## 查看启动日志
tail -f /home/appuser/nacos-2.2.4/logs/start.out -n 10## 若观察到 mybatis-plus 图标,并没有报错,即启动成功
## 登录nacos页面(https://192.168.0.190:8848/nacos)查看是否正常

二、客户端升级

据我了解,客户端升级有两种方式:

  • 第一种:直接升级 Spring Boot、Spring Cloud、Spring Cloud Alibaba 版本
  • 第二种:升级 Nacos Client 版本,并重写源码

由于我们项目比较大 + 时间紧,第一种升级方式的风险比较大,故选择第二种方式。

1. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.2.4</version>
</dependency>
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-common</artifactId><version>2.2.4</version>
</dependency>
2. 添加配置

bootstrap.yml

spring:cloud:nacos:discovery:username: nacospassword: nacosconfig:username: nacospassword: nacoscontextPath: /nacos
3. 重写 Nacos 客户端源码

重写方式:在项目的 java 目录下新建需重写类所在的包路径,然后复制源码到该路径下并进行修改,比如:NacosDiscoveryProperties 类所在包路径为 com.alibaba.cloud.nacos,则在 java 目录下新建该包,然后复制源码
重写源码

  • NacosDiscoveryProperties.java

    public class NacosDiscoveryProperties {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Properties getNacosProperties() {properties.put(USERNAME, Objects.toString(username, ""));properties.put(PASSWORD, Objects.toString(password, ""));}
    }
    
  • NacosConfigProperties.java

    public class NacosConfigProperties {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Properties getConfigServiceProperties() {properties.put(USERNAME, Objects.toString(username, ""));properties.put(PASSWORD, Objects.toString(password, ""));}
    }
    

由于我们所用的 Nacos 使用的是 https 协议,所以还需要重写 ServerHttpAgent 和 NacosRestTemplate 以支持 SSL。

  • ServerHttpAgent.java

    public class ServerHttpAgent implements HttpAgent {public static final String HTTP = "http://";public static final String HTTPS = "https://";private static final boolean isSSL = ObjectUtils.isEmpty(System.getProperty("nacos.ssl.enable"))|| Boolean.parseBoolean(System.getProperty("nacos.ssl.enable"));static {if (isSSL) {try {TrustManager[] managers = new TrustManager[1];managers[0] = new TrustAllManager();SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, managers, null);HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier((urlHostName, session) -> true);} catch (Exception e) {LOGGER.error("trust all https certificates fail", e);}}}public static class TrustAllManager implements X509TrustManager {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}}private String getUrl(String serverAddr, String relativePath, boolean isSSL) {String contextPath = serverListMgr.getContentPath().startsWith("/") ?serverListMgr.getContentPath() : "/" + serverListMgr.getContentPath();String url = StringUtils.removeEnd(serverAddr, "/") + "/" + StringUtils.removeStart(contextPath, "/") + relativePath;if (isSSL && url.startsWith(HTTP)) {return HTTPS + StringUtils.removeStart(url, HTTP);} else {return url;}}
    }
    
  • NacosRestTemplate.java

    public class NacosRestTemplate extends AbstractNacosRestTemplate {private static final Logger LOGGER = LogUtils.logger(NacosRestTemplate.class);private static final boolean isSSL = ObjectUtils.isEmpty(System.getProperty("nacos.ssl.enable"))|| Boolean.parseBoolean(System.getProperty("nacos.ssl.enable"));static {if (isSSL) {try {TrustManager[] managers = new TrustManager[1];managers[0] = new ServerHttpAgent.TrustAllManager();SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, managers, null);HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier((urlHostName, session) -> true);} catch (Exception e) {LOGGER.error("trust all https certificates fail", e);}}}public static class TrustAllManager implements X509TrustManager {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}}
    }
    

三、服务端开启鉴权

# 编辑配置文件
vim /home/appuser/nacos-2.2.4/conf/application.conf# 找到以下行,将 false 修改为 true 即可,无需重启
nacos.core.auth.enabled=false

开启之后观察服务日志与 Nacos 日志是否正常

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

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

相关文章

[Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用

前面讲解了使用Helm部署mysql集群,这里来看看使用Ingress搭建负载均衡功能 1.介绍 功能类似 Nginx ,可以根据域名、路径把请求转发到不同的 Service , Ingress 为外部访问集群提供了一个 统一 入口, 避免 了 对外暴露集群端口 ,可以配置 https,http访问集群应用,接下来看看如…

2024年《一个项目征服Java中高级体系》博客计划

终于下决心来写一套大型的Java 笔记&#xff0c;不为别的&#xff0c;就是为了强迫自己将整个Java体系梳理清楚&#xff0c;让自己成为内功扎实的Java高级架构师。牛已经吹出来了&#xff0c;不做对不起网友&#xff01; 经过一个多月的持续规划&#xff0c;现在终于定好了整体…

8年老鸟,自动化测试经验,测试数据管理分析总结,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题&#xff1a;…

Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器

文章目录 1、理解Epoll和对应接口2、实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待&#xff0c;只要有一个就绪&#xff0c;就使用select/poll系统调用&#xff0c;让操作系统把所有文件遍历一遍&#xff0c;哪些就绪就加上哪些fd…

ssm基于VUE.js的在线教育系统论文

摘 要 随着学习压力越来越大&#xff0c;课外参加补习班的学生越来越多。现在大多数学生采用请家教、自学、报名补习班的方式进行课外的额外学习。请家教费用昂贵&#xff0c;自学效率低&#xff0c;碰到自己不会的知识不能及时得到解达&#xff0c;报名补习班需要时间、地点的…

x-cmd pkg | trash-cli - 类 Unix 系统的命令行垃圾桶

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trash-cli 是类 Unix 系统的命令行垃圾桶&#xff0c;用于移动文件到回收站&#xff0c;同时会记录文件的原地址和删除日期。 该工具使用与 GNOME、KDE ​​和 XFCE 等桌面环境相同的垃圾桶&#xff0c;所以即使是非 …

PVE虚拟机配置文件恢复

一、pve 创建的虚拟机的配置文件位置 在宿主机的 /etc/pve/qemu-server&#xff0c;这里有创建虚拟机的相关硬件信息。 rootpve1:/etc/pve/qemu-server# pwd /etc/pve/qemu-server二、故障现象 在命令行执行qm list不显示虚拟机&#xff0c;查看 宿主机的 /etc/pve/qemu-ser…

Codeforces Round 913 (Div. 3)E 不进位各数位和与打表

Problem - E - Codeforces digsum(a)digsum(b)digsum(c)digsum(n) 要点一&#xff1a; 当左边和发生进位&#xff0c;比如56 11&#xff0c;那么数位和会变小。其实下一位就是相加后对9取余&#xff0c;各数位和必定变小的。 要点二&#xff1a; 然后就是组合情况了&#x…

Echarts可视化-数据请求-代码实现和思路

需求&#xff1a;为前端可视化图表提供数据支持。 实现&#xff1a; 时间戳获取优化&#xff08;细化到秒&#xff09; 根据时间获取数据&#xff08;SQL编写&#xff09; 前端需求数据返回&#xff08;数据VO&#xff09; 内容 Apache ECharts 营业额统计 用户统计 订单…

搜维尔科技:【简报】元宇宙数字人赛道,《全息影像技术应用》!

期待着看展的主角来到今天要参观的全息影像展&#xff0c;平时就喜欢看展的她对于所谓的全息影像非常好奇&#xff0c;于是她带着期待的心情进入展内。进入展内的主角看到的是与之前完全不同的画展&#xff0c;每幅画看起来就像真的一样&#xff0c;充满好奇的她在展览的各处游…

【ONE·MySQL || 复合查询】

总言 主要内容&#xff1a;主要介绍一些复杂的查询&#xff0c;涉及多表查询、交叉连接、内连接、外连接、子查询、合并查询等。       文章目录 总言1、基本查询回顾1.0、博文说明1.1、一些例题1.1.1、查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的…

Python爬虫|使用urllib获取百度首页源码

在这个博客中&#xff0c;我们将一起探索百度首页的源码&#xff0c;深入了解从URL请求到页面呈现的全过程。我们将使用Python的urllib.request库来模拟浏览器发送请求&#xff0c;并解码响应中的页面源码。通过分析源码&#xff0c;我们将揭示网页的结构、内容和背后的工作原理…

【Redis】AOF 源码

在上篇, 我们已经从使用 / 机制 / AOF 过程中涉及的辅助功能等方面简单了解了 Redis AOF。 这篇将从源码的形式, 进行深入的了解。 1 Redis 整个 AOF 主要功能 Redis 的 AOF 功能概括起来就 2 个功能 AOF 同步: 将客户端发送的变更命令, 保存到 AOF 文件中AOF 重写: 随着 Red…

电脑重置网络后连不上网了怎么办

一般电脑重置网络后都会自动重新下载好网络配置&#xff0c;但是不免会出现一些意外&#xff0c;接下来就我遇到的重置后无法联网的解决方案 做一个分享&#xff1a; 1、按下“winR”打开运行输入 services.msc 。 2、找到 WLAN AutoConfig 和 Wired AutoConfig 服务&#xff…

如何安装Python

Python是一种流行的编程语言&#xff0c;拥有广泛的应用领域。为了开始使用Python&#xff0c;首先需要在计算机上安装Python解释器。在本文中&#xff0c;我们将介绍如何安装Python以及一些常见的安装步骤。 1. 下载Python 首先&#xff0c;你需要前往Python官方网站&#xf…

第 9 章 哈希表

文章目录 9.1 哈希表(散列)-Google 上机题9.2 哈希表的基本介绍9.3 google 公司的一个上机题: 9.1 哈希表(散列)-Google 上机题 看一个实际需求&#xff0c;google 公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员…

软件测试|PyQt5实战教程(一)安装与环境配置

简介 我们之前介绍过使用tkinter创建图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;现在我们来介绍另外一个用于创建GUI的神器——pyQt5&#xff0c;它可以用于创建跨平台的桌面应用程序。PyQt5 实现了一个 Python模块集&#xff0c;有 620 个类&#xff0c;60…

乐意购项目前端开发 #1

一、创建vue项目 1. vue create 项目名 2. 运行项目 npm install npm run dev3.使用Git管理项目 创建远程仓库 leyigou 在项目文件终端执行以下代码 git init # git 初始化#这个要使用自己的仓库 git remote add origin gitgitee.com:xie-weijia/leyigou.git # 添加远程仓…

[Docker] 基本名词

镜像(iamge)&#xff1a; Docker 镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c; 容器&#xff08;container&#xff09;: Docker利用容器技术&#xff0c;独立运行一个或则多个应用&#xff0c;通过镜像来创建的。 启动&#xff0c;停止&a…

docker应用:vocechat

简介&#xff1a;VoceChat是一款超轻量级的Rust聊天应用程序、API和SDK&#xff0c;优先考虑私人托管。使用VoceChat建立您自己的聊天功能&#xff01;作为一款非常好用的通讯应用程序&#xff0c;它可以让你与朋友、家人和同事进行即时消息聊天&#xff0c;支持图片视频的分享…