Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......
文章目录
- 1. 概述
- 2. 持久层机制
- 2.1 固定语句
- 2.2 数据源插件
- 3. 案例演示
- 3.1 编译已实现插件
- 3.2 自定义插件
- 3.3 数据库初始化
- 3.4 插件引入
- 3.4.1 方式一:引入到源码
- 3.4.2 方式二:插件加载目录
- 3.5 修改配置
- 3.6 测试
1. 概述
在实际项目开发中,特别是政府项目,信创计划要求使用国产数据库,所以Nacos
需要支持不同类型的数据库。
Nacos
表结构如下,可以看到主要是存储配置、用户、租户相关信息:
2. 持久层机制
2.1 固定语句
在 Nacos 2.2
之前的版本中,所有的 SQL
操作的执行是通过直接使用 JdbcTemplate
执行固定 SQL
语句的形式,使得 SQL
语句与业务逻辑高度耦合,并且只支持 Derby
与 MySQL
两种数据源。
原有模块架构如下:
Nacos 2.1.1
源码中执行 SQL
示例:
如果是 Nacos 2.2
之前的版本,想要兼容多种数据库还是比较头疼的,官方提供的多中数据源支持分支停留在 1.4.2
版本,集成时还需要改造一些代码:
2.2 数据源插件
Nacos
从 2.2.0
版本开始,实现了通过 SPI
机制注入多数据源插件的方式。将 SQL
操作按照数据表进行抽象出多个 Mapper
接口,Mapper
接口的实现类需要按照不同的数据源编写对应的 SQL
方言实现。
架构图如下:
在 nacos-plugin 中,可以看到包含了很多插件:
数据源插件模块 nacos-datasource-plugin-ext
中,可以看到已经实现了DM
(达梦)、SQLServer
、Oracle
、PostgreSQL
:
3. 案例演示
注意事项:
- 目前多数据源插件处于
Beta
测试阶段,其API
及接口方法定义可能会在后续版本升级而有较大修改,请注意您的插件适用版本 - 这里使用的是
Nacos 2.3.2
版本
3.1 编译已实现插件
nacos-plugin 已经实现了多个数据库支持,但是目前仍然处于开发阶段,需要拉取源码自行编译。拉取到本地后,切换到 develop
开发分支。
首先需要将 alibaba-nacos.version
修改为最新的 2.3.2
版本,原先引入的是 2.3.0-SNAPSHOT
快照版本,本地和 Maven
仓库肯定都是没有的:
然后执行 mvn install
安装到本地仓库,这里建议上传到公司的 Maven
仓库。
3.2 自定义插件
针对 nacos-plugin 没有实现的数据库,需要自定义实现(这里只是简单示例,实际是复制了 nacos-postgresql-datasource-plugin-ext
相关代码)。
在 nacos-plugin 中的 nacos-datasource-plugin-ext
下创建自定义插件模块,引入数据库驱动、数据源插件基础依赖:
<parent><artifactId>nacos-datasource-plugin-ext</artifactId><groupId>com.alibaba.nacos</groupId><version>${revision}</version></parent><modelVersion>4.0.0</modelVersion><artifactId>nacos-postgresql-datasource-plugin-ext</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><jdbc.postgresql.version>42.2.19</jdbc.postgresql.version></properties><dependencies><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${jdbc.postgresql.version}</version></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-datasource-plugin-ext-base</artifactId><version>${revision}</version><scope>compile</scope></dependency></dependencies>
实现 AbstractDatabaseDialect
数据库方言接口,设置数据库类型、重写相关分页关键字方法:
public class PostgresqlDatabaseDialect extends AbstractDatabaseDialect {@Overridepublic String getType() {return DatabaseTypeConstant.POSTGRESQL;}@Overridepublic String getLimitTopSqlWithMark(String sql) {return sql + " LIMIT ? ";}@Overridepublic String getLimitPageSqlWithMark(String sql) {return sql + " OFFSET ? LIMIT ? ";}@Overridepublic String getLimitPageSql(String sql, int pageNo, int pageSize) {return sql + " OFFSET " + getPagePrevNum(pageNo, pageSize) + " LIMIT " + pageSize;}@Overridepublic String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize){return sql + " OFFSET " + startOffset + " LIMIT " + pageSize;}}
继承相关 BaseMapper
类,重写一些 Mapper
接口中的特殊 SQL
方法:
编写 SPI
配置文件,引入方言类、自定义 Mapper
,提供修改后对应的数据库初始化SQL
脚本:
3.3 数据库初始化
这里使用 PostgreSQL
进行演示,新建数据库,找到对应的脚本执行即可:
3.4 插件引入
3.4.1 方式一:引入到源码
在 Nacos 2.3.2
源码中的 plugin/datasource/pom.xml
文件中,引入插件依赖:
这里只引入了 PostgreSQL
,也可以引入多个:
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-postgresql-datasource-plugin-ext</artifactId><version>1.0.0-SNAPSHOT</version></dependency>
执行打包命令:
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U
在源码 nacos-2.3.2\distribution\target\nacos-server-2.3.2\nacos
目录下,可以看到打包后的项目:
可以查看 nacos-server.jar
中是否已包含当前数据库驱动:
3.4.2 方式二:插件加载目录
在 Nacos
的启动脚本中,可以看到有一个 loader.path
启动参数, Nacos
支持通过指定路径加载插件:
所以可以直接将编译后的 jar
包(可以多个)放入到 nacos/plugins
目录中:
3.5 修改配置
修改 application.properties
配置文件,添加数据库配置:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
# spring.datasource.platform=mysql
spring.sql.init.platform=postgresql### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:postgresql://127.0.0.1:5432/nacos?tcpKeepAlive=true&reWriteBatchedInserts=true&ApplicationName=nacos_java
db.user=postgres
db.password=123456### Connection pool configuration: hikariCP
db.pool.config.driverClassName=org.postgresql.Driver
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#如果是 oracle 则需要改为 SELECT * FROM dual
#db.pool.config.connectionTestQuery=SELECT 1
3.6 测试
启动 Nacos
,添加配置、用户,查看数据库:
相关文章:

Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......
文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一:引入到源码3.4.2 方式二:插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中,…...
HJ39判断两个IP是否属于同一子网(中)
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 接上文HJ39判断两个IP是否属于同一子网 查了下,atoi可以转换负数。 修改成下面的代码 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool isTargetSonN…...
渗透测试基础(二) Linux+Win常用命令介绍
1. Linux常用命令 1.1 解压缩相关 1.1.1 tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName1.1.2 gz命令 对于.gz格式的解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileN…...

