• Nacos - 支持PostgreSQL


    1、背景

    Nacos 官方仅支持 MySQL,故需要自己魔改一下。

    2、下载源码

    源码下载地址:

    GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.

    官网教程地址:

    https://nacos.io/zh-cn/docs/qui

    3、源码修改

    3.1  引入PostgreSQL驱动

    nacos-all中添加依赖

    1. <dependency>
    2. <groupId>org.postgresql</groupId>
    3. <artifactId>postgresql</artifactId>
    4. <version>42.2.20</version>
    5. </dependency>

    nacos-config下的pom.xml

    1. <!--postgresql libs-->
    2. <dependency>
    3. <groupId>org.postgresql</groupId>
    4. <artifactId>postgresql</artifactId>
    5. </dependency>

    3.2 修改数据库配置

    nacos-consloe下的application.properties

    1. # 是否使用外置数据库,直接mysql就等于是使用外置数据库,使用什么数据库则由db.jdbcDriverName决定
    2. spring.datasource.platform=mysql
    3. ### Count of DB:
    4. db.num=1
    5. # 新增的配置项,指定数据库驱动
    6. db.jdbcDriverName=org.postgresql.Driver
    7. db.url.0=jdbc:postgresql://localhost:5432/nacos
    8. db.user.0=postgres
    9. db.password.0=postgres

    3.3 修改com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties

    可通过配置文件指定数据库驱动。

    类中新增对应配置文件中的字段和set方法。

    1. private String jdbcDriverName;
    2. public void setJdbcDriverName(String jdbcDriverName) {
    3. this.jdbcDriverName = jdbcDriverName;
    4. }

    对List build(Environment environment, Callback callback)方法进行修改

    1. List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
    2. // ...
    3. for (int index = 0; index < num; index++) {
    4. // ...
    5. if (StringUtils.isNotEmpty(jdbcDriverName)) {
    6. // 增加对postgresql数据库的支持
    7. poolProperties.setDriverClassName(jdbcDriverName);
    8. } else {
    9. // 默认使用mysql驱动
    10. poolProperties.setDriverClassName(JDBC_DRIVER_NAME);
    11. }
    12. // ...
    13. }
    14. // ...
    15. }

    3.4 修改com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl

    修改addConfigInfoAtomic方法。

    1. public long addConfigInfoAtomic(final long configId, final String srcIp, final String srcUser,
    2. final ConfigInfo configInfo, final Timestamp time, Map<String, Object> configAdvanceInfo) {
    3. // 2057
    4. // 2099行,注释掉Number nu = keyHolder.getKey();,更换为以下内容
    5. // Number nu = keyHolder.getKey();
    6. // 捕获InvalidDataAccessApiUsageException异常
    7. Number nu = null;
    8. try {
    9. nu = keyHolder.getKey();
    10. } catch (InvalidDataAccessApiUsageException e) {
    11. List<Map<String, Object>> keyList = keyHolder.getKeyList();
    12. if (keyList.size() > 0) {
    13. Iterator<Object> keyIter = keyList.get(0).values().iterator();
    14. if (keyIter.hasNext()) {
    15. Object key = keyIter.next();
    16. if (!(key instanceof Number)) {
    17. throw new DataRetrievalFailureException(
    18. "The generated key is not of a supported numeric type. " + "Unable to cast [" + (
    19. key != null ? key.getClass().getName() : null) + "] to ["
    20. + Number.class.getName() + "]");
    21. }
    22. nu = (Number) key;
    23. }
    24. }
    25. }
    26. // ...
    27. }

    3.5 特殊 sql 脚本适配改造

    修改com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePaginationHelperImpl

    修改fetchPage方法。 代码在 96 行。

    1. // selectSql = sqlFetchRows + " LIMIT " + startRow + "," + pageSize;
    2. // 修改为支持postgresql
    3. selectSql = sqlFetchRows + " limit " + pageSize + " offset " + startRow;

    3.6 全局替换

    利用工具进行全局替换,将所有limit ?,? 替换为 offset ? limit ?。兼容 mysql 和 postgresql

    4、本地源码启动

    启动类:com.alibaba.nacos.Nacos

    单机启动需配参数:-Dnacos.standalone=true

    5、重新编译、运行

    编译命令:

    mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true -Drat.skip=true clean install -U

    成功后,编译好的文件路径:

    nacos-all\distribution\target...

    此时,nacos 已支持 postgresql 数据库。

    单机启动命令:

    sh startup.sh -m standalone
  • 相关阅读:
    基于STM32自动售货机控制系统设计
    JS 模块化- 05 ES Module & 4 大规范总结
    一文看懂:华为管理内控体系,到底厉害在哪里
    nextTick()方法的使用
    【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)
    机器人技术研究现状
    经营管理者杂志经营管理者杂志社经营管理者编辑部2022年第7期目录
    SpringCloud 学习笔记总结 (三)
    七大基于比较的排序算法(JAVA)
    rabbitmq保证消息不重复消费,消息不丢失,消息积压问题处理
  • 原文地址:https://blog.csdn.net/hutuyaoniexi/article/details/126610690