sharding-jdbc的使用,不强制依赖spring
本文简介
官网地址:https://shardingsphere.apache.org/document/current/cn/overview/
本文将说明sharding-jdbc的分片功能和数据加密功能
在项目的pom.xml中引入sharding-jdbc并编写配置文件
-
pom.xml增加依赖
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core</artifactId> <version>5.3.0</version> </dependency> 如果是在spring项目启动报错,查看报错信息可看到snakeyaml依赖冲突 所以这里一并将snakeyaml显示声明版本号 如果需要使用其它sharding-jdbc版本,那么相信解决依赖冲突问题并不困难... <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> </dependency>
-
编写sharding-jdbc的配置文件sharding-databases-tables.yaml
1.基础设置
# JDBC 逻辑库名称。在集群模式中,使用该参数来联通 ShardingSphere-JDBC 与 ShardingSphere-Proxy。
# 默认值:logic_db
databaseName : test
mode: # 不配置则默认单机模式
type: Standalone # 运行模式类型。可选配置:Standalone、Cluster
repository:
type: JDBC # 持久化仓库类型 如果你选择集群方式,那么可以使用zk、nacos等注册中心
2.数据源设置,如果需要分库那么可配置多个数据源
dataSources: # 数据源配置,可配置多个 <data-source-name>
ds_1: # 数据源名称
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource # 数据源完整类名
driverClassName: com.mysql.cj.jdbc.Driver # 数据库驱动类名,以数据库连接池自身配置为准
# 数据库 URL 连接,以数据库连接池自身配置为准
url: jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&allowMultiQueries=true&nullCatalogMeansCurrent=true&serverTimezone=UTC
username: root # 数据库用户名,以数据库连接池自身配置为准
password: root # 数据库密码,以数据库连接池自身配置为准
# ... 数据库连接池的其它属性
# ds_2: 数据源名称
# dataSourceClassName: com.alibaba.druid.pool.DruidDataSource # 数据源完整类名
# driverClassName: com.mysql.cj.jdbc.Driver # 数据库驱动类名,以数据库连接池自身配置为准
# 数据库 URL 连接,以数据库连接池自身配置为准
# url: jdbc:mysql://127.0.0.1/ry?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&allowMultiQueries=true&nullCatalogMeansCurrent=true&serverTimezone=UTC
# username: root # 数据库用户名,以数据库连接池自身配置为准
# password: root # 数据库密码,以数据库连接池自身配置为准
# ... 数据库连接池的其它属性
3.分片规则配置,分片策略对于分库和分表是通用的写法
rules:
- !SHARDING
tables: # 数据分片规则配置
user_info: # 逻辑表名称
actualDataNodes : ds_1.user_info_0,ds_1.user_info_1 # 由数据源名 + 表名组成(参考 Inline 语法规则)
# actualDataNodes : test.user_info,ry.user_info # 由数据源名 + 表名组成(参考 Inline 语法规则)
# databaseStrategy : # 分库策略,缺省表示使用默认分库策略,以下的分片策略只能选其一
# standard: # 用于单分片键的标准分片场景
# shardingColumn: # 分片列名称
# shardingAlgorithmName: user_info_db # 分片算法名称
# complex: # 用于多分片键的复合分片场景
# shardingColumns: # 分片列名称,多个列以逗号分隔
# shardingAlgorithmName: # 分片算法名称
# hint: # Hint 分片策略
# shardingAlgorithmName: # 分片算法名称
# none: # 不分片
tableStrategy: # 分表策略,同分库策略
standard: # 用于单分片键的标准分片场景
shardingColumn: uid # 分片列名称
# shardingAlgorithmName: user_info_table # 分片算法名称
shardingAlgorithmName: my_user_info_table # 分片算法名称
keyGenerateStrategy: # 分布式序列策略
column: id # 自增列名称,缺省表示不使用自增主键生成器
keyGeneratorName: snowflake # 分布式序列算法名称
# auditStrategy: # 分片审计策略
# auditorNames: # 分片审计算法名称
# - <auditor_name>
# - <auditor_name>
# allowHintDisable: true # 是否禁用分片审计hint
# autoTables: # 自动分片表规则配置
# t_order_auto: # 逻辑表名称
# actualDataSources (?): # 数据源名称
# shardingStrategy: # 切分策略
# standard: # 用于单分片键的标准分片场景
# shardingColumn: # 分片列名称
# shardingAlgorithmName: # 自动分片算法名称
# bindingTables (+): # 绑定表规则列表
# - <logic_table_name_1, logic_table_name_2, ...>
# - <logic_table_name_1, logic_table_name_2, ...>
# broadcastTables (+): # 广播表规则列表
# - <table_name>
# - <table_name>
# defaultDatabaseStrategy: # 默认数据库分片策略
# defaultTableStrategy: # 默认表分片策略
# defaultKeyGenerateStrategy: # 默认的分布式序列策略
# defaultShardingColumn: # 默认分片列名称
# 分片算法配置
shardingAlgorithms:
user_info_db: # 分片算法名称
type: INLINE # 分片算法类型
props: # 分片算法属性配置 t_user_$->{u_id % 8} 表示 t_user 表根据 u_id 模 8,而分成 8 张表,表名称为 t_user_0 到 t_user_7
algorithm-expression: user_info_$->{uid % 2}
# ...
user_info_table: # 分片算法名称
type: INLINE # 分片算法类型
props:
# 分片算法属性配置 t_user_$->{u_id % 8} 表示 t_user 表根据 u_id 模 8,而分成 8 张表,表名称为 t_user_0 到 t_user_7
algorithm-expression: user_info_$->{uid % 2}
my_user_info_table: # 自定义的分片算法
type: CLASS_BASED
props:
strategy: STANDARD
algorithmClassName: com.user.firm.config.PreciseShardingTableAlgorithm
# 分布式序列算法配置
keyGenerators:
snowflake: # 分布式序列算法名称
type: SNOWFLAKE # 分布式序列算法类型
# props: # 分布式序列算法属性配置
# ...
# 分片审计算法配置
# auditors:
# <sharding_audit_algorithm_name> (+): # 分片审计算法名称
# type: # 分片审计算法类型
# props: # 分片审计算法属性配置
# ...
4.数据加密配置,可和分片配合使用
此处说明一下,如果需要自定义加密策略,则需要使用spi机制进行注入
比如下列配置的SimpleAlgorithm,下面详细说明自定义加密的实现
- !ENCRYPT
tables:
user_info: # 加密表名称
columns:
nick_name: # 加密列名称 逻辑列 查询字段密文列 重命名到 逻辑列
plainColumn : nick_name # 原文列名称,在SQL查询中不直接使用,只是方便展示给开发人员看的
cipherColumn: nick_name_cipher # 密文列名称
encryptorName: assisted_encryptor # 密文列加密算法名称,查询字段使用
assistedQueryColumn: nick_name_assisted # 查询辅助列名称,查询条件使用,如果不指定默认密文列为查询辅助列
assistedQueryEncryptorName: sm3_encryptor # 查询辅助列加密算法名称
likeQueryColumn: nick_name_like # 模糊查询辅助列名称
likeQueryEncryptorName: like_encryptor # 模糊查询列加密算法名称
queryWithCipherColumn: true # 该表是否使用加密列进行查询
# 加密算法配置
encryptors:
name_encryptor: # 加解密算法名称
type: AES # 加解密算法类型
props: # 加解密算法属性配置
aes-key-value: 123456abc
assisted_encryptor: # 加解密算法名称
type: AES # 加解密算法类型
props: # 加解密算法属性配置
aes-key-value: 123456abc
sm4_encryptor: # 加解密算法名称
type: SM4 # 加解密算法类型
props: # 加解密算法属性配置
sm4-padding: PKCS7Padding
sm4-mode: ECB
sm4-key: 66b77319f642d2642fd334cf1a2f21a0
sm3_encryptor: # 加解密算法名称
type: SM3 # 加解密算法类型
props: # 加解密算法属性配置
SimpleAlgorithm: # 加解密算法名称
type: SimpleAlgorithm # 加解密算法类型
props: # 加解密算法属性配置
like_encryptor: # 加解密算法名称
type: CHAR_DIGEST_LIKE # 加解密算法类型
queryWithCipherColumn: true # 是否使用加密列进行查询。在有原文列的情况下,可以使用原文列进行查询
5.自定义加密的实现
自定义加密实现StandardEncryptAlgorithm接口并重写如下方法
并且在META-INF/路径下增加spi声明文件
内容为自定义加密函数的全路径
文件名为加密函数所实现的接口的全路径
public class SimpleAlgorithm implements StandardEncryptAlgorithm {
@Override
public Object encrypt(Object o, EncryptContext encryptContext) {
/*加密函数,o为需要加密字段的值 encryptContext表的信息
应返回 密文*/
return o;
}
@Override
public Object decrypt(Object o, EncryptContext encryptContext) {
/*解密函数,o为需要加密字段的值 encryptContext表的信息
应返回 明文*/
return o;
}
@Override
public Properties getProps() {
/*读取配置文件以及参数*/
return null;
}
@Override
public void init(Properties properties) {
/*
* 初始化配置文件
* */
}
@Override
public String getType() {
/*该算法在配置文件的类型名*/
return "SimpleAlgorithm";
}
- 全局参数,是否打印SQL,是否打印简单SQL
props:
sql-show: true
# sql-simple: true
7.读取配置文件声明数据源
File yamlFile = ResourceUtils.getFile("classpath:sharding-databases-tables.yaml");
DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);
效果展示
- 分表展示,执行SQL语句时 sharding 会根据分表规则重写SQL
- 加密展示,数据库中为密文,但查询到的结果会经过加密方法解密为为明文