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

news2024/12/24 8:55:44

很多业务场景,业务功能必须用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 

   @Override
    public 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.coloradmin.cn/o/2202862.html

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

相关文章

文献阅读Prov-GigaPath模型--相关知识点罗列

文章链接&#xff1a;A whole-slide foundation model for digital pathology from real-world data | NatureDigital pathology poses unique computational challenges, as a standard gigapixel slide may comprise tens of thousands of image tiles1–3. Prior models hav…

联软安全助手卸载 UniAccess Agent,最简单的方法,两步解决!!!

背景&#xff1a; 前段时间因为业务需要安装了这个可恶的安全助手&#xff0c;然后发现卸载不掉&#xff0c;找了网上很多的方法&#xff0c;比如经典的方案一、方案二那个文章&#xff0c;禁用服务根本禁不掉&#xff0c;过两三秒他自己就会把禁用状态改为自动状态&#xff0…

OpenCSG传神社区月度功能更新

9月社区ReleaseNote 在9月的社区更新中&#xff0c;我们继续秉持开放与创新的精神&#xff0c;推出了一系列新功能和技术升级。这些更新不仅扩展了社区的技术支持范围&#xff0c;还为用户提供了更多资源&#xff0c;助力其在人工智能、大数据处理和推理加速等领域的创新。通过…

老男孩mysql系列 1_Mysql 8.0常规安装

1. MySQL安装准备 选择安装的MySQL版本首先判断是否要和公司其他已经安装好的MySQL保持版本一致如果没有上述要求&#xff0c;则一般会安装最新版本&#xff08;目前是5.7&#xff09;如果不是实验新功能性质&#xff0c;则不要选择development release&#xff0c;而要安装Gen…

nuScenes里的目标物体的速度是如何获取的

nuScenes的那些标注文件里并没有标注记录物体的速度数据&#xff0c;而是读取标注数据后根据sample_annotation.json里目标在前后帧里的translation数据相减除以时间差获得x、y、z方向的三个速度分量(Vx,Vy,Vz)的&#xff0c;一版只使用了Vx和Vy&#xff0c;具体实现代码在nusc…

20241007给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot时使用ADB

20241007给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot时使用ADB 2024/10/7 17:35 缘起&#xff1a;由于荣品RD-RK3588-AHD开发板使用的是9针的USB-A口&#xff0c;没有使用EVB4默认的type C口。 因此需要拿掉fusb302的驱动/DTS配置部分。 同时&#xff0c;为了简单起见…

腾讯云实时音视频 SDK(TRTC SDK)相关

实时音视频 SDK&#xff08;TRTC SDK&#xff09; 的 RoomID 是什么&#xff1f;取值区间值是多少&#xff1f; RoomID 即房间号&#xff0c;用于唯一标识一个房间。房间号取值区间为1 - 4294967295&#xff0c;由开发者自行维护和分配。 实时音视频 SDK&#xff08;TRTC SDK…

国产工具链GCKontrol-GCAir助力控制律开发快速验证

前言 随着航空领域技术的不断发展&#xff0c;飞机的飞行品质评估和优化成为了航空领域的一个重要任务&#xff0c;为了确保飞行器在各种复杂条件下的稳定性&#xff0c;控制律设计过程中的模型和数据验证需要大量仿真和测试。 本文将探讨基于世冠科技的国产软件工具链GCKont…

Java面试宝典-Java集合01

Java面试宝典-Java集合01 目录 Java面试宝典-Java集合01 1、Java中常用的集合有哪些&#xff1f; 2、Collection 和 Collections 有什么区别&#xff1f; 3、为什么集合类没有实现 Cloneable 和 Serializable 接口&#xff1f; 4、数组和集合有什么本质区别&#xff1f; 5、数组…

flutter 一段长文本实现检索功能,检索的文本加粗标红

先来看效果 做这个功能的原因&#xff0c;因为日志比较长&#xff0c;内容很多&#xff0c;找起来非常不方便 只是简单的加粗标红的话&#xff0c;用TextSpan自己也可以做&#xff0c;主要日志还涉及选择复制&#xff0c;涉及的东西很多&#xff0c;想到了 extended_text&…

基于Python的摄影平台交流系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

美团Java一面

美团Java一面 9.24一面&#xff0c;已经寄了 收到的第一个面试&#xff0c;表现很不好 spring bean生命周期 作用域&#xff08;忘完了&#xff09; 为什么用redis缓存 redis和数据库的缓存一致性问题 redis集群下缓存更新不一致问题 aop说一下 arraylist和linkedlist 数据库的…

H264重点笔记记录

H264格式 目前视频中的H.264流行的NALU包装方式有两种&#xff0c;一种叫做annexB&#xff0c;一种叫做avcC。对于这两种格式&#xff0c;不同的厂商支持程度也不太一样&#xff0c;例如&#xff0c;Android硬解码MediaCodec只接受annexB格式的数据&#xff0c;而Apple的Video…

AI绘画,AI生成图片

分享一个可以免费使用的AI生成图片的网站&#xff1a; https://openart.aihttps://openart.ai/create 1、登陆后点击右上角create 2、在创建页面左侧输入描述文案&#xff0c;下面调整生成图片张数&#xff0c;点击create&#xff0c;右边即可生成 我这里输入了在吃麦当劳的超…

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…

社交媒体对人际关系的影响:Facebook的案例分析

随着社交媒体的快速发展&#xff0c;人们的沟通方式和人际关系发生了深刻变化。作为全球最大的社交网络之一&#xff0c;Facebook在这一进程中扮演了重要角色。本文将分析Facebook如何影响人际关系&#xff0c;包括沟通方式的转变、情感连接的变化以及社交互动的质量。 1. 沟通…

echarts的option,设置折线图鼠标悬浮显示数据

在series平级位置加代码 效果看起来还不错

深度学习:词嵌入embedding和Word2Vec模型

目录 前言 一、词嵌入&#xff08;Embedding&#xff09; 1.传统自然语言处理问题 2.什么是词嵌入 3.主要特点 二、Word2vec模型 1.连续词袋模型&#xff08;CBOW&#xff09; 2.跳字模型&#xff08;Skip-gram&#xff09; 三、CBOW模型训练过程 前言 在机器学习里的…

包材推荐中的算法应用|得物技术

目录 一、业务背景 二、算法架构 规则算法 三、算法原理 装箱装袋 四、衍生应用 切箱合包箱型设计包装方案推荐 五、作者结语 一、业务背景 任何一家电商的商品出库场景中&#xff0c;都涉及到打包——即把订单中的商品用包材进行包裹&#xff0c;常见的打包方式有装袋和装箱。…

Lazada该怎么直播?开播需要有哪些条件?

随着电商平台的快速发展&#xff0c;直播电商已成为一种重要的销售和营销手段。作为东南亚领先的电商平台之一&#xff0c;Lazada也提供了直播功能——LazLive&#xff0c;使商家和品牌能够通过直播与消费者进行实时互动&#xff0c;推广产品并提升销量。要在Lazada上顺利进行直…