nacos多数据源插件介绍以及使用

news2024/11/23 2:30:47

概述

在微服务架构中,服务配置的集中管理和动态调整是至关重要的。Nacos 提供了配置管理和服务发现的功能,其中配置管理支持动态数据源的切换,增强了其在复杂环境中的适用性。默认情况下,Nacos 支持 MySQL 和Derby,但通过使用 Nacos 数据源插件,可以扩展其支持更多类型的数据源,如 dameng、kingbase、SqlServer、Oracle等。

支持数据源扩展的必要性

多数据源支持

不同的服务可能需要连接到不同的数据库,或者需要同时连接到多种类型的数据库。

环境差异

开发、测试以及生产环境可能使用不同的数据库,通过使用数据源扩展插件,可以达到自由切换的目标。

高可用性

通过在 Nacos 中配置多个数据源,可以实现数据源的负载均衡和故障转移。

Nacos 多数据源插件介绍

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。

注意: 目前多数据源插件处于Beta测试阶段,其API及接口方法定义可能会在后续版本升级而有较大修改,请注意您的插件适用版本。

原理简介

主要通过插件化来实现多数据源

在原来的Config模块中,所有的SQL操作的执行是通过直接使用JdbcTemplate执行固定SQL语句的形式,使得SQL语句与业务逻辑高度耦合,并且只支持Derby与MySQL两种数据源,原有Config模块架构如下。

在这里插入图片描述

现在的多数据源插件通过SPI机制,将SQL操作按照数据表进行抽象出多个Mapper接口,Mapper接口的实现类需要按照不同的数据源编写对应的SQL方言实现; 现在插件默认提供Derby以及MySQL的Mapper实现,可直接使用;而其他的数据源则需要用户使用数据源插件进行加载,其改造后架构图如下。
在这里插入图片描述

多数据源插件使用

多数据源插件的使用分为两个场景 第一个是插件仓库已经对数据源进行了实现 第二 需要自行实现 这里我们先讨论第一种场景
例如说我们nacos的数据库需要使用 达梦数据库

前置条件

对应的数据库的环境

下载编译插件仓库

git clone git@github.com:nacos-group/nacos-plugin.git
mvn -U clean intall -DskipTests=true

在这里插入图片描述

寻找对应的数据源插件并install到本地

在这里插入图片描述
第一个nacos数据源扩展插件的主module
第二个是 dm 数据源的扩展插件
将 dm 数据源的扩展插件 install到本地即可

install过程中如果遇到 oracle数据源 模块报错 直接在父 pom中注释掉即可

下载编译 nacos源码

git clone git@github.com:alibaba/nacos.git
mvn -U clean intall -DskipTests=true

源码改造

在nacos的nacos-datasource-plugin module中添加依赖

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-dm-datasource-plugin-ext</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

配置修改

修改数据库连接 以及 数据库相关配置

在nacos-console module 的application.properties配置文件中,修改数据库配置:


spring.sql.init.platform=dm
### Count of DB:
db.num=1

### Connect URL of DB:
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user=nacos
# db.password=nacos

db.url.0=jdbc:dm://dm服务地址:5236/nacos?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
db.user.0=
db.password.0=xx
db.pool.config.driverClassName=dm.jdbc.driver.DmDriver

在 nacos-console module中 修改主启动类Nacos 增加启动为单体模式 方便我们本地调试

@SpringBootApplication
@ComponentScan(basePackages = "com.alibaba.nacos", excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = {NacosTypeExcludeFilter.class}),
        @Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}),
        @Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})
@ServletComponentScan
public class Nacos {
    
    public static void main(String[] args) {
        //新增配置  启动为单体模式
        System.setProperty(Constants.STANDALONE_MODE_PROPERTY_NAME, "true");
        SpringApplication.run(Nacos.class, args);
    }
}

启动Nacos

启动Nacos服务,检查是否能够成功连接到达梦数据库,并正常工作。

测试验证

通过Nacos控制台进行服务注册、配置管理等操作,验证适配是否成功。

构建 使用

测试验证没问题后 即可打成jar 发到指定环境中了

mvn clean package -DskipTests=true
# nacos文件
cd distribution/target/nacos-server-{version}/

至此第一种场景已经改造完成了 接下来讨论第二种场景

自行扩展数据源插件

自行扩展数据源插件也不是很复杂,这里举例kingbase(人大金仓)的扩展

前置准备

准备对应的数据库环境 ,最好使用数据库自带的传输工具(例如kingbase dts ,dm的dem ),这样可以避免大多数问题 。

