Skip to content

强制路由使用说明

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();
    }
}