手机usb共享网络电脑没反应的方法
适用于win10电脑,安卓手机上可以 开启usb网络共享选择,如果选择后一直跳,让重复选择usb选项的话,就开启 开发者模式,进到 开发者模式 里设置 默认usb 共享网络 选项 ,就不会一直跳让你选。 1.先用数据线 连…...

Scrivener v3 解锁版安装教程 (写作辅助软件)
前言 Scrivener,一个多功能的写作软件,被世界各地的作家广泛采用,从小说家到剧本家,再到非小说类作家和学术研究者,它的用户群跨越了广泛的领域,包括学生、法律专业人士、记者和翻译。这个软件非常注重用户…...
Python开发——用什么数据储存结构复杂的数据
在Python中,当需要储存包含不同类型的数据时,可以使用以下几种数据结构: 1. 字典(dict) 字典是一种非常灵活的数据结构,允许使用键-值对来存储不同类型的数据。 data {"name": "Alice&quo…...

【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)
前言 近日,社区版家族正式发布V2024.5版本,其中,社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品,本系列文章从背景概念开始介绍,深入浅出的为读者介绍Scope的优势以及能力…...

前端核心框架Vue指令详解
目录 ▐ 关于Vue指令的介绍 ▐ v-text与v-html ▐ v-on ▐ v-model ▐ v-show与v-if ▐ v-bind ▐ v-for ▐ 前言:在学习Vue框架过程中,大家一定要多参考官方API ! Vue2官方网址https://v2.cn.vuejs.org/v2/guide/ ▐ 关于Vue指令的…...

SD卡无法读取?原因分析与数据恢复策略
一、SD卡无法读取的困境 SD卡作为便携式的存储介质,广泛应用于手机、相机、平板等多种电子设备中。然而,在使用过程中,我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时,设备无法识别SD卡,或者虽然识别了SD…...
线程池的工作原理
线程池可以减少创建和销毁线程的次数,从而减少系统资源的消耗。当一个任务(Runnable或Callable对象)(Runnable无返回值,Callable有返回值)被提交到线程池时: 一、首先判断核心线程池中的线程是…...

Nikto一键扫描Web服务器(KALI工具系列三十)
目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…...
全局变量和局部变量
全局变量未初始化,则它的值为0; 局部变量未初始化,则它的值为随机值; 局部变量的作用域是变量所在的局部范围; 全局变量的作用域是整个工程; 生命周期: 变量的生命周期指的是变量从创建到销毁的整个阶段。 局部变量的生…...

[机器学习算法]支持向量机
支持向量机(SVM)是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开,从而实现分类。 1. 理解基本概念和理论: 超平面(Hyperplane):在高维空间中,将数据…...

Springboot应用的信创适配
CentOS7在2024.6.30停止维护后,可替代的Linux操作系统-CSDN博客 全面国产化之路-信创-CSDN博客 信创适配评测-CSDN博客 Springboot应用的信创适配 Springboot应用的信创适配,如上图所示需要适配的很多,从硬件、操作系统、中间件(…...

TypedDict 解析
TypedDict 解析 文章目录 TypedDict 解析1. 类型安全性2. 可读性3. 可维护性TypedDict 的解决方案没有 TypedDict 会发生什么?使用 TypedDict 的优势 TypedDict 应用场景1. 配置文件解析2. API 数据解析3. 数据库记录表示4. 表单数据验证5. 大型团队协作6. 静态类型…...

Windows11和Ubuntu22双系统安装指南
一、需求描述 台式机电脑,已有Windows11操作系统,想要安装Ubuntu22系统(版本任意)。其中Windows安装在Nvme固态上,Ubuntu安装在Sata固态上,双盘双系统。开机时使用Grub控制进入哪个系统,效果图…...
Dockerfile-php7.4.33
# 使用一个包含基本编译工具的基础镜像 FROM ubuntu:latestRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 更新包列表并安装必要的编译工具和库 RUN apt-get update && apt-get i…...

如何降低MCU系统功耗?
大家在做MCU系统开发的时候,是否也碰到过降低MCU系统功耗的需求? MCU系统整板功耗是个综合的数据,包括MCU功耗以及外部器件功耗,在此我们主要介绍如何降低MCU的功耗: 可以在满足应用的前提下,降低MCU的运…...

移动端 UI 风格,诠释精致
移动端 UI 风格,诠释精致...
【408考点之数据结构】数组和特殊矩阵的压缩存储
数组和特殊矩阵的压缩存储 在数据结构中,数组是一种基础的数据结构,用于存储相同类型的元素的集合。矩阵则是一个二维数组,常用于表示图像、图形以及数学运算中的系数。随着矩阵的广泛应用,一些特殊类型的矩阵也被引入并得到了有…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...