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

shardinig-JDBC二开-支持sharding-jdbc的配置文件接入到nacos

代码在 https://gitee.com/lbmb/mb-live-app 中 【mb-live-framework】 模块里面的【mb-live-framework-datasource-stater】 如果喜欢 希望大家给给star 项目还在持续更新中。

背景介绍:

因为近期在自己写一套直播项目。使用到了sharding-jdbc来做分库分表的组件
使用nacos 来做注册中心和远程配置 这样我们可以把application.yaml 接入到nacos 但是sharding.jdbc 的配置还要放在本地。

ShardingJDBC 4.0.0 版本开始移除了对 Nacos 的支持。在这个版本之后,ShardingJDBC 不再直接支持使用 Nacos 作为配置中心。

项目介绍 :

		因为我是通过自己写start的方式来配置	redis 和dataasource 配置 。所以结构如下: mb-live-user-provider 引入了   mb-live-framework-datasource-stater 的starter
mb-live-app
│  
├── mb-live-api
│   ├── src
│   └── pom.xml
│  
├── mb-live-common-interface
│   ├── src
│   └── pom.xml
│  
├── mb-live-framework
│   ├── mb-live-framework-datasource-stater
│   │   ├── src
│   │   └── pom.xml
│   ├── mb-live-framework-redis-stater
│   │   ├── src
│   │   └── pom.xml
│   └── pom.xml
│  
├── mb-live-gateway
│   ├── src
│   └── pom.xml
│  
├── mb-live-id-generate-interface
│   ├── src
│   └── pom.xml
│  
├── mb-live-id-generate-provider
│   ├── src
│   └── pom.xml
│  
├── mb-live-user-interface
│   ├── src
│   └── pom.xml
│  
└── mb-live-user-provider├── src└── pom.xml

ShardingSphere Driver为什么无法支持Nacos

ShardingSphere Driver的核心是自己提供了ShardingSphereDriver,从而支持这种格式的JDBC URL:jdbc:shardingsphere: p a t h / c o n f i g . y a m l 。我们可以把 S h a r d i n g S p h e r e 的规则写到 c o n f i g . y a m l 文件里,然后通过 S h a r d i n g S p h e r e D r i v e r U R L P r o v i d e r ( 5.4.1 后改名 S h a r d i n g S p h e r e U R L P r o v i d e r )接口来支持不同的 {path}/config.yaml。我们可以把ShardingSphere的规则写到config.yaml文件里,然后通过ShardingSphereDriverURLProvider(5.4.1后改名ShardingSphereURLProvider)接口来支持不同的 path/config.yaml。我们可以把ShardingSphere的规则写到config.yaml文件里,然后通过ShardingSphereDriverURLProvider5.4.1后改名ShardingSphereURLProvider)接口来支持不同的{path}的文件寻址方式。默认支持

SPI 机制

引入文档:SPI机制的讲解

经过调研——及阅读源码 发现shardingjdbc的配置读取是通过ShardingSphereDriverURLManager 来读取的

在这里插入图片描述

接下来我们看源码:发现这个是SPI 机制的表现形式 将所有实现了ShardingSphereDriverURLProvider 这个接口的类全部加载

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License.  You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.apache.shardingsphere.driver.jdbc.core.driver;import org.apache.shardingsphere.driver.jdbc.exception.syntax.DriverURLProviderNotFoundException;
import org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader;/*** ShardingSphere driver URL manager.*/
public final class ShardingSphereDriverURLManager {/*** Get config content from url.* * @param url the driver url* @return the config content*/public static byte[] getContent(final String url) {for (ShardingSphereDriverURLProvider each : ShardingSphereServiceLoader.getServiceInstances(ShardingSphereDriverURLProvider.class)) {if (each.accept(url)) {return each.getContent(url);}}throw new DriverURLProviderNotFoundException(url);}
}

在这里插入图片描述
在这里插入图片描述

到这里了我们就很明了了。我们是否可以通过SPI机制的方式来重构sharding-jdbc 实现nacos 配置呢呢?

在这里插入图片描述
根据上图 我们可以使用 加载覆盖原理 在mb-live-framework-datasource-stater 这个模块下 根据SPI 机制写一个配置
在META-INF 目录下 services目录 建一个
org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereDriverURLProvider 文件
在这里插入图片描述

代码解读

accept 方法 主要是用来检测当前config配置 是否进行加载 匹配原则和
在这里插入图片描述

配置的 这个 url 有关 我写的匹配规则是 是否包含nacos 后面跟随要取的配置文件名称

getContent 方法 主要是读取配置文件里面的配置 并且进行加载感兴趣的可以自己读一下 其他 实现了ShardingSphereDriverURLProvider 接口的配置。
properties 里面的所有配置可以都按照规则写在这个spring.datasource.url 上面 通过解析后 写入到 properties 里面

