下载源码:

https://github.com/alibaba/nacos/releases/tag/2.2.3

添加依赖:

  • 根pom添加kingbase依赖
<!-- KingBase Connector -->
<dependency>
    <groupId>cn.com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
	<version>${KingBase.version}</version>
</dependency>

版本号根据实际项目情况来定

  • config模块pom添加依赖
<!-- KingBase Connector -->
<dependency>
    <groupId>cn.com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
</dependency>

  • plugin模块

/plugin/datasource/src/main/resources/META-INF/services 下增加以下数据

com.alibaba.nacos.plugin.datasource.impl.kingbase.ConfigInfoAggrMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.ConfigInfoBetaMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.ConfigInfoMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.ConfigInfoTagMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.ConfigTagsRelationMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.GroupCapacityMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.HistoryConfigInfoMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.TenantCapacityMapperByKingBase
com.alibaba.nacos.plugin.datasource.impl.kingbase.TenantInfoMapperByKingBase
  • plugin增加 kingbase文件夹

com.alibaba.nacos.plugin.datasource.impl 模块下

  • plugin增加kingbase常量

修改文件:com.alibaba.nacos.plugin.datasource.constants.DataSourceConstant.java

public static final String KINGBASE = "kingbase8";
  • 根据SPI机制进行代码扩展,此处9个文件从mysql文件夹下已有的实现类中copy重命名即可
ConfigInfoAggrMapperByKingBase
ConfigInfoBetaMapperByKingBase
ConfigInfoMapperByKingBase
ConfigInfoTagMapperByKingBase
ConfigTagsRelationMapperByKingBase
GroupCapacityMapperByKingBase
HistoryConfigInfoMapperByKingBase
TenantCapacityMapperByKingBase
TenantInfoMapperByKingBase

编译打包源码

# mvn Failed during checkstyle execution: There are errors reported by Checkstyle
# 打包发布时注意指定profile的配置,即-Prelease-nacos
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  -Dcheckstyle.skip

问题:Cannot access mirror (https://maven.aliyun.com/nexus/content/groups/public) in offline mode and the artifact org.springframework.boot:spring-boot-maven-plugin:pom:2.6.14 has not been downloaded from it before.
解决:idea中maven项目下载依赖cannot resolve的问题

最终结果:

配置文件修改

spring.sql.init.platform=kingbase8
spring.datasource.platform=kingbase8
db.num=1
db.url.0=jdbc:kingbase8://192.168.1.40:54321/nacos?currentSchema=public
db.user=kingbase
db.password=123456
db.pool.config.driverClassName=com.kingbase8.Driver

运行nacos

jar包位置,生成的jar包在nacos\distribution\target目录下

.\startup.cmd -m standalone

访问:http://localhost:8848/nacos nacos/nacos

运行调试

console: com.alibaba.nacos.Nacos
VM options: -Dnacos.standalone=true 单击版本

异常登记

情况说明:本人使用KDTS迁移工具同步到kingbase库当中,部分表字段类型调整,自增调整为seq,还有时间问题调整等

kingbase错误duplicate key value violates unique constraint 解决方案

SELECT setval('config_info_id_seq', (SELECT MAX(id) FROM "public"."config_info_id_seq")+1)
# 原因:新建自增序列sequence时都是从1开始,数据迁移场景中实际需要考虑serial列历史数据自增数,执行以上命令即可

修改nacos中管理的某个配置文件并保存时报:

caused: PreparedStatementCallback; ERROR: duplicate key value violates unique constraint "uk_configinfo_datagrouptenant" Detail: Key (data_id, group_id, tenant_id)=(liying.yaml, DEFAULT_GROUP, ) already exists.; nested exception is com.kingbase8.util.KSQLException: ERROR: duplicate key value violates unique constraint "uk_configinfo_datagrouptenant" Detail: Key (data_id, group_id, tenant_id)=(liying.yaml, DEFAULT_GROUP, ) already exists.;caused: ERROR: duplicate key value violates unique constraint "uk_configinfo_datagrouptenant" Detail: Key (data_id, group_id, tenant_id)=(liying.yaml, DEFAULT_GROUP, ) already exists.;

分析原因:发现kingbase的driver在唯一键约束重复异常时没有报DuplicateKeyException,而是直接抛出了违反数据完整性异常org.springframework.dao.DataIntegrityViolationException,原因是kingbase的重复key异常code与spring-data约定的异常码不一致,约定的是1062而kingbase报的是23505。

解决办法:经过读其他位置的代码,考量在配置修改时,直接捕获这个异常决定配置是更新or插入,是可以的。 

修改代码如下:

#文件路径:src/main/java/com/alibaba/nacos/config/server/service/repository/extrnal/ExternalConfigInfoPersistServiceImpl.java:177行
# DuplicateKeyException 替换为 DataIntegrityViolationException 
} catch (DataIntegrityViolationException ive) { // Unique constraint conflict

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