下载编译插件仓库(已下载 跳过)

git clone git@github.com:nacos-group/nacos-plugin.git
mvn -U clean intall -DskipTests=true

在数据源插件扩展module下创建对应的项目

例如 nacos-kingbase-datasource-plugin-ext 如果没有问题的话,将会创建nacos-kingbase-datasource-plugin-ext 并且parent为 nacos-datasource-plugin-ext
在这里插入图片描述

在项目module中引入对应的数据库驱动以及数据源插件基础依赖

<dependency>
   <groupId>cn.com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
    <version>8.6.0</version>
</dependency>
        
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-datasource-plugin-ext-base</artifactId>
    <version>${revision}</version>
    <scope>compile</scope>
</dependency>

创建包 以及对应的项目结构 可从其他的数据源插件复制 (最好目录结构 命名规范与其他的项目一致)

在这里插入图片描述

新增或者修改数据库方言

在 com.alibaba.nacos.plugin.datasource.constants.DatabaseTypeConstant 类中新增数据库常量

public static final String KINGBASE = "kingbase";
/**
 * kingbase database dialect.
 *
 * @author leon
 * &#064;date  2024-09-09 15:37:28
 */
public class KingbaseDatabaseDialect extends AbstractDatabaseDialect {

    @Override
    public String getType() {
        return DatabaseTypeConstant.KINGBASE;
    }
}

接下来实现每个表的 对应的数据库方言的 mapper

在这里插入图片描述
这里mapper改造由于人大金仓数据对mysql的支持较高,所以并不是很复杂 。 只用重写getDataSource方法即可 这里举两个例子

public class ConfigInfoAggrMapperByKingbase extends BaseConfigInfoAggrMapper {

    @Override
    public String getDataSource() {
        return DatabaseTypeConstant.KINGBASE;
    }
}
public class ConfigInfoBetaMapperByKingbase extends BaseConfigInfoBetaMapper {

    @Override
    public String getDataSource() {
        return DatabaseTypeConstant.KINGBASE;
    }

}

其他的也类似改造即可
另外需要说明的是,为了保证sql的兼容性最好可以每个sql都自行执行下

修改 DatabaseDialect SPI

修改 com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect
将内容修改为对应的数据库方言类

com.alibaba.nacos.plugin.datasource.dialect.KingbaseDatabaseDialect

修改 Mapper 的SPI

修改 com.alibaba.nacos.plugin.datasource.mapper.Mapper
将内容修改为对应的数据库方言Mapper类

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.HistoryConfigInfoMapperByKingbase
com.alibaba.nacos.plugin.datasource.impl.kingbase.TenantInfoMapperByKingbase
com.alibaba.nacos.plugin.datasource.impl.kingbase.TenantCapacityMapperByKingbase
com.alibaba.nacos.plugin.datasource.impl.kingbase.GroupCapacityMapperByKingbase

准备数据脚本 放置到sql脚本上即可

将对应数据库环境的sql脚本导出 放置到sql脚本上即可
在这里插入图片描述

到此 自定义数据源插件结束 后续即可通过 如上 存在数据源插件的方案进行自行测试


good day!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++——AVL树的模拟实现

目录 一、AVL树结点 二、AVL树结构 三、插入数据&#xff08;重点&#xff09; 1、右单旋 2、左单旋 3、左右双旋 4、右左双旋 AVL树是一颗平衡二叉搜索树&#xff0c;它的本质就是一颗之前说过的二叉搜索树。但是二叉搜索树可能会出现极端情况&#xff0c;导致二叉搜索树变…

不同时期的USB接口

Type-A Type-A接口最早于USB1.0标准(1996)推出&#xff0c;拥有四个引脚&#xff1a;VBUS提供5V电源&#xff0c;D-和D用于数据传输&#xff0c;GND接地。 Type-B Type-B接口最早于USB1.0标准(1996)推出&#xff0c;拥有四个引脚&#xff1a;VBUS提供5V电源&#xff0c;D-和D用…

QD1-P7 HTML常用标签:div和span

本节学习&#xff1a;div 和 span 标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p7 ‍ 一、div 标签 用途 ​<div>​ 标签在 HTML 中是一个通用 容器 &#xff0c;用于将 HTML 文档中的内容分组并在文档中划分区域。<div> ​元素本身不具有特定的含…

道路积水检测数据集 1450张 路面积水 带分割 voc yolo

