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

news2025/2/25 20:33:15

在这里插入图片描述

背景

由于原来使用的 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: nacos
                password: nacos
            config:
                username: nacos
                password: nacos
                contextPath: /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 {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
            }
            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
            }
            @Override
            public 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 {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
            }
            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
            }
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
    }
    

三、服务端开启鉴权

# 编辑配置文件
vim /home/appuser/nacos-2.2.4/conf/application.conf

# 找到以下行,将 false 修改为 true 即可,无需重启
nacos.core.auth.enabled=false

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

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

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

相关文章

宝塔安装redis并且远程连接redis教程

第一步&#xff1a;搜索redis并安装 第二步&#xff1a;在防火墙添加端口6379 第三步&#xff1a;查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步&#xff1a;开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…

SLAM第十四讲

基础知识 四元数 先将三维空间的点p(x,y,z) 变成四元数的表示q(0,x,y,z) 其中0为四元数的实部&#xff0c;x,y,z为四元数的虚部。 实部为0的四元数也叫纯虚四元数。 通过 左乘四元数&#xff…

Vue3项目引入canvaskit-wasm库(skia库的wasm版)

1 安装canvaskit-wasm npm install canvaskit-wasm 或者 yarn add canvaskit-wasm 2 将文件node_modules/canvaskit-wasm/bin/canvaskit.wasm复制到public目录 3 引入到组件中 <template><img :src"imgData"/> </template><script setup>…

Redis命令 - Sets命令组常用命令

Set集合&#xff0c;无序&#xff0c;一堆不重复值的组合。利用redis提供的set数据结构&#xff0c;可以存储一些集合性的数据。 使用场景&#xff1a;例如&#xff0c;实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …

顺序表实现(下)(C语言)

几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表二、创建顺序表并初始化三.删除非递减顺序表L中的重复元素四.在非递减顺序表中删除[s,t]之间的元素五.设计算法逆置顺序表L,并将序列L循环左移六.顺序表A和B的元素个数分别为m,n.A表升序排序,B表降序排序,两表中…

四、Qt 的第一个demo

在上一篇章节里《三、Qt Creator 使用》&#xff0c;我们介绍了如何使用Qt Creator创建一个简单的带窗体的demo&#xff0c;在这一章节里&#xff0c;我们详细讲解一下这个demo的文件组成&#xff0c;及主函数&#xff0c;并在UI上加一些控件&#xff0c;实现一些简单的功能。 …

SDRAM小项目——写模块

写模块跟着视频看了一个多星期&#xff0c;一开始始终有点弄不清楚&#xff0c;现在记录一下理解的过程。 阅读文档信息&#xff1a; 首先阅读文档信息&#xff0c;了解SDRAM写过程的状态转换和时序图 SDRAM整体状态流程如图所示&#xff1a; 在SDRAM整体系统中&#xff0c…

谈⼀谈你对TCPIP四层模型,OSI七层模型的理解

TCP/IP四层模型 对比 OSI七层模型 OSI七层模型 为了增强通⽤性和兼容性&#xff0c;计算机⽹络都被设计成层次机构&#xff0c;每⼀层都遵守⼀定的规则。因此有了OSI这样⼀个抽象的⽹络通信参考模型&#xff0c;按照这个标准使计算机⽹络系统可以互相连接 物理层 通过⽹线、光…

南京观海微电子----时序分析基本概念(一)——建立时间

1. 概念的理解 以上升沿锁存为例&#xff0c;建立时间&#xff08;Tsu&#xff09;是指在时钟翻转之前输入的数据D必须保持稳定的时间。如下图所示&#xff0c;一个数据要在上升沿被锁存&#xff0c;那么这个数据就要在时钟上升沿的建立时间内保持稳定。 建立时间是对触发器而…

Akira勒索软件团伙及其策略的全面解析

Sophos MDR威胁情报团队曾于2023年5月发表过一篇博文&#xff0c;称Akira勒索软件“将1988年的时光带回”。起因是Akira会将受害者网站篡改为具有复古美学的页面&#xff0c;让人想起20世纪80年代的绿色屏幕控制台。而且&#xff0c;Akira的名字也可能取自1988年流行的同名动画…

HCIA的访问控制列表ACL

ACL&#xff1a;访问控制列表 -----控制列表&#xff08;策略列表&#xff09; 功能&#xff1a; 1&#xff1a;定义感兴趣的路由&#xff08;控制层面&#xff09; 可以定义感兴趣的路由&#xff0c;可以把感兴趣的路由抓取出来&#xff0c;给它做过滤&#xff0c;也可以改变…

polar CTF CB链

一、题目 二、解答 1、通过jar包&#xff0c;可以看到/user路由下有反序列化操作 看到存在commons-beanutils依赖且版本为1.9.2&#xff0c;可利用CB链Getshell。 使用ysoserial项目中的CommonsBeanutils1链写一个POC&#xff0c;注意确保ysoserial项目中的pom.xml中的comm…

寡年是否适合结婚?寡妇年结婚有什么禁忌吗?让程序来告诉你有多少人是寡妇年结婚的。

什么是寡年&#xff1f; 百度百科 原文&#xff1a;寡年-百度百科 指整年没有“立春”的日子就是“盲年”&#xff0c;俗称寡年。又名滑头年 社会上流传的“寡妇年”&#xff0c;是指整个农历年都没有立春的年份。以农历2005年的鸡年为例&#xff0c;立春在公历2月4日&…

Rust-内存安全

堆和栈 一个进程在执行的时候&#xff0c;它所占用的内存的虚拟地址空间一般被分割成好几个区域&#xff0c;我们称为“段”(Segment)。常见的几个段如下。 代码段。编译后的机器码存在的区域。一般这个段是只读的。bss段。存放未初始化的全局变量和静态变量的区域。数据段。…

java: 5-6 break

文章目录 1. break1.1 介绍1.2 语法和流程图1.3 入门练习1.4 细节说明1.5 练习 【老韩视频p137-】 1. break 看个需求&#xff1a;随机生成 1-100 的一个数&#xff0c;直到生成了 97 这个数&#xff0c;看看你一共用了几次? 【思路分析:循环&#xff0c;但是循环的次数不知道…

NLP论文阅读记录 - 2022 W0S | 基于Longformer和Transformer的提取摘要层次表示模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Hierarchical Representation Model Based on Longformer and …

【模型评估 04】A/B测试的陷阱

互联网公司中&#xff0c;A/B测试是验证新模块、新功能、新产品是否有效&#xff1b;新算法、新模型的效果是否有提升&#xff1b;新设计是否受到用户欢迎&#xff1b;新更改是否影响用户体验的主要测试方法。在机器学习领域中&#xff0c;A/B测试是验证模型最终效果的主要手段…

知乎x-zse-96算法分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析过程,以及一些重要点的记录,没有…

yolov5的完整部署(适合新人和懒人,一键安装)

第一步&#xff1a;安装Anaconda 下载并安装后&#xff0c;配置一下镜像 在这里面&#xff0c;看情况输入镜像源&#xff0c;这里我建议大家搞阿里云镜像源。 # 添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda conf…

零知识证明的最新发展和应用

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 当企业收集大量客户数据去审查、改进产品和服务以及将数据资产货币化时&#xff0c;他们容易受到网络攻击威胁&#xff0c;造成数…