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 {

    @Override
    public String getType() {
        return DatabaseTypeConstant.POSTGRESQL;
    }
    
    @Override
    public String getLimitTopSqlWithMark(String sql) {
        return sql + " LIMIT ? ";
    }
    
    @Override
    public String getLimitPageSqlWithMark(String sql) {
        return sql + "  OFFSET ? LIMIT ? ";
    }
    
    @Override
    public String getLimitPageSql(String sql, int pageNo, int pageSize) {
        return sql + "  OFFSET " + getPagePrevNum(pageNo, pageSize) + " LIMIT " + pageSize;
    }
    
    @Override
    public 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 ,添加配置、用户,查看数据库:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式导读:建造者模式的细腻之处与编程技巧

笔者的碎碎念 其实之前有写过建造者模式的文章&#xff0c;但是感觉其实写的不怎么样&#xff0c;而且自己也理解的一般&#xff0c;但是阅读一些框架源码发现&#xff0c;这些模式真的蛮重要的&#xff0c;很多框架例如OkHttp&#xff0c;Retrofit等等都大量使用了建造者模式…

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地&#xff0c;利用代码为GitHub&#xff1a;https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接&…

了解请求参数与响应参数的区别:初学者指南

在 Web 的开发领域&#xff0c;无论你是前端开发还是后端开发人员&#xff0c;把握请求与响应参数的核心差异是极其重要的。这些参数在客户端和服务器之间的互动中扮演着关键角色。 请求参数的定义及类别 定义 当客户端向服务器提交信息时所使用的数据被称为请求参数。这些参…

深入理解TCP协议:工作原理、报文结构及应用场景

TCP协议详解 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是因特网协议套件中最重要的协议之一。它为应用程序提供了可靠、面向连接的通信服务。TCP协议确保数据包按顺序到达&#xff0c;并且没有丢失或重复。本文将详细介绍TCP协议的工…

免费ddns工具,快解析DNS解析使用教程

DDNS&#xff08;Dynamic Domain Name Server&#xff09;,中文叫动态域名解析&#xff0c;主要用于没有固定公网ip的网络环境下&#xff0c;使用一个固定的域名&#xff0c;解析动态变化的ip地址&#xff0c;达到远程访问的目的。 众所周知&#xff0c;目前公网ip资源非常紧缺…

Springboot多模块项目从0构建打包运行

今天复习了一下Springboot的多模块的构建&#xff0c;其实一直以来都对单体项目使用多模块感到不太理解&#xff0c;不知道到底有什么样的优势&#xff0c;目前切身体会到的优势就是确实可以让依赖的划分更加清晰&#xff08;每个模块下的pom文件只引入该模块需要的依赖&#x…

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统&#xff0c;运行在正点原子-I.MX6U ALPHA开发板 上&#xff0c;详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机&#xff1a;VMware 2.2 软件环境 Ubuntu系统要求&#xff1a;20.0…

常用算法及参考算法 (1)累加 (2)累乘 (3)素数 (4)最大公约数 (5)最值问题 (6)迭代法

常用算法及参考算法 &#xff08;1&#xff09;累加 &#xff08;2&#xff09;累乘 &#xff08;3&#xff09;素数 &#xff08;4&#xff09;最大公约数 &#xff08;5&#xff09;最值问题 &#xff08;6&#xff09;迭代法 1. 累加 #include <stdio.h>int main() {…

物理层(一)

第2章 物理层 2.1 通信基础 2.1.1 基本概念 1、数据、信号与码元 通信的目的是传输信息&#xff0c;如文字、图像和视频等。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。数据和信号都有模拟或数字之分:①模拟数据(或模…

Day15 —— 大语言模型简介

大语言模型简介 大语言模型基本概述什么是大语言模型主要应用领域大语言模型的关键技术大语言模型的应用场景 NLP什么是NLPNLP的主要研究方向word2vecword2vec介绍word2vec的两种模型 全连接神经网络神经网络结构神经网络的激活函数解决神经网络过拟合问题的方法前向传播与反向…

【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f343;队列的概念 &#x1f343;循环队列的概念 &#x1f343;为什…

python基础语法 003-1 数据类型列表

1 列表 1.1 列表的定义 关键字&#xff1a;list()标识&#xff1a;[] 用逗号隔开使用最频繁的数据类型&#xff0c;列表可以完成大多数集合类型的数据结构实现支持字符、数字、字符串、甚至可以包含列表&#xff0c;即嵌套打印列表类型&#xff1a;type()1个元素的列表表示&…

【Linux基础】文件基本属性

Linux文件基本属性是指文件或目录在Linux系统中具有的一系列特性和信息。这些属性提供了关于文件或目录的详细信息&#xff0c;包括其类型、权限、大小、创建和修改时间等。 文件属性 在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组…

springCloud组件专题(四) --- sentinel

前言 限流&#xff0c;熔断降级概念 限流&#xff1a;顾名思义&#xff0c;就是对一个资源&#xff08;服务或者接口都可以算资源&#xff09;的访问进行限制。简单来说就是限制单位时间内允许资源被访问的次数。常见的算法就是令牌桶算法。 降级&#xff1a;降级其实是一种资源…

常用主流sip协议软电话客户端软件有哪些?—— 筑梦之路

Ekiga 官网地址&#xff1a;Ekiga ~ Free Your Speech Ekiga&#xff0c;原名GnomeMeeting&#xff0c;支持Windows和Linux&#xff0c;是一个兼容SIP和H.323的视频会议程序&#xff0c;兼容VoIP&#xff0c;IP电话&#xff0c;通过Ekiga可以与使用任何SIP和H.323软硬件的远程…

C语言 | Leetcode C语言题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; int maxProfit(int k, int* prices, int pricesSize) {int n pricesSize;if (n 0) {return 0;}k fmin(k, n / 2);int buy[k 1], sell[k 1];memset(buy, 0, sizeof(buy));memset(sell, 0, sizeof(sell));buy[0] -prices[0];sell[0] 0…

周末设计高端企业_集团官网主题Discuz模板

风格名称: 周末设计_高端企业_集团官网 适用版本: Discuz! X3.0、X3.1、X3.2、X3.3、F1.0 风格编码: 使用语言包结构&#xff0c;适合全部编码 周末设计高端企业_集团官网主题Discuz模板

g++制作C++动态库的简洁例程

g制作C动态库的简洁例程 code review! 文章目录 g\制作C动态库的简洁例程1. 创建 C 动态库1.1 动态库源文件1.2 编译动态库 2. 使用动态库2.1 命令行编译链接然后运行2.2 使用 CMake 编译链接然后运行 3.附加笔记&#xff1a;关于运行时是否能找到libmylib.so的问题汇总3.1.g -…

TLS握手中的RTT

文章目录 TLS 1.2 握手过程中的 RTT 次数TLS 1.3 1-RTT 初次TLS1.3 0-RTT 握手过程总结 TLS 1.2 握手过程中的 RTT 次数 TLS 1.2 握手通常需要2 RTT 才能完成。具体步骤如下&#xff1a; 第一次 RTT&#xff1a; 客户端发送 ClientHello&#xff1a;客户端生成一个随机数&…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量&#xff0c;每一个函数都会使用这些变量&#xff0c;会让函数的参数越变越多。所以我们定义全局变量&#xff0c;这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…