帝国cms登录网站,专业网站开发公司,有哪些好的网站制作公司,南昌商城网站建设背景
由于原来使用的 Nacos 版本#xff08;1.1.4#xff09;存在安全漏洞#xff0c;需要进行升级修复。经过查询后#xff0c;决定将版本升级到2.2.4。
Nacos 服务共有三个#xff1a;
192.168.2.190:8848192.168.2.191:8848192.168.2.192:8848
步骤
服务端升级1.1.4存在安全漏洞需要进行升级修复。经过查询后决定将版本升级到2.2.4。
Nacos 服务共有三个
192.168.2.190:8848192.168.2.191:8848192.168.2.192:8848
步骤
服务端升级不开鉴权客户端升级服务端开启鉴权 说明服务端升级到 2.2.4 版本如果不需要开启鉴权则客户端可以不升级因为配置中心兼容支持 Nacos1.0 起的所有版本客户端服务发现兼容 Nacos1.2 起所有版本客户端。 具体参考https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-compatibility.htmlFAQ 一、服务端升级
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 reload2. 执行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.port8849### 使用数据库类型
spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://192.168.2.193:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC
db.user.0root
db.password.0root### 是否开启鉴权这里暂时不开启因为客户端是1.1.4开启后将会导致服务注册不了
nacos.core.auth.enabledfalse### 开启旧版本服务之间的鉴权方式升级完成后关闭
nacos.core.auth.enable.userAgentAuthWhitetrue### 白名单授权用于标识来自其他nacos服务器的请求。根据需要自行修改需要保证每台nacos服务器都是一样配置
nacos.core.auth.server.identity.keyidentityRegexp
nacos.core.auth.server.identity.valueidentityRegexp### 用于生成accessToken的密钥根据需要自行修改需要保证每台nacos服务器都是一样配置
# 官方推荐将配置项设置为Base64编码的字符串且原始密钥长度不得低于32字符
nacos.core.auth.plugin.nacos.token.secret.keyaWRlbnRpdHlpZGVudGl0eWlkZW50aXR5aWRlbnRpdHlpZGVudGl0eQcluster.conf192.168.2.190:8848
192.168.2.191:8848
192.168.2.192:88484. 升级服务端依次升级
## 上传安装包可以通过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. 添加依赖
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdexclusionsexclusiongroupIdcom.alibaba.nacos/groupIdartifactIdnacos-client/artifactId/exclusion/exclusions
/dependency
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactIdexclusionsexclusiongroupIdcom.alibaba.nacos/groupIdartifactIdnacos-client/artifactId/exclusion/exclusions
/dependency
dependencygroupIdcom.alibaba.nacos/groupIdartifactIdnacos-client/artifactIdversion2.2.4/version
/dependency
dependencygroupIdcom.alibaba.nacos/groupIdartifactIdnacos-common/artifactIdversion2.2.4/version
/dependency2. 添加配置
bootstrap.yml
spring:cloud:nacos:discovery:username: nacospassword: nacosconfig:username: nacospassword: nacoscontextPath: /nacos3. 重写 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.enabledfalse开启之后观察服务日志与 Nacos 日志是否正常