Appearance
强制路由使用说明
1. 简介
在分库分表的场景下,可以通过编程的方式向 HintManager
中添加分片值,使得 sql 强制在某个库进行某些数据操作,该分片值仅在当前线程内生效;目前 comet 支持以下分库分表中间件:
- libra
- mycat
- shardingsphere
2. 快速开始
2.1 maven 依赖
原则上业务代码不能直接依赖 comet 的组件包,需要在业务模块所依赖的 comet-boot-starter 中依赖 comet 的组件包,具体需要根据分库分表的中间件选型决定,依赖其中一个 starter 即可,具体如下,在 comet-boot-starter 的 pom 文件中加入以下依赖:
xml
<!--default 不使用分库分表的情况-->
<dependency>
<groupId>com.dcits</groupId>
<artifactId>comet-boot-starter-sharding-default</artifactId>
</dependency>
<!--mycat 分库分表的中间件-->
<dependency>
<groupId>com.dcits</groupId>
<artifactId>comet-boot-starter-sharding-mycat</artifactId>
</dependency>
<!--shardingsphere 分库分表的中间件-->
<dependency>
<groupId>com.dcits</groupId>
<artifactId>comet-boot-starter-sharding-jdbc</artifactId>
</dependency>
<!--libra 分库分表的中间件-->
<dependency>
<groupId>com.dcits</groupId>
<artifactId>comet-boot-starter-sharding-libra</artifactId>
</dependency>
2.2 yaml 配置
需要根据分库分表中间件的类型配置强制路由实现类,具体如下:
yml
comet:
hint:
type: com.dcits.comet.dbsharding.galaxy.libra.HintLibraManager
type
:表示强制路由实现类,需要根据分库分表中间件的类型配置,具体配置如下:
- libra:
com.dcits.comet.dbsharding.galaxy.libra.HintLibraManager
- mycat:
com.dcits.comet.dbsharding.mycat.HintMycatManager
- shardingsphere:
com.dcits.comet.dbsharding.HintShardingManager
- 不使用分库分表:
com.dcits.comet.dbsharding.hint.HintDefaultManager
2.3 API 使用
HintManager
提供了强制路由的相关 api,具体如下:
java
public interface HintManager {
/**
* Gets node list.
*
* @param tableType 表类型,dao-api层的枚举TableTypeEnum的值
* @param tableName 表名
* @return 该table的所有数据节点 node list
*/
List<String> getNodeList(String tableType, String tableName);
/**
* Gets table id.
*
* @param node 数据节点
* @param tableName 表名
* @param dbType the db type
* @return 该table的所有分表信息 table id
*/
List<String> getTableId(String node, String tableName, String dbType);
/**
* 强制路由到node节点的tableId表
*
* @param node 数据节点
* @param tableId 分表节点
* @return instance instance
*/
HintManager getInstance(String node, String tableId);
/**
* 获取数据中心标识
*
* @param dataNodes 数据节点全集
* @param partitionName 匹配规则
* @param routerValue 路由值
* @return 中心标识 string
*/
default String getDataCenter(String[] dataNodes, String partitionName, String routerValue) {
return null;
}
/**
* 获取数据中心标识
*
* @param hintSchema 分片势力
* @param tableName 表名
* @param routerValue 路由值
* @return 中心标识 string
*/
default String getDataCenter(String hintSchema, String tableName, String routerValue) {
return null;
}
/**
* 根据分片id获取数据中心标识
*
* @param node 分片id
* @return 中心标识 string
*/
default String getDataCenter(String node) {
return null;
}
/**
* 清除强制路由信息
*/
void close();
具体使用示例如下:
java
@Autowired(required = false)
HintManager hintManager;
public List<Segment> getSegmentList(PartitionContext partitionContext, DataLocation dataLocation) {
String tableId = dataLocation.getTableId();
String nodeId = dataLocation.getNodeId();
try {
//设置强制路由
hintManager.getInstance(nodeId, tableId);
List<Map<String, Object>> list = cometBatchDao.selectSegmentList(getNamePace(
partitionContext.getStepName()), map,
partitionContext.getPartitionParam().getSegmentSize());
return mapToSegment(list);
} catch (Exception e) {
throw e;
} finally {
//清除路由信息
hintManager.close();
}
}