configService = NacosFactory.createConfigService(properties);
resultConfig = configService.getConfig(“mb-live-user-shardingjdbc.yaml”, “DEFAULT_GROUP”, 6000);

这两行代码则是nacos 读取配置的 代码 返回的讲是你在nacos上配置的yaml的内容信息

package com.manbu.live.farmework.datasource.config;import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.google.common.base.Preconditions;
import com.sun.security.auth.login.ConfigFile;
import org.apache.commons.lang3.StringUtils;
import org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereDriverURLProvider;
import org.springframework.core.convert.Property;import java.nio.charset.StandardCharsets;
import java.util.Properties;/*** @author hanWang* @Title:* @Package* @Description:* @date 2024/1/274:07 AM*/
public class NacosDriverURLProvider implements ShardingSphereDriverURLProvider {private static final String NACOS_TYPE = "nacos:";public NacosDriverURLProvider() {}public boolean accept(String url) {return StringUtils.isNotBlank(url) && url.contains(NACOS_TYPE);}public byte[] getContent(String url) {ConfigService configService = null;String resultConfig = "";try {Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR,"nacos地址");properties.put(PropertyKeyConst.USERNAME,"nacos账号");properties.put(PropertyKeyConst.PASSWORD,"nacos密码");properties.put(PropertyKeyConst.NAMESPACE,"namespace地址");configService = NacosFactory.createConfigService(properties);resultConfig = configService.getConfig("读取配置文件名(需要带上后缀 例如.yaml)", "分组信息默认是 DEFAULT_GROUP", 6000);} catch (Exception e){}return resultConfig.getBytes();}public static void main(String[] args) {}
}

相关文章:

shardinig-JDBC二开-支持sharding-jdbc的配置文件接入到nacos

代码在 https://gitee.com/lbmb/mb-live-app 中 【mb-live-framework】 模块里面的【mb-live-framework-datasource-stater】 如果喜欢 希望大家给给star 项目还在持续更新中。 背景介绍: 因为近期在自己写一套直播项目。使用到了sharding-jdbc来做分库分表的组件…...

a-table自定义展开图标

原文来自&#xff1a;vue 修改ant中table表格的展开图标 树形表格expandIcon自定义图标 <template #expandIcon"props"><span v-if"props.record.children?.length > 0"><divv-if"props.expanded"style"display: inline…...

Kubernetes Ingress暴露应用的工作流程

文章目录 一、Igress是什么二、安装Igress Controller三、Service NodePort模式暴露Ingress Controller四、创建ingress 进行访问查看ingress controller生成的规则(两种类型通用) 五、HostNetwork模式暴露Ingress Controller总结&#xff1a; 一、Igress是什么 一般负载均衡器…...

Redis应用(1)缓存(1.2)------Redis三种缓存问题

三者出现的根本原因是&#xff1a;Redis缓存命中率下降&#xff0c;请求直接打到DB上了。 一、 缓存穿透&#xff1a; 1、定义&#xff1a; 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。…...

安全 专题

[实践总结] 日志注入问题&#xff08;log4j2&#xff09; [实践总结] Java 防止SQL注入的四种方案 [实践总结] 如何防护 order by 导致的SQL注入 [实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击 [实践总结] java XML解析防止外部实体注入 [Ref] yaml.load的漏洞利用…...

自然语言处理-文本对分类或回归

我们研究了自然语言推断。它属于文本对分类&#xff0c;这是一种对文本进行分类的应用类型。 以一对文本作为输入但输出连续值&#xff0c;语义文本相似度是一个流行的“文本对回归”任务。 这项任务评估句子的语义相似度。例如&#xff0c;在语义文本相似度基准数据集&#x…...

以梦为码,CodeArts Snap 缩短我与算法的距离

背景 最近一直在体验华为云的 CodeArts Snap&#xff0c;逐渐掌握了使用方法&#xff0c;代码自动生成的准确程度大大提高了。 自从上次跟着 CodeArts Snap 学习用 Python 编程&#xff0c;逐渐喜欢上了 Python。 我还给 CodeArts Snap 起了一个花名&#xff1a; 最佳智能学…...

SpringMVC-HttpMessageConverter 报文信息转化器

文章目录 HttpMessageConverter一、概念二、RequestBody三、RequestEntity四、 ResponseBody1.返回JSON格式的字符串 五、RestController六、ResponseEntity HttpMessageConverter 一、概念 报文信息转化器&#xff0c;将请求报文转化为Java对象&#xff0c;或将Java对象转化…...

[AG32VF407]国产MCU+FPGA 使用I2C测试陀螺仪MPU6050

