Nacos适配Kingbase数据库

背景:

需要将nacos适配Kingbase数据库

1.下载nacos源码

2.源码修改

2.1 ExternalDataSourceProperties.java 修改
java 复制代码
package com.alibaba.nacos.config.server.service.datasource;

public class ExternalDataSourceProperties {

    private static final String JDBC_DRIVER_NAME = "com.kingbase8.Driver";
    
    private static final String TEST_QUERY = "SELECT 1";
    
    private Integer num;
    
    private List<String> url = new ArrayList<>();
    
    private List<String> user = new ArrayList<>();
    
    private List<String> password = new ArrayList<>();
    
    public void setNum(Integer num) {
        this.num = num;
    }
    
    public void setUrl(List<String> url) {
        this.url = url;
    }
    
    public void setUser(List<String> user) {
        this.user = user;
    }
    
    public void setPassword(List<String> password) {
        this.password = password;
    }
    
    /**
     * Build serveral HikariDataSource.
     *
     * @param environment {@link Environment}
     * @param callback    Callback function when constructing data source
     * @return List of {@link HikariDataSource}
     */
    List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
        System.out.println("================== ExternalDataSourceProperties.build() START ==================");
        System.out.println("db.num: " + this.num);
        System.out.println("db.url: " + this.url);
        System.out.println("db.user: " + this.user);
        System.out.println("================== ExternalDataSourceProperties.build() END ==================");

        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);
            poolProperties.setDriverClassName(JDBC_DRIVER_NAME);
            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();
            ds.setConnectionTestQuery(TEST_QUERY);
            dataSources.add(ds);
            callback.accept(ds);
        }
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dataSources), "no datasource available");
        return dataSources;
    }
    
    interface Callback<D> {
        
        /**
         * Perform custom logic.
         *
         * @param datasource dataSource.
         */
        void accept(D datasource);
    }
}
2.2 引入 kingbase8-8.6.0.jar 驱动
2.3 pom.xml (nacos-config)
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 1999-2018 Alibaba Group Holding Ltd.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <parent>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-all</artifactId>
        <version>${revision}</version>
    </parent>
    
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>nacos-config</artifactId>
    <packaging>jar</packaging>
    
    <name>nacos-config ${project.version}</name>
    <url>http://nacos.io</url>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>nacos-api</artifactId>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>nacos-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-encryption-plugin</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
        </dependency>
        
        <!-- Provided -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-influx</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-elastic</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </dependency>
        <dependency>
            <groupId>com.kingbase8</groupId>
            <artifactId>kingbase8</artifactId>
            <version>8.6.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/kingbase8-8.6.0.jar</systemPath>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                    <argLine>-Dnacos.standalone=true</argLine>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.alibaba.nacos.config.server.Config</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>springboot</id>
            <dependencies>
                <dependency>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>nacos-core</artifactId>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <mainClass>com.alibaba.nacos.config.server.Config</mainClass>
                            <includeSystemScope>true</includeSystemScope>
                        </configuration>
                    </plugin>
                </plugins>
                <finalName>nacos-config</finalName>
            </build>
        </profile>
    </profiles>
</project>
2.4 打包
XML 复制代码
mvn -Prelease-nacos -Dmaven.test.skip=true -Dcheckstyle.skip=true -Dpmd.skip=true clean install -U

3. 启动nacos

3.1 配置 plugin
3.2 修改 application.properties
XML 复制代码
spring.datasource.platform=mysql
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:kingbase8://ip:port/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=xxx
db.password.0=yyy

注意:spring.sql.init.platform=mysql 一定要加,否则nacos会 use embedded storage

3.3 启动

导航到 F:\nacos\nacos-2.1.2\distribution\target\nacos-server-2.1.2\nacos\bin

XML 复制代码
startup.cmd -m standalone
3.4 成功日志
XML 复制代码
F:\nacos\nacos-2.1.2\distribution\target\nacos-server-2.1.2\nacos\bin>startup.cmd -m standalone
"nacos is starting with standalone"

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 2.1.2
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 16528
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://10.10.43.84:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2026-04-30 10:43:01,732 INFO Tomcat initialized with port(s): 8848 (http)

2026-04-30 10:43:01,843 INFO Root WebApplicationContext: initialization completed in 2558 ms

================== ExternalDataSourceProperties.build() START ==================
db.num: null
db.url: []
db.user: []
================== ExternalDataSourceProperties.build() END ==================
2026-04-30 10:43:05,861 INFO Adding welcome page: class path resource [static/index.html]

2026-04-30 10:43:06,211 WARN You are asking Spring Security to ignore Ant [pattern='/**']. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.

2026-04-30 10:43:06,212 INFO Will not secure Ant [pattern='/**']

2026-04-30 10:43:06,253 INFO Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2484f433, org.springframework.security.web.context.SecurityContextPersistenceFilter@2b58f754, org.springframework.security.web.header.HeaderWriterFilter@6a988392, org.springframework.security.web.csrf.CsrfFilter@79e18e38, org.springframework.security.web.authentication.logout.LogoutFilter@94f6bfb, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@2552f2cb, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5f3b9c57, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@60b71e8f, org.springframework.security.web.session.SessionManagementFilter@5b6813df, org.springframework.security.web.access.ExceptionTranslationFilter@6865c751]

2026-04-30 10:43:06,276 INFO Exposing 1 endpoint(s) beneath base path '/actuator'

2026-04-30 10:43:06,323 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2026-04-30 10:43:06,349 INFO Nacos started successfully in stand alone mode. use external storage
相关推荐
hashiqimiya6 小时前
postgres数据库操作指南
数据库
Bert.Cai6 小时前
MySQL MOD()函数详解
数据库·mysql
William Dawson6 小时前
【MySQL触发器超详细实战教程|从零基础到项目生产可用(避坑+案例+跨库+逗号拆分)】
数据库·mysql
.柒宇.6 小时前
AI 掘金头条项目-新闻模块实现
数据库·后端·python·fastapi
许彰午6 小时前
我手写了一个 Java 内存数据库(四):索引引擎、SQL 解析与总结
java·数据库·sql
czlczl200209256 小时前
MySQL 中为什么我们要避免“多个范围查询”
数据库·mysql
若兰幽竹6 小时前
【HCIE-openGauss数据库认证】01 准备阶段:实验环境深度剖析与搭建指南
数据库·hcie-opengauss·华为专家级认证
杨云龙UP6 小时前
Oracle 19c多租户架构下设置用户密码永不过期及登录锁定策略说明_20260430
linux·运维·服务器·数据库·oracle
qiuyunoqy6 小时前
MySQL - 4 - mysqldump/mysqladmin/mysqlshow讲解
数据库·mysql