当前位置: 首页 > news >正文

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 语句与业务逻辑高度耦合,并且只支持 DerbyMySQL 两种数据源。

原有模块架构如下:
在这里插入图片描述
Nacos 2.1.1 源码中执行 SQL 示例:

在这里插入图片描述
如果是 Nacos 2.2 之前的版本,想要兼容多种数据库还是比较头疼的,官方提供的多中数据源支持分支停留在 1.4.2 版本,集成时还需要改造一些代码:

在这里插入图片描述

2.2 数据源插件

Nacos2.2.0 版本开始,实现了通过 SPI 机制注入多数据源插件的方式。将 SQL 操作按照数据表进行抽象出多个 Mapper 接口,Mapper 接口的实现类需要按照不同的数据源编写对应的 SQL 方言实现。

架构图如下:
在这里插入图片描述

在 nacos-plugin 中,可以看到包含了很多插件:
在这里插入图片描述

数据源插件模块 nacos-datasource-plugin-ext 中,可以看到已经实现了DM(达梦)、SQLServerOraclePostgreSQL

在这里插入图片描述

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 方式一&#xff1a;引入到源码3.4.2 方式二&#xff1a;插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中&#xff0c;…...

HJ39判断两个IP是否属于同一子网(中)

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 接上文HJ39判断两个IP是否属于同一子网 查了下&#xff0c;atoi可以转换负数。 修改成下面的代码 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool isTargetSonN…...

渗透测试基础(二) Linux+Win常用命令介绍

1. Linux常用命令 1.1 解压缩相关 1.1.1 tar命令 解包&#xff1a;tar zxvf FileName.tar 打包&#xff1a;tar czvf FileName.tar DirName1.1.2 gz命令 对于.gz格式的解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d FileName.gz压缩&#xff1a;gzip FileN…...

手机usb共享网络电脑没反应的方法

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

Scrivener v3 解锁版安装教程 (写作辅助软件)

前言 Scrivener&#xff0c;一个多功能的写作软件&#xff0c;被世界各地的作家广泛采用&#xff0c;从小说家到剧本家&#xff0c;再到非小说类作家和学术研究者&#xff0c;它的用户群跨越了广泛的领域&#xff0c;包括学生、法律专业人士、记者和翻译。这个软件非常注重用户…...

Python开发——用什么数据储存结构复杂的数据

在Python中&#xff0c;当需要储存包含不同类型的数据时&#xff0c;可以使用以下几种数据结构&#xff1a; 1. 字典&#xff08;dict&#xff09; 字典是一种非常灵活的数据结构&#xff0c;允许使用键-值对来存储不同类型的数据。 data {"name": "Alice&quo…...

【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)

前言 近日&#xff0c;社区版家族正式发布V2024.5版本&#xff0c;其中&#xff0c;社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品&#xff0c;本系列文章从背景概念开始介绍&#xff0c;深入浅出的为读者介绍Scope的优势以及能力…...

前端核心框架Vue指令详解

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

SD卡无法读取?原因分析与数据恢复策略

一、SD卡无法读取的困境 SD卡作为便携式的存储介质&#xff0c;广泛应用于手机、相机、平板等多种电子设备中。然而&#xff0c;在使用过程中&#xff0c;我们可能会遭遇SD卡无法读取的困扰。当我们将SD卡插入设备时&#xff0c;设备无法识别SD卡&#xff0c;或者虽然识别了SD…...

线程池的工作原理

线程池可以减少创建和销毁线程的次数&#xff0c;从而减少系统资源的消耗。当一个任务&#xff08;Runnable或Callable对象&#xff09;&#xff08;Runnable无返回值&#xff0c;Callable有返回值&#xff09;被提交到线程池时&#xff1a; 一、首先判断核心线程池中的线程是…...

Nikto一键扫描Web服务器(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…...

全局变量和局部变量

全局变量未初始化&#xff0c;则它的值为0&#xff1b; 局部变量未初始化&#xff0c;则它的值为随机值&#xff1b; 局部变量的作用域是变量所在的局部范围; 全局变量的作用域是整个工程; 生命周期&#xff1a; 变量的生命周期指的是变量从创建到销毁的整个阶段。 局部变量的生…...

[机器学习算法]支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开&#xff0c;从而实现分类。 1. 理解基本概念和理论&#xff1a; 超平面&#xff08;Hyperplane&#xff09;&#xff1a;在高维空间中&#xff0c;将数据…...

Springboot应用的信创适配

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

TypedDict 解析

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

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑&#xff0c;已有Windows11操作系统&#xff0c;想要安装Ubuntu22系统&#xff08;版本任意&#xff09;。其中Windows安装在Nvme固态上&#xff0c;Ubuntu安装在Sata固态上&#xff0c;双盘双系统。开机时使用Grub控制进入哪个系统&#xff0c;效果图…...

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系统开发的时候&#xff0c;是否也碰到过降低MCU系统功耗的需求&#xff1f; MCU系统整板功耗是个综合的数据&#xff0c;包括MCU功耗以及外部器件功耗&#xff0c;在此我们主要介绍如何降低MCU的功耗&#xff1a; 可以在满足应用的前提下&#xff0c;降低MCU的运…...

移动端 UI 风格,诠释精致

移动端 UI 风格&#xff0c;诠释精致...

【408考点之数据结构】数组和特殊矩阵的压缩存储

数组和特殊矩阵的压缩存储 在数据结构中&#xff0c;数组是一种基础的数据结构&#xff0c;用于存储相同类型的元素的集合。矩阵则是一个二维数组&#xff0c;常用于表示图像、图形以及数学运算中的系数。随着矩阵的广泛应用&#xff0c;一些特殊类型的矩阵也被引入并得到了有…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

shell脚本质数判断

shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数&#xff09;shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数&#xff09; 思路&#xff1a; 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...