视频讲解 [AG32VF407]国产MCUFPGA 使用I2C测试陀螺仪MPU6050 实验过程 查看原理图中定义的I2C的管脚&#xff0c;PB0和PB1 在board.ve中定义的引脚功能 I2C0_SDA PIN_36 I2C0_SCL PIN_35新建工程 测试代码 #include "board.h"#define MIN_IRQ_PRIORITY 1 #define …...

ES 可扩展、高可靠、使用场景等常见问题

ElasticSearch的常见问题 什么是ElasticSearch ElasticSearch是一款非常强大的、基于Lucene的开源搜索及分析引擎&#xff1b;它是一个实时的分布式搜索分析引擎&#xff0c;它能让你以前所未有的速度和规模&#xff0c;去探索你的数据。 它被用作全文检索、结构化搜索、分析…...

<网络安全>《4 网络安全产品之web应用防护系统》

1 基本概念 1.1 WAF Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。一般作为网关设备&#xff0c;防护Web、Webmail服务器等。 1.2 本质 WAF的本质是Web应…...

如何解决Flutter应用程序的兼容性问题

随着移动应用开发领域的不断发展&#xff0c;Flutter作为一种跨平台框架&#xff0c;受到了越来越多开发者的青睐。要确保Flutter应用程序能够在不同的设备和操作系统上稳定运行&#xff0c;并提供一致的用户体验&#xff0c;我们需要重视应用程序的兼容性问题。下面将简单的介…...

详解Mockito

详解Mockito 1. Mockito简介 在我们的编程世界中&#xff0c;测试是一个非常重要的环节&#xff0c;它能帮助我们确保代码的质量和稳定性。而在众多的测试方法中&#xff0c;Mock测试是一种非常有效的手段。 1.1 什么是 Mock 测试 Mock测试&#xff0c;顾名思义&#xff0c;…...

【论文+App试玩+图像到视频】2311.Animate-anyone:上传1张图片为任何人制作动画(用于角色动画的一致且可控的图像到视频合成)(暂未开源)

项目主页&#xff1a;https://humanaigc.github.io/animate-anyone/ 论文: Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 摩尔线程复现代码&#xff1a;https://github.com/MooreThreads/Moore-AnimateAnyone 摩尔windows一…...

【深度学习实验】TensorBoard使用教程【SCALARS、IMAGES、TIME SERIES】

文章目录 一、环境二、TensorBoard1. 使用TensorBoardXa. 安装TensorBoardXb. 使用示例 2. PyTorch内置的TensorBoard3. 启动TensorBoard服务 三、实战1. SCALARS&#xff08;标量&#xff09;找不同关卡1关卡2关卡3关卡4 Show data download linksIgnore outliers in chart sc…...

渗透测试(12)- WireShark 网络数据包分析

目录 1、WireShack 简介 2、WireShark 基本使用方法 3、 WireShack 抓包分析 3.1 Hypertext Transfer Protocol (应用层) 3.2 Transmission Control Protocol (传输层) 3.3 Internet Protocol Version 4(网络层) 3.4 Ethernet Il (链路层): 数据链路层以太网头部信息 …...

XSS_Labs靶场通关笔记

每一关的方法不唯一&#xff1b;可以结合源码进行分析后构造payload&#xff1b; 通关技巧&#xff08;四步&#xff09;&#xff1a; 1.输入内容看源码变化&#xff1b; 2.找到内容插入点&#xff1b; 3.测试是否有过滤&#xff1b; 4.构造payload绕过 第一关 构造paylo…...

基于本地缓存制作一个分库分表的分布式ID生成器

引言&#xff1a; 代码在 https://gitee.com/lbmb/mb-live-app 中 【mb-live-id-generate-provider】 模块里面 如果喜欢 希望大家给给star 项目还在持续更新中。 背景介绍 项目整体架构是 基于springboot 3.0 开发 rpc 调用采用 dubbo 注册配置中心 使用 nacos 采用shardin…...

美易平台:金融市场的晴雨表与创新服务的融合

在金融市场中&#xff0c;利率的微妙变动往往预示着经济活动的脉动&#xff0c;而美国纽约联储发布的最新数据显示&#xff0c;上个交易日&#xff08;1月25日&#xff09;担保隔夜融资利率&#xff08;SOFR&#xff09;小幅上升至5.32%&#xff0c;而同期有效的联邦基金利率保…...

文旅项目包括什么?

文旅项目是指与文化和旅游相结合的项目&#xff0c;旨在通过提供丰富的文化体验和旅游服务来吸引游客&#xff0c;促进地方经济发展。 文旅项目通常包括多个方面&#xff0c;以下是对每块内容的详细介绍&#xff1a; 文化旅游景区&#xff1a;这类项目以展示人类文化和历史遗产…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...