基于SPI机制实现shardingsphere-jdbc5.5.0配置在nacos

前言

本文参考了几篇大佬的文章和代码,我觉得那些大佬的解释都很无敌,所以我直接就给干货吧,具体怎么去实现,欢迎参考下面两个大佬的文章:

shardingsphere-5.5.0-example: springboot3.x + shardingsphere-5.5.0 + nacos-2.3.0 + mybatis-plus运行环境:jdk17/jdk21 + mysql8.0icon-default.png?t=O83Ahttps://gitee.com/dragonyeah/shardingsphere-5.5.0-example#shardingsphere-550-example基于SPI机制修改ShardingJDBC底层,实现Nacos配置数据源_sharding-jdbc nacos-优快云博客文章浏览阅读938次,点赞15次,收藏16次。本文讲述了如何在ShardingJdbc不直接支持Nacos配置的情况下,通过阅读源码并利用SPI机制,自定义扩展类实现Nacos动态配置功能的过程,包括依赖配置、SPI接口的使用以及具体代码实现。https://blog.youkuaiyun.com/weixin_40909461/article/details/137606397?spm=1001.2014.3001.5506

下面例子是官方案例提供的算法,其实你自定义分片算法也是用这个方法实现,可以参考我之前写的一篇博客,里面有关于shard的详细实战使用:

SpringBoot中使用Sharding-JDBC实战(实战+版本兼容+Bug解决)_driver-class-name: org.apache.shardingsphere.drive-优快云博客文章浏览阅读1.6k次,点赞20次,收藏27次。这里整理的是使用SpringBoot3.2.4和ShardingSphere-JDBC5.5.0进行分表操作,里面有遇到的bug并且解决的流程,还有结合自己之前做的秒杀博客进行测试分表,很详细_driver-class-name: org.apache.shardingsphere.driver.shardingspheredriverhttps://blog.youkuaiyun.com/qq_73440769/article/details/143992138?spm=1001.2014.3001.5501

一、Maven配置文件

注意,下面是我的一些版本

             <!-- nacos 配置中心 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>${nacos.version}</version>
            </dependency>

            <!-- nacos 注册中心 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${nacos.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
                <version>${bootstrap.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

二、新增SPI加载配置

包名:

services

配置文件名:

org.apache.shardingsphere.infra.url.spi.ShardingSphereURLLoader

配置文件内容(注意和自己的文件路径相同):

com.quick.spi.CustomNacosURLLoader

 三、编写SPI配置

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.shaded.com.google.common.base.Preconditions;
import lombok.SneakyThrows;
import org.apache.shardingsphere.infra.url.spi.ShardingSphereURLLoader;

import java.util.Properties;


/**
* <p>
* description: 实现SPI,读取远程的nacos配置
* </p>
*
* @title: CustomNacosURLLoader
* @return:
* @author: bluefoxyu
* @date: 2025-01-12 16:06:48
*/
public class CustomNacosURLLoader implements ShardingSphereURLLoader {

    /**
     * 定义jdbc:shardingsphere:后的类型为nacos:
     */
    private static final String NACOS_TYPE = "nacos:";

    /**
    * <p>
    * description: 接收nacos:后的参数shardingsphere-config.yaml?serverAddr=${quick.nacos.server-addr}&namespace=${quick.nacos.config.namespace}&group=${quick.nacos.config.group}
    * </p>
    *
    * @param configurationSubject configuration
    * @param queryProps url参数,已经解析成为Properties
    * @return: java.lang.String
    * @author: bluefoxyu
    * @date: 2025-01-12 16:07:50
    */
    @Override
    @SneakyThrows
    public String load(String configurationSubject, Properties queryProps) {
        ConfigService configService = NacosFactory.createConfigService(queryProps);
        //获取nacos配置
        String config = configService.getConfig(configurationSubject, queryProps.getProperty(Constants.GROUP, Constants.DEFAULT_GROUP), 500);
        Preconditions.checkArgument(config != null, "Nacos config [" + configurationSubject + "] is Empty.");
        return config;
    }

    @Override
    public Object getType() {
        return NACOS_TYPE;
    }
}

注意:由于我的nacos是2.1.2版本的不需要加上账号密码,如果是需要账号密码,这里也不需要改变,只需要修改后面我给出的bootstrap.yaml配置

四、编写bootstrap.yaml

关键部分配置为:

  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:nacos:shardingsphere-config.yaml?serverAddr=${nacos.server-addr}&namespace=${nacos.config.namespace}&group=${nacos.config.group}

注意这里的shardingsphere-config.yaml命名需要和你nacos中的一致

如果你的nacos版本比较新,下面可以在url最后拼上下面的配置:

&username=${nacos.username}&password=${nacos.password}

注意这里的是具体的账号密码需要填充,完整的如下:

  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:nacos:shardingsphere-config.yaml?serverAddr=${nacos.server-addr}&namespace=${nacos.config.namespace}&group=${nacos.config.group}&username=${nacos.username}&password=${nacos.password}

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乄bluefox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值