• 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
  • 相关阅读:
    山东赛 - 心电图智能事件识别Top2方案分享
    2-反对称矩阵及其指数函数
    【考研】操作系统——同步互斥问题(P、V操作)4
    无代码开发添加数据入门教程
    图像篡改检测调研
    Allegro 172版本自动放置层叠
    Java9-17新特性一览,了解少于3个你可能脱节了
    理解HMM算法
    RabbitMQ安装与简单使用
    懂“女人心”的Pocket S将是华为手机的又一爆品
  • 原文地址:https://blog.csdn.net/hutuyaoniexi/article/details/126610690