前言
本文参考了几篇大佬的文章和代码,我觉得那些大佬的解释都很无敌,所以我直接就给干货吧,具体怎么去实现,欢迎参考下面两个大佬的文章:
shardingsphere-5.5.0-example: springboot3.x + shardingsphere-5.5.0 + nacos-2.3.0 + mybatis-plus运行环境:jdk17/jdk21 + mysql8.0https://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的详细实战使用:
一、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}