道路积水检测数据集 1450张 路面积水 带分割 voc yolo 分类名: (图片张数&#xff0c; 标注个数) puddle:(1468,1994) 总数:(1468&#xff0c;1994) 总类(nc): 1类 道路积水检测数据集介绍 项目名称 道路积水检测数据集 项目概述 本数据集包含1450张带有标注的图像&#x…

【ubuntu】ubuntu20.04安装cuda12.6与显卡驱动

目录 1.安装cuda12.6 2.安装显卡驱动 1.安装cuda12.6 https://developer.nvidia.com/cuda-toolkit-archive https://developer.nvidia.com/cuda-12-6-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_version20.04&target_…

记一次 stm32f407 无法进入 standby 问题

记一次 stm32f407 无法进入 standby 问题 通过查看当前中断信息,发现是 systick 中断pending未处理导致进入standby 模式的 WFI 失败,所以需要在执行 WFI 之前清除 systick 中断pending标志. 查看<Cortex M3与M4权威指南>如下: 可知ICSR寄存器的bit 26表示systick中断是…

RadioGroup RadioButton底部导航栏

参考: https://blog.csdn.net/lu202032/article/details/117632709 activity_home.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://sch…

八大排序--07归并排序

假设数组 arr[] {5,7,4,2,0,1,6},请通过插入排序的方式&#xff0c;实现从小到大排列&#xff1a; 方法&#xff1a;先拆分&#xff0c;再合并&#xff0c;并在合并过程中结束临时空间进行排序&#xff1b; 拆分&#xff1a;从待排序列中间位置拆开&#xff0c;数据分成左右两…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

MCU 移值FreeRTOS:【图文+源代码】

1&#xff1a;裸机程序执行 在裸机程序中&#xff0c;对于简单的方式&#xff0c;经常采用查询方式&#xff0c;即一件事完成后&#xff0c;再去完成另一件事&#xff0c;按照顺序执行&#xff0c;这种执行导致当有紧急情况时&#xff0c;可能会得不到处理。对于更复杂的程序&…

pymupdf 解析 PDF

使用大模型处理文档时&#xff0c;需要对二进制格式的文档进转解析提取文字和图片&#xff0c;本文使用 pymupdf 开源库&#xff0c;对 PDF 进行解析提取文字和图片。 安装依赖 首先安装 pymupdf 依赖 pymupdf4llm0.0.17 pymupdf1.24.10 apscheduler3.10.4PDF 转 Markdown …

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…

等级保护等保资料原件合集(word源资料)

第二章 系统定级与安全域 2.1 系统定级 2.1.1 不同等级的安全保护能力 2.1.2 重要信息系统 2.1.3 定级参考 2.2 安全域定义 2.2.1 安全域定义方法 2.2.2 安全域等级描述 第三章 实施方案设计 3.1 三级等保要求 3.2 基本要求的详细技术要求 3.2.1 物理安全 3.2.2 网…

非线性关卡设计

【GDC】如何设计完全非线性的单人关卡_DOOM (bilibili.com) 本文章算是此视频的简单笔记&#xff0c;更详细还请看视频 设计完全非线性关卡强调自由移动和沙盒式玩法&#xff0c;鼓励玩家进行不可预测的移动和空间探索。讲解者分享了设计此类关卡的具体步骤&#xff0c;包括明…

element ui 使用

文章目录 element ui1.组件内部传值使用说明&#xff1a;当我们在app组件中使用movie组件&#xff0c;我们希望movie组件的内容是由app组件来定义&#xff0c;就可以使用prop关键字1.在app组件中导入movie组件并且使用2.在movie中写死数据测试3.使用date测试4.使用props 2.elem…

排序--DS

1. 排序 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 #稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录…

CentOS 7 yum命令报错...

例如 yum install wget 可以看到是报错的 解决方案 对系统本身的 yum 源进行备份 进入源目录 cd /etc/yum.repos.d/备份 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载阿里云 CentOS 7 镜像源配置文件 sudo curl -o /etc/yum…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

Java | Leetcode Java题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; class Solution {Map<Integer, Boolean> memo new HashMap<Integer, Boolean>();public boolean canIWin(int maxChoosableInteger, int desiredTotal) {if ((1 maxChoosableInteger) * (maxChoosableInteger) / 2 < desi…

github创建仓库并本地使用流程,以及问题src refspec xxx does not match any

1.在 GitHub 上创建一个新仓库 登录你的 GitHub 账户。 点击右上角的 “” 按钮&#xff0c;然后选择 “New repository”。 填写仓库名称&#xff08;如 my-repo&#xff09;。 &#xff08;可选&#xff09;添加描述&#xff0c;选择是否公开或私有仓库。 &#xff08;可选&…