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) {


    }
}

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

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

相关文章

Python第三方扩展库NumPy

Python第三方扩展库NumPy NumPy(Numerical Python,注意使用时全部小写 numpy) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 在Windows平台上安装numpy,可在cmd命令…

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供一个访问该实例的全局节点。 优点 可以派生:在单例类的实例构造函数中可以设置以允许子类派生。受控访问:因为单例类封装他的唯一实例&#xf…

学习笔记-李沐动手学深度学习(五)(14-15,数值稳定性、模型初始化和激活函数、Kaggle房价预测)

总结 14-数值稳定性(梯度爆炸、梯度消失) 尤其是对于深度神经网络(即神经网络层数很多),最终的梯度就是每层进行累乘 理论 t:为第t层 y:不是之前的预测值,而是包括了损失函数L …

统一聚合支付系统一个支付系统包含微信支付宝支付接口可对外提供多个网站使用同一个支付系统的初探与逻辑图

#聚合支付# #小李子9479# 开发背景 作为一个合格的站长或者运营,基本上都有好几个网站,而变现的方式其中之一就是付费。经常使用的付费包含微信支付和支付宝支付。微信的jsapi支付需要使用到openid,而获取openid需要设置授权域名&#xff…

C#用TimeSpan的Days、Hours、Minutes及Seconds属性确定程序的运行时间

目录 一、TimeSpan结构的Days、Hours、Minutes及Seconds属性 1.Days属性 2.Hours属性 3.Minutes属性 4.Seconds属性 二、确定程序运行时间的方法 1.实例源码 2.生成效果 在程序设计过程中,经常需要在主窗体中动态地显示程序的运行时间。 一、TimeSpan结构的…

【Linux】-同步互斥的另一种办法-信号量

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

身份证也可以cisa远程考试

CISA CISM CRISC CGEIT ​只有身份证 ​没有护照 ​没有港澳通行证 ​也可以线上考试

python学习20

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

object detection的一些pre trained模型(视频可以实现一下)

https://www.youtube.com/watch?v2yQqg_mXuPQ 你的支持是我创作的源泉

CC++内存管理【非常详细,对新手友好】

文章目录 一、程序内存划分1.基础知识2. 堆栈的区别3. 题目练手 二、C语言中动态内存管理方式三、C中动态内存管理方式1. new/delete操作内置类型2. new/delete操作自定义类型 四、operator new和operator delete函数1. 汇编查看编译器底层调用2. 透过源码分析两个全局函数 五、…

老旧小区火灾频发,LoRa无线系统筑牢安全防线

近日,全国各地多个老旧小区火灾事故频发,从安微合肥南二环一老旧小区居民楼起火、上海金山区一小区居民楼火灾,到1月24日江西新余市特大火灾......都造成了不同程度的人员伤亡和财产损失,令人扼腕痛惜,教训十分深刻。 …

浅谈 ts的类型校验 经验分享

经验1&#xff1a; 【input"testVal $event.target.value"】会有一个ts报错&#xff1a;【“$event.target”可能为 “null”。】我们可以使用【input"testVal (<HTMLInputElement>$event.target).value"】解决ts报错<input type"text&quo…

C#-前后端分离连接mysql数据库封装接口

C#是世界上最好的语言 新建项目 如下图所示选择框红的项目 然后新建 文件夹 Common 并新建类文件 名字任意 文件内容如下 因为要连接的是mysql数据库 所以需要安装 MySql.Data.MySqlClient 依赖; using MySql.Data.MySqlClient; using System.Data;namespace WebApplication1.…

【Image captioning】论文阅读八—ClipCap: CLIP Prefix for Image Captioning_2021

中文标题&#xff1a;ClipCap: CLIP前缀用于图像描述&#xff08;ClipCap: CLIP Prefix for Image Captioning&#xff09; 文章目录 1. 介绍2. 相关工作3. 方法3.1 综述3.2 语言模型微调3.3 映射网络架构3.4 推理 4. 结果5. 结论 摘要&#xff1a;图像描述是视觉语言理解中的…

黑群晖屏蔽更新

黑群晖屏蔽更新 修改Host删除控制面板的红点和更新提示 修改Host ssh连接群晖后执行以下命令 sudo vim /etc/hosts按i键进入编辑模式 光标移动定位到最后一行后追加以下两行 127.0.0.1 update.synology.com 127.0.0.1 update7.synology.com按esc键&#xff0c;然后输入:wq并…

Nginx进阶篇【四】

Nginx进阶篇【四】 六、Nginx负载均衡6.1.负载均衡概述6.2.负载均衡的原理及处理流程6.3.负载均衡的作用6.4.负载均衡常用的处理方式6.4.1.方式一:用户手动选择6.4.2.方式二:DNS轮询方式6.4.2.1.DNS6.4.2.2.为某一个域名添加的IP地址&#xff0c;用2台服务器来做负载均衡6.4.2.…

ROS2学习笔记(0)开坑声明

0.前提 在做racecar的过程中发现已经有不少的开发者和公司开始从ros1转向ros2的怀抱了&#xff0c;刚好寒假在家&#xff0c;我就顺带试试看能不能学点ros2&#xff0c;刚好我有两辆车和主板可以双线开工&#xff08;是的&#xff0c;全是老师们赞助的&#xff0c;真的我哭死&…

Java面试题之序列化和反序列化

Java面试题之序列化和反序列化 文章目录 Java面试题之序列化和反序列化序列化和反序列化什么是序列化?什么是反序列化?如果有些字段不想进行序列化怎么办&#xff1f;常见序列化协议有哪些&#xff1f;为什么不推荐使用 JDK 自带的序列化&#xff1f; 文章来自Java Guide 用于…

Python初学者学习记录——python基础综合案例:数据可视化——地图可视化

一、基础地图使用 1、基础地图演示 2、基础地图演示——视觉映射器 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 2…

stable-diffusion-webui 汉化(中文界面)

大家好&#xff0c;我是水滴~~ 本文主要介绍 Stable Diffusion WebUI 是如何汉化的&#xff0c;文章详细的介绍汉化过程&#xff0c;并加上配图能够清晰的展示该过程。 Stable Diffusion WebUI 官方并没有出中文界面&#xff0c;需要通过安装插件来汉化&#xff0c;下面是详细…