nacos源码修改持久化到postgreSQL数据库

很多业务场景,业务功能必须用pg数据库,这时候注册中心如果用mysql的话,显得浪费资源,基于此,nacos源码修改持久化到postgreSQL数据库是一个必然需求,此处我们修改为只支持pg数据库,2.4版本的源码。

源码拉取和编译参考:前置内容

1、修改配置文件

修改console和nacos-distribution模块中的application.properties配置文件,内容如下:

spring.sql.init.platform=postgresql
db.num=1
db.url.0=jdbc:postgresql://14.xx.78.188:5432/nacos
db.user.0=postgres
db.password.0=123456

2、修改pom文件

#nacos-all中添加依赖
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version>
</dependency>#naming模块中添加依赖:
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId>
</dependency>#config模块中添加依赖:
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId>
</dependency>

3、修改驱动加载相关类

ExternalDataSourceProperties.java 中的方法修改为:

private static final String JDBC_DRIVER_NAME = "org.postgresql.Driver";List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {List<HikariDataSource> dataSources = new ArrayList<>();Binder.get(environment).bind("db", Bindable.ofInstance(this));Preconditions.checkArgument(Objects.nonNull(num), "db.num is null");Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");for (int index = 0; index < num; index++) {int currentSize = index + 1;Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);//修改如下if (StringUtils.isEmpty(poolProperties.getDataSource().getDriverClassName())) {String driverClassName = JDBC_DRIVER_NAME;if ("postgresql".equals(EnvUtil.getProperty("spring.datasource.platform"))) {driverClassName = "org.postgresql.Driver";poolProperties.setDriverClassName(driverClassName);}}poolProperties.setJdbcUrl(url.get(index).trim());poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());HikariDataSource ds = poolProperties.getDataSource();if (StringUtils.isEmpty(ds.getConnectionTestQuery())) {ds.setConnectionTestQuery(TEST_QUERY);}dataSources.add(ds);callback.accept(ds);}Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");return dataSources;}
ExternalDataSourceServiceImpl.java 和 
LocalDataSourceServiceImpl.java 类中修改:
private String dataSourceType = "postgresql";

 

4、配置中心数据加载配置

MapperManager.java 类中方法的修改
public <R extends Mapper> R findMapper(String dataSource, String tableName) {if (LOGGER.isDebugEnabled()) {LOGGER.debug("[MapperManager] findMapper dataSource: {}, tableName: {}", dataSource, tableName);}if (StringUtils.isBlank(dataSource) || StringUtils.isBlank(tableName)) {throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE, "dataSource or tableName is null");}Map<String, Mapper> mysql = MAPPER_SPI_MAP.get("mysql");MAPPER_SPI_MAP.put("postgresql", mysql);//添加pg数据库注册中心的表结构Map<String, Mapper> tableMapper = MAPPER_SPI_MAP.get(dataSource);if (Objects.isNull(tableMapper)) {throw new NacosRuntimeException(FIND_DATASOURCE_ERROR_CODE,"[MapperManager] Failed to find the datasource,dataSource:" + dataSource);}Mapper mapper = tableMapper.get(tableName);if (Objects.isNull(mapper)) {throw new NacosRuntimeException(FIND_TABLE_ERROR_CODE,"[MapperManager] Failed to find the table ,tableName:" + tableName);}if (dataSourceLogEnable) {return MapperProxy.createSingleProxy(mapper);}return (R) mapper;}

5、所有limit ?,? 替换为 offset ? limit ? 以支持pg

WhereBuilder.java中修改:
    public WhereBuilder limit(int startRow, int pageSize) {where.append(" OFFSET ").append(startRow).append(" LIMIT ")//注意要有空格.append(pageSize);return this;}

另外,修改mysql目录下的文件:

 举例:ConfigInfoMapperByMySql.java 

   @Overridepublic MapperResult findConfigInfoByAppFetchRows(MapperContext context) {final String appName = (String) context.getWhereParameter(FieldConstant.APP_NAME);final String tenantId = (String) context.getWhereParameter(FieldConstant.TENANT_ID);String sql = "SELECT id,data_id,group_id,tenant_id,app_name,content FROM config_info"+ " WHERE tenant_id LIKE ? AND app_name= ?" + " OFFSET " + context.getStartRow() + " LIMIT "+ context.getPageSize();return new MapperResult(sql, CollectionUtils.list(tenantId, appName));}

其他类依次修改完成即可。 

注意: LIMIT 左右要有空格!

6、nacos 表结构导入pg

方案一:通过navicat 15以上版本,工具--数据传输,把mysql数据库中nacos的表结构和数据导入到pg库中:

成功之后,再pg库添加主键序列,比如:

CREATE SEQUENCE config_info_id_seq START WITH 1;
ALTER TABLE config_info ALTER COLUMN id SET DEFAULT nextval('config_info_id_seq');CREATE SEQUENCE config_info_aggr_id_seq START WITH 18;
ALTER TABLE config_info_aggr ALTER COLUMN id SET DEFAULT nextval('config_info_aggr_id_seq');CREATE SEQUENCE config_info_tag_id_seq START WITH 18;
ALTER TABLE config_info_tag ALTER COLUMN id SET DEFAULT nextval('config_info_tag_id_seq');CREATE SEQUENCE config_tags_relation_id_seq START WITH 18;
ALTER TABLE config_tags_relation ALTER COLUMN id SET DEFAULT nextval('config_tags_relation_id_seq');CREATE SEQUENCE group_capacity_id_seq START WITH 18;
ALTER TABLE group_capacity ALTER COLUMN id SET DEFAULT nextval('group_capacity_id_seq');CREATE SEQUENCE his_config_info_nid_seq START WITH 1;
ALTER TABLE his_config_info ALTER COLUMN id SET DEFAULT nextval('his_config_info_nid_seq');CREATE SEQUENCE permissions_id_seq START WITH 18;
ALTER TABLE permissions ALTER COLUMN id SET DEFAULT nextval('permissions_id_seq');CREATE SEQUENCE roles_id_seq START WITH 18;
ALTER TABLE roles ALTER COLUMN id SET DEFAULT nextval('roles_id_seq');CREATE SEQUENCE tenant_capacity_id_seq START WITH 18;
ALTER TABLE tenant_capacity ALTER COLUMN id SET DEFAULT nextval('tenant_capacity_id_seq');CREATE SEQUENCE tenant_info_id_seq START WITH 18;
ALTER TABLE tenant_info ALTER COLUMN id SET DEFAULT nextval('tenant_info_id_seq');

数据不全,可以自行补充序列。

7、修改后的源码编译打包

         mvn -Prelease-nacos clean install -U -DskipTests

打包成功

 

8、应用程序启动nacos

nacos-distribution 目录下找到 nacos-server-2.4.2.zip 文件

此包解压缩在win或者Linux环境 就可以启动了,比如在win环境启动:在bin目录下创建执行脚本

yd-startup.bat

startup.cmd -m standalone

其实执行命令也行。 此时访问 http://localhost:8848/nacos/ 没有进入登录页面,即没有鉴权,不安全,如果需要鉴权关闭服务,修改配置。

9、开启鉴权配置

修改console和nacos-distribution模块中的application.properties配置文件


### If turn on auth system: 修改
nacos.core.auth.enabled=true### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version. 修改
nacos.core.auth.enable.userAgentAuthWhite=true### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.修改
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 string):放开
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123678901234567890123456789
#nacos.core.auth.plugin.nacos.token.secret.key=

然后再启动后就进入登录页面。

10、用户表结构修改

创建用户时失败:

原因是:代码里标识参数是bool类型,而数据库表结构里是int2类型,说明是数据表结构传输过程出错了,

 

修改方案sql:

ALTER TABLE users
ALTER COLUMN enabled 
TYPE BOOLEAN 
USING CASE WHEN enabled = 1 THEN TRUE ELSE FALSE 
END;

到此,nacos源码修改持久化到postgreSQL数据库分享完成,当然持久到pg还有其他方案,后期可以分享nacos同时支持多种数据库,敬请期待!

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

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

相关文章

无感升级有三种常见的可行性方案:蓝绿部署、灰度发布、和滚动更新

A. 蓝绿部署 1. 前端 打包与部署: 构建前端: 使用构建工具(如 Webpack、Gulp)对前端项目进行打包。运行命令,例如: npm run build确保生成的文件有版本号或哈希,以防止缓存问题。上传静态文件: 将打包后的文件上传到绿色环境的路径(如 /var/www/html/v2)。示例: s…

Java知识巩固(一)

AOT有什么优点&#xff1f;为什么不全部使用AOT呢&#xff1f; JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation) 。和 JIT 不同的是&#xff0c;这种编译模式会在程序被执行前就将其编译成机器码&#xff0c;属于静态编译&#xff08;C、 C&#xff0c;Rust&…

网络安全社区和论坛

目录 国内网络安全社区和论坛 国外网络安全社区和论坛 ​​​​​​​国内网络安全社区和论坛 FreeBuf 网址&#xff1a;FreeBuf网络安全行业门户简介&#xff1a;网络安全行业门户网站&#xff0c;提供最新的安全资讯、漏洞信息、安全工具及教程等。 先知社区 网址&…

Java基础:字符串详解

1 深入解读String类源码 1.1 String类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { }String类是final的&#xff0c;意味着它不能被子类继承&#xff1b;String 类实现了Serializable接口&#xff0c;意味着…

界星空科技漆包线行业称重系统

万界星空科技为漆包线行业提供的称重系统是其MES制造执行系统解决方案中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、系统概述 万界星空科技漆包线行业称重系统&#xff0c;是集成在MES系统中的一个功能模块&#xff0c;专门用于漆包线生产过程中的重量检…

【科普】什么是架构和框架?两者之间有什么区别?

架构 (Architecture) 定义&#xff1a; 架构是系统或项目的高层设计和结构&#xff0c;描述了组件之间的关系和交互方式。它通常涉及到整体的设计理念、原则和决策。 特点&#xff1a; 包括系统的整体布局、模块划分、数据流以及各个部分如何相互作用。通常是为了满足特定需求…

LabVIEW惯性导航系统仿真平台

LabVIEW开发捷联惯性导航系统仿真平台&#xff0c;采用模块化设计&#xff0c;利用LabVIEW的图形化编程特性&#xff0c;提高了系统仿真的效率和精度&#xff0c;同时具备良好的可扩展性和用户交互性。 项目背景 当前&#xff0c;惯性导航系统&#xff08;INS&#xff09;的研…

解决 GPTQ 模型导入后推理生成 Tokens 速度很慢的问题(从源码重新安装 Auto-GPTQ)

这里解决的是使用 Auto-GPTQ 或者 Transformers 导入 GPTQ 模型后推理速度很慢的问题。 值得注意的是&#xff0c;这个问题很有可能是因为安装不正确&#xff0c;所以 GPTQ 无法正确使用 GPU 进行推理&#xff0c;也就是说无法进行加速&#xff0c;即便 print(model.device) 显…

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。

【深度学习基础模型】液态状态机&#xff08;Liquid State Machines, LSM&#xff09;详细理解并附实现代码。 【深度学习基础模型】液态状态机&#xff08;Liquid State Machines, LSM&#xff09;详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机&#xff0…

【浏览器】HTTP 状态码

HTTP 状态码 HTTP 状态码用于表示服务器对请求的响应状态&#xff0c;分为 5 类&#xff0c;每一类的状态码代表不同的响应类型&#xff1a; 1. 1xx 信息性响应 表示请求已接收&#xff0c;服务器继续处理。 100 Continue&#xff1a;客户端应继续请求操作&#xff0c;服务…

嵌入式硬件设计知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

146. LRU 缓存【 力扣(LeetCode) 】

零、原题链接 146. LRU 缓存 一、题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff…

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来&#xff0c;使得用户可以单独处理或重混音频&#xff0c;创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具&#xff0c;这一过程往往会比较困难。…

python3的语法

知识简介 基础语法就像比赛规则&#xff0c;比如比赛跑步&#xff0c;咱们不能跑到别人的跑道去吧&#xff0c;比赛打拳&#xff0c;先说好不能踢裆。 正文 一、python3的基础语法 1、编码 python的源码文件.py一般是utf8编码的&#xff0c;有时候咱们在执行源码文件的时候报…

单片机原理及其应用:新手快速入门

单片机&#xff08;Microcontroller&#xff0c;简称 MCU&#xff09;是一种广泛应用于嵌入式系统中的微型计算机。对于初学者来说&#xff0c;了解单片机的基本原理及其在日常生活中的应用是入门嵌入式开发的第一步。本篇博客将从单片机的基本概念开始&#xff0c;带领大家逐步…

latex本地运行(MiKTeX+VScode)-20241006

1、安装 LaTex 主流的分发版本应该就是 TeXLive 和 MikTeX 了,这里使用 MikTex(只有几百M)—— TeXLive 太大了、默认安装全部包,可选自选部分安装单实在有些许麻烦,MikTeX 则方便得多,需要的时候可以自动安装全部包 点击跳转到 MiKTeX 官网,直接下载即可:不用担心什…

超越单线程:Web Worker 在前端性能中的角色

在当今快速发展的数字时代&#xff0c;用户对网页性能的期待已经达到了前所未有的高度&#xff0c;想象一下&#xff0c;当你打开一个网站&#xff0c;瞬间加载、流畅操作&#xff0c;没有任何卡顿和延迟&#xff0c;这种体验无疑会让你倍感惊喜。然而在前端开发中&#xff0c;…

【WKWebview】WKWebView Cookie 同步

个人实测&#xff1a;js注入的方式更靠谱一点 ⌈iOS⌋WKWebView Cookie 同步的一种方式 屈服于 Apple 的“淫威”&#xff0c;开发者不得不将 App 的网页容器从 UIWebView 迁移到 WKWebView。我们在享受后者带来的性能和功能提升的同时&#xff0c;也被诸如 Cookie 同步、截图…

Unity3D Shader的阴影部分法线效果详解

在Unity3D开发中&#xff0c;阴影处理是提升场景真实感和视觉质量的重要一环。法线贴图&#xff08;Normal Mapping&#xff09;作为一种高效的纹理映射技术&#xff0c;在增强模型表面细节和凹凸感方面扮演着重要角色。本文将详细解析UnityShader中阴影部分的法线效果&#xf…

【fastjson】json对象格式化打印

为了让日志打印时以格式化的JSON输出,你可以将input.toJSONString()调用改为使用格式化输出的方式。FastJSON库的toJSONString方法支持格式化输出,你可以传入true参数实现这一点。具体修改如下:关键要用JSONObject.toJSONString 来实现:toJSONString(true) 会把true作为对象…