Sharding加载双数据源配置⽂件加密
Sharding 加载双数据源配置⽂件加密
详细介绍Sharding-JDBC
Sharding-JDBC是⼀个开源的适⽤于微服务的分布式数据访问基础类库,它始终以云原⽣的基础开发套件为⽬标。
Sharding-JDBC定位为轻量级java框架,使⽤客户端直连数据库,以jar包形式提供服务,未使⽤中间层,⽆需额外部署,⽆其他依
赖,DBA也⽆需改变原有的运维⽅式,可理解为增强版的JDBC驱动,旧代码迁移成本⼏乎为零。
Sharding-JDBC完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。从2016年开源⾄今,在经历了整体架构的数次精炼以及稳定性打磨后,如今它已积累了⾜够的底蕴,相信可以成为开发者选择技术组件时的⼀个参考。
1. 分库分表
SQL解析功能完善,⽀持聚合,分组,排序,LIMIT,TOP等查询,并且⽀持级联表以及笛卡尔积的表查询
⽀持内、外连接查询
分⽚策略灵活,可⽀持=,BETWEEN,IN等多维度分⽚,也可⽀持多分⽚键共⽤,以及⾃定义分⽚策略
基于Hint的强制分库分表路由
2. 读写分离
⼀主多从的读写分离配置,可配合分库分表使⽤
基于Hint的强制主库路由
3. 柔性事务
最⼤努⼒送达型事务
TCC型事务(TBD)
4. 分布式主键
统⼀的分布式基于时间序列的ID⽣成器
5. 兼容性
可适⽤于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使⽤JDBC
可基于任何第三⽅的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等
理论上可⽀持任意实现JDBC规范的数据库。⽬前⽀持MySQL,Oracle,SQLServer和PostgreSQL
6. 灵活多样的配置
Java
YAML大学老师工资一般多少钱一个月
Inline表达式
Spring命名空间
Spring boot starter
7. 分布式治理能⼒ (2.0新功能)
配置集中化与动态化,可⽀持数据源、表与分⽚策略的动态切换(2.0.0.M1)
客户端的数据库治理,数据源失效⾃动切换(2.0.0.M2)
基于Open Tracing协议的APM信息输出(2.0.0.M3)
sharding 介绍到这⾥了,⾄于怎么实现,⼀些原理啥的⼤家可以⾃⾏百度⼀下⼀起交流
代码部分
这⾥是通过AOP分包结合MyDatasourceRoutingAlgorithm,强制路由,⾃动切换数据源
@Aspect
@Order(1)
@Component
public class DataSourceAop {
private Logger logger= Logger(DataSourceAop.class);
/**
* xbb库切⼊点,读写分离shadingjdbc控制
*/
@Pointcut("execution(* com.bjcib.xbb.der.process.dao..*.*(..))")
public void switchDataSourceXbbDb() {
}
@Before("switchDataSourceXbbDb()")
public void xbbDbBefore() {
HintManager hintManager = Instance();
hintManager.tDatabaShardingValue("xbb_db");
}
/**
* 恢复默认数据源
*/
@After("switchDataSourceXbbDb()")
public void xbbDbAfter() {
//清理掉当前设置的数据源,让默认的数据源不受影响
HintManager hintManager = ();
if (hintManager != null) {
hintManager.clo();
}
}
/**
* dx库切⼊点,读写分离shadingjdbc控制
*/
@Pointcut("execution(* com.bjcib.xbb.der.process.dx..*.*(..))")
迎新年图片public void switchDataSourceDxDb() {
}
@Before("switchDataSourceDxDb()")
public void dxDbBefore() {
HintManager hintManager = Instance();
hintManager.tDatabaShardingValue("dx_db");
}
/**
* 恢复默认数据源
*/
@After("switchDataSourceDxDb()")
public void dxDbAfter() {
//清理掉当前设置的数据源,让默认的数据源不受影响
HintManager hintManager = ();
if (hintManager != null) {
hintManager.clo();
}
}
}
public class MyDatasourceRoutingAlgorithm implements HintShardingAlgorithm {
private Logger logger= Logger(MyDatasourceRoutingAlgorithm.class);
/**
* ⾃定义Hint 实现算法
* 能够保证绕过Sharding-JDBC SQL解析过程
* @param availableTargetNames
* @param shardingValue 不再从SQL 解析中获取值,⽽是直接通过下⾯代码参数指定
阿胶的做法* HintManager hintManager = Instance();
* hintManager.tDatabaShardingValue("ds_exchange");
* @return
*/
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
logger.info("shardingValue=" + shardingValue);
logger.info("availableTargetNames=" + availableTargetNames);
List<String> shardingResult = new ArrayList<>();
ListShardingValue<String> tmpSharding = (ListShardingValue<String>) shardingValue;
for(String value : Values()){
ains(value)) {
shardingResult.add(value);
}
}
return shardingResult;
}
}
配置⽂件
# xbb主
sharding.jdbc.datasource.names=xbb-master,xbb-slave,dx-master,dx-slave
sharding.jdbc.datasource.xbb-master.jdbc-url=jdbc:mysql://1.1.1.1:3306/***?characterEncoding=utf8&uSSL=fal&rverTimezone=Asia/Shanghai sharding.jdbc.datasource.xbb-master.urname=ENC(T+5WQIhjXbMKPdsfT8IzVfc0g)
sharding.jdbc.datasource.xbb-master.password=ENC(T+5WQIhjXbMKPT8IzVfc0g==-)
sharding.jdbc.datasource.xbb-master.sql.cj.jdbc.Driver
sharding.jdbc.pe=com.zaxxer.hikari.HikariDataSource
# xbb从
sharding.jdbc.datasource.xbb-slave.jdbc-url=jdbc:mysql://10.101.101.11:3306/***?characterEncoding=utf8&uSSL=fal&rverTimezone=Asia/Shanghai sharding.jdbc.datasource.xbb-slave.urname=ENC(T+5WQIhjXbMKPT8IzVfc0gqaf=)
sharding.jdbc.datasource.xbb-slave.password=ENC(T+5WQIhjXbMKPT8IzVfc0g==)
sharding.jdbc.datasource.xbb-slave.sql.cj.jdbc.Driver
大唐荣耀分集剧情sharding.jdbc.pe=com.zaxxer.hikari.HikariDataSource
# dx主
sharding.jdbc.datasource.dx-master.jdbc-url=jdbc:mysql://11.11.11.11:3306/***?characterEncoding=u
tf8&uSSL=fal&rverTimezone=Asia/Shanghai sharding.jdbc.datasource.dx-master.urname=ENC(luG8Au9PdxkaDg==)
sharding.jdbc.datasource.dx-master.password=ENC(T+5WQIhjXbMKPT8IzVfc0g)
sharding.jdbc.datasource.dx-master.sql.cj.jdbc.Driver
sharding.jdbc.pe=com.zaxxer.hikari.HikariDataSource
# dx从
sharding.jdbc.datasource.dx-slave.jdbc-url=jdbc:mysql://12.12.12.12:3306/***?characterEncoding=utf8&uSSL=fal&rverTimezone=Asia/Shanghai sharding.jdbc.datasource.dx-slave.urname=ENC(luG8Au9PfsddxkaDg==)
sharding.jdbc.datasource.dx-slave.password=ENC(T+5WQIhjXbMKfdg8IzVfc0g)
sharding.jdbc.datasource.dx-slave.sql.cj.jdbc.Driver
sharding.jdbc.pe=com.zaxxer.hikari.HikariDataSource
#
fig.sharding.master-slave-rules.xbb_db.masterDataSourceName=xbb-master
fig.sharding.master-slave-rules.xbb_db.slaveDataSourceNames[0]=xbb-slave
fig.sharding.master-slave-rules.dx_db.masterDataSourceName=dx-master
fig.sharding.master-slave-rules.dx_db.slaveDataSourceNames[0]=dx-slave
fig.sharding.default-data-source-name=xbb_db
fig.sharding.default-databa-strategy.hint.algorithm-class-name=com.bjcib.xbb.fig.MyDatasourceRoutingAl gorithm
jasypt可以通过jar⽣成,也可以通过代码来⽣成
鬼使神差的意思/**
* 加密⽅法
* @param salt 盐值
* @param targetString 待加密字符串
* @return 密⽂
*/
public static String encrypt(String salt, String targetString) {
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.tPassword(salt);
pt(targetString);
}
/**
* 解密⽅法
先染发还是先烫发
* @param salt 盐值
* @param targetString 待解密字符串
* @return 明⽂
*/
public static String decrypt(String salt,String targetString) {
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.tPassword(salt);
return encryptor.decrypt(targetString);
}
public static void main(String[] args) {
String salt = "salt";
String password = "123456";
// 进⾏加密操作
爱心公益活动String encryptString1 = encrypt(salt, password);
// 进⾏解密操作
String decryptString1 = decrypt(salt, encryptString1);
// 输出明⽂和密⽂
System.out.println("encryptString1="+encryptString1);
System.out.println("decryptString1="+decryptString1);
}
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-spring-boot-starter</artifactId> <version>${shardingsphere.version}</version>
</dependency>
<!-- 配置⽂件加密 -->
<dependency>
精湛的意思是什么<groupId>com.github.ulisbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.14</version>
</dependency>
先写到这⾥吧,感兴趣的同学看看⼤家⼀起学习交流