From 9be56061eb20e9ebf13932cc2bf78515f0137056 Mon Sep 17 00:00:00 2001 From: lsy <18332763730@163.com> Date: Mon, 9 Apr 2018 17:30:54 +0800 Subject: [PATCH] =?UTF-8?q?boot-start-ssm=E6=A8=A1=E5=9D=97=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=8F=AF=E9=80=89=E7=9A=84=E5=88=86=E8=A1=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- all/docker/maven/shardbatis-2.0.0B.jar | Bin 0 -> 26511 bytes all/docker/rabbitmq/rabbitmq-runsh.sh | 2 +- all/quickStartDev/startKafka-kafka.sh | 3 + all/quickStartDev/startKafka-zookeeper.sh | 5 + boot-starter/boot-starter-ssm/README.md | 6 +- boot-starter/boot-starter-ssm/pom.xml | 10 ++ .../config/SqlSessionFactoryConfig.java | 17 +- .../micro/fast/common/shardbatis/IdShard.java | 13 ++ .../fast/common/shardbatis/IdShardUtils.java | 158 ++++++++++++++++++ .../shardbatis/config/ShardbatisConfig.java | 32 ++++ .../shardbatis/config/package-info.java | 4 + .../fast/common/shardbatis/package-info.java | 4 + .../shardbatis/properties/package-info.java | 4 + .../SsmDefaultShardStrategy.java | 66 ++++++++ .../shardstrategy/package-info.java | 4 + .../src/main/resources/shard_config.xml | 19 +++ pom.xml | 23 ++- 18 files changed, 363 insertions(+), 12 deletions(-) create mode 100644 all/docker/maven/shardbatis-2.0.0B.jar create mode 100644 all/quickStartDev/startKafka-kafka.sh create mode 100644 all/quickStartDev/startKafka-zookeeper.sh create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShard.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShardUtils.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/ShardbatisConfig.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/package-info.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/package-info.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/properties/package-info.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/SsmDefaultShardStrategy.java create mode 100644 boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/package-info.java create mode 100644 boot-starter/boot-starter-ssm/src/main/resources/shard_config.xml diff --git a/README.md b/README.md index 455a0db..e9c0d2d 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,7 @@ ### 本地部署文档详见[ms开发文档](./all/ms/deploy.md) ## 项目概览 - `mybatis-generator-extend-maven-plugin`模块是便于快速根据条件生成mybatis-generator-plugin配置文件的maven扩展插件,基本增 -删改查、按条件分页查询`dao` `servcie` `controller`层利用了词向量、卷积神经网络、使用人工智能技术进行代码语意分析(好吧,我吹不 -下去了)自动生成,自动生成70%代码,降低开发中重复性耗时工作,此插件可在其他项目中单独使用。 +删改查、按条件分页查询`dao` `servcie` `controller`层自动生成,自动生成70%代码,降低开发中重复性耗时工作,此插件可在其他项目中单独使用。 - 合理的拆分,拥有众多的可复用模块,开箱即用 - 高可用注册中心 - 高可用配置配置管理中心,通过`rabbitmq`支持配置刷新 @@ -25,7 +24,7 @@ - 支持docker容器部署 - 使用flume收集系统日志,便于日志分析 - 热点数据使用redis缓存 -- 多数据源支持 +- 多数据库,数据库分表支持 - 完善的项目使用文档 - 用心的开发者 ## 整体技术选型 diff --git a/all/docker/maven/shardbatis-2.0.0B.jar b/all/docker/maven/shardbatis-2.0.0B.jar new file mode 100644 index 0000000000000000000000000000000000000000..9b5f2cb00d4f69675cb46ee91cb95ac1e9743ed9 GIT binary patch literal 26511 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 literal 0 HcmV?d00001 diff --git a/all/docker/rabbitmq/rabbitmq-runsh.sh b/all/docker/rabbitmq/rabbitmq-runsh.sh index cafd704..c58a1bb 100644 --- a/all/docker/rabbitmq/rabbitmq-runsh.sh +++ b/all/docker/rabbitmq/rabbitmq-runsh.sh @@ -1,2 +1,2 @@ #!/usr/bin/env bash -docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 25672:25672 -p 4369:4369 rabbitmq \ No newline at end of file +docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 25672:25672 -p 4369:4369 -p 15672:15672 -p 15671:15671 rabbitmq:3-management \ No newline at end of file diff --git a/all/quickStartDev/startKafka-kafka.sh b/all/quickStartDev/startKafka-kafka.sh new file mode 100644 index 0000000..1d42b22 --- /dev/null +++ b/all/quickStartDev/startKafka-kafka.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +cd /opt/tools/kafka_2.11-1.1.0 +bin/kafka-server-start.sh config/server.properties \ No newline at end of file diff --git a/all/quickStartDev/startKafka-zookeeper.sh b/all/quickStartDev/startKafka-zookeeper.sh new file mode 100644 index 0000000..fbb1e5e --- /dev/null +++ b/all/quickStartDev/startKafka-zookeeper.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +cd /opt/tools/kafka_2.11-1.1.0 +bin/zookeeper-server-start.sh config/zookeeper.properties + + diff --git a/boot-starter/boot-starter-ssm/README.md b/boot-starter/boot-starter-ssm/README.md index 3e537b4..20d860f 100644 --- a/boot-starter/boot-starter-ssm/README.md +++ b/boot-starter/boot-starter-ssm/README.md @@ -27,4 +27,8 @@ spring-boot提供了默认的启动时执行数据库脚本功能,指定`sprin 更多的数据源,像增加多个druid数据源一样增加`com.micro.fast.common.init.properties.SqlInitProperties`类的配置bean,然后满足上述 两个数据源时同样要求即可。 - +### 启用基于shardbatis的分表功能 +- 通过设置shardbatis.configPath(shardbatis的xml配置文件的classpath路径)属性来激活分表功能.使用`@IdShard`来在mapper接口参数中指定分表策略字段 +或者`@IdShard('filedName')`来指定参数对象中哪个字段是分表策略所需的字段. +- shardbatis.tableCount 指定分表的数量 +- 注意,使用默认的分表策略的时候mapper接口中不允许使用只有一个map传递参数. diff --git a/boot-starter/boot-starter-ssm/pom.xml b/boot-starter/boot-starter-ssm/pom.xml index 0263333..92caa09 100644 --- a/boot-starter/boot-starter-ssm/pom.xml +++ b/boot-starter/boot-starter-ssm/pom.xml @@ -55,6 +55,16 @@ com.github.jsqlparser jsqlparser + + + org.shardbatis + shardbatis + 2.0.0B + + + net.sf.jsqlparser + jsqlparser + mysql diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/config/SqlSessionFactoryConfig.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/config/SqlSessionFactoryConfig.java index b94495a..703d261 100644 --- a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/config/SqlSessionFactoryConfig.java +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/config/SqlSessionFactoryConfig.java @@ -1,6 +1,7 @@ package com.micro.fast.common.config; import com.github.pagehelper.PageHelper; +import com.google.code.shardbatis.plugin.ShardPlugin; import com.micro.fast.common.config.param.MybatisParamConfig; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; @@ -8,12 +9,12 @@ import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.io.support.ResourcePropertySource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -49,6 +50,13 @@ public class SqlSessionFactoryConfig implements TransactionManagementConfigurer{ @Autowired private MybatisParamConfig mybatisParamConfig; + /** + * 分表插件的配置 + */ + @Autowired(required = false) + @Qualifier("shardPlugin") + private ShardPlugin shardPlugin; + /** * mybatis连接工厂bean * @return sqlSessionFactory @@ -97,7 +105,12 @@ public class SqlSessionFactoryConfig implements TransactionManagementConfigurer{ } } pageHelper.setProperties(properties); - sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper}); + // 选择性启用shardbatisf分表插件 + if (shardPlugin == null){ + sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper}); + } else { + sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper,shardPlugin}); + } //设置详细的配置 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); //开启下划线转驼峰命名 diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShard.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShard.java new file mode 100644 index 0000000..19b9f92 --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShard.java @@ -0,0 +1,13 @@ +package com.micro.fast.common.shardbatis; + +import java.lang.annotation.*; + +/** + * 指定分表依据的参数的注解,分表的参数上必须有这个注解 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +@Documented +public @interface IdShard{ + String value() default "id"; +} diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShardUtils.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShardUtils.java new file mode 100644 index 0000000..027a9de --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/IdShardUtils.java @@ -0,0 +1,158 @@ +package com.micro.fast.common.shardbatis; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +/** + * 根据idshard注解判断哪个参数是分表的依据,以及根据反射获取分表的依据参数的值 + * + * @author lsy + */ +@Slf4j +public class IdShardUtils { + + public static final String PARAM = "param"; + + /** + * 工具类私有构造防止被实例化 + */ + private IdShardUtils() { + + } + + /** + * 根据statementId反射出方法,查找方法中带有IdShard朱姐标记的参数,获取其值用于分表策略 + * + * @param params + * @param statementId + * @return + */ + public static Object getShardIdValue(Object params, String statementId) throws Exception { + int lastIndexOfD = statementId.lastIndexOf("."); + String methodName = statementId.substring(lastIndexOfD + 1); + String className = statementId.substring(0, lastIndexOfD); + Class aClass = null; + try { + aClass = Class.forName(className); + Method[] methods = aClass.getMethods(); + for (Method method : methods) { + String name = method.getName(); + int parameterIndex = 0; + // 方法名相同就找到了语句 + if (name.equals(methodName)) { + Parameter[] parameters = method.getParameters(); + for (Parameter parameter : parameters) { + parameterIndex++; + // 参数是否包含IdShard.class注解 + Annotation[] annotations = parameter.getAnnotations(); + for (Annotation annotation : annotations) { + // 找到带有分表标记符号的参数 + if (annotation.annotationType() == IdShard.class) { + Class type = parameter.getType(); + // statement是不是只有一个参数,有一个的参数的话参数类型应该相同.但是这一个参数不能是map类型 + if (params.getClass() == type) { + return getValueByFieldName((IdShard) annotation,params); + } else { + // 如果有多个参数的话,mybatis会把参数封装成map类型,key是param+参数的顺序 + String key = PARAM + (parameterIndex + 1); + Map map = (HashMap)params; + Object o = map.get(key); + return getValueByFieldName((IdShard) annotation,o); + } + } + } + + } + } + } + } catch (ClassNotFoundException e) { + log.info("sql语句对应的类不存在:{}", e); + } + // 找不到就返回null + return null; + } + + /** + * 根据注解和mybatis的参数 + * @param idShard + * @param params + * @return + * @throws Exception + */ + private static Object getValueByFieldName(IdShard idShard, Object params) throws Exception { + // 如果是基础类型(表明是主键)就直接返回 + if (isBasicType(params)) { + return params; + } else { + // 如果不是基础类型,就使用IdShard的value属性指定对象的哪个属性是分表策略需要的值 + String shardFieldName = idShard.value(); + if (StringUtils.isBlank(shardFieldName)) { + throw new Exception("the shardFieldName was not annotated"); + } + Field field = null; + try { + // 根据字段名反射获取字段的类类型 + field = params.getClass().getDeclaredField(shardFieldName); + } catch (NoSuchFieldException e) { + field = params.getClass().getSuperclass().getDeclaredField(shardFieldName); + } + // 设置属性的访问权限 + field.setAccessible(true); + // 获取对象中属性的值 + return field.get(params); + } + } + + /** + *  检查参数是不是基础类型 + * + * @param param + * @return + */ + private static boolean isBasicType(Object param) { + if (param == null) { + return false; + } + if (param instanceof String) { + return true; + } + if (param instanceof BigDecimal) { + return true; + } + if (param instanceof Integer) { + return true; + } + if (param instanceof Long) { + return true; + } + if (param instanceof Double) { + return true; + } + if (param instanceof Float) { + return true; + } + if (param instanceof Character) { + return true; + } + if (param instanceof Byte) { + return true; + } + if (param instanceof Short) { + return true; + } + if (param instanceof Boolean) { + return true; + } + return false; + } + + +} diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/ShardbatisConfig.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/ShardbatisConfig.java new file mode 100644 index 0000000..7b8d01c --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/ShardbatisConfig.java @@ -0,0 +1,32 @@ +package com.micro.fast.common.shardbatis.config; + +import com.google.code.shardbatis.plugin.ShardPlugin; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +/** + * shardbatis的配置 + * @author lsy + */ +@Configuration +public class ShardbatisConfig { + + /** + * shardPlugin的配置类,当这个配置属性不存在的时候分表插件不生效 + * @param xmlClassPath shard + * @return + */ + @Bean(name = "shardPlugin") + @ConditionalOnProperty(prefix = "shardbatis",name = "configPath",matchIfMissing = false) + public ShardPlugin shardPlugin(@Value("${shardbatis.configPath}") String xmlClassPath){ + ShardPlugin shardPlugin = new ShardPlugin(); + Properties properties = new Properties(); + properties.setProperty(ShardPlugin.SHARDING_CONFIG,xmlClassPath); + shardPlugin.setProperties(properties); + return shardPlugin; + } +} diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/package-info.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/package-info.java new file mode 100644 index 0000000..850d1e6 --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/config/package-info.java @@ -0,0 +1,4 @@ +/** + * shardbatis的java config 包 + */ +package com.micro.fast.common.shardbatis.config; \ No newline at end of file diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/package-info.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/package-info.java new file mode 100644 index 0000000..8cffa3d --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/package-info.java @@ -0,0 +1,4 @@ +/** + * 利用shardbatis实现分表 + */ +package com.micro.fast.common.shardbatis; \ No newline at end of file diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/properties/package-info.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/properties/package-info.java new file mode 100644 index 0000000..5fa6208 --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/properties/package-info.java @@ -0,0 +1,4 @@ +/** + * shardbatis插件配置参数 + */ +package com.micro.fast.common.shardbatis.properties; \ No newline at end of file diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/SsmDefaultShardStrategy.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/SsmDefaultShardStrategy.java new file mode 100644 index 0000000..966c8e4 --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/SsmDefaultShardStrategy.java @@ -0,0 +1,66 @@ +package com.micro.fast.common.shardbatis.shardstrategy; + +import com.google.code.shardbatis.strategy.ShardStrategy; +import com.micro.fast.common.config.SqlSessionFactoryConfig; +import com.micro.fast.common.shardbatis.IdShardUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.context.annotation.Configuration; + +/** + * 提供默认的分表策略 + * @author lsy + */ +@Slf4j +@Configuration +@AutoConfigureBefore(SqlSessionFactoryConfig.class) +public class SsmDefaultShardStrategy implements ShardStrategy{ + + + private static Integer tableCount; + + /** + * 分表策略的实现 + * @param baseTableName 逻辑表名 + * @param params mybatis语句的参数 + * @param statementId 语句的id,一般是类名.方法名 + * @return  + */ + @Override + public String getTargetTableName(String baseTableName, Object params, String statementId) { + StringBuilder shardTableName = new StringBuilder(baseTableName); + shardTableName.append("_"); + try { + Object shardIdValue = IdShardUtils.getShardIdValue(params, statementId); + if (shardIdValue == null){ + shardTableName.append("000"); + }else { + String s = shardIdValue.toString(); + Integer integer = Integer.valueOf(s); + Integer index = integer % tableCount; + if (index<10){ + shardTableName.append("00"+index); + } else if (index<100){ + shardTableName.append("0"+index); + } else { + shardTableName.append(index); + } + } + } catch (Exception e) { + log.info("分表失败:{}",e); + throw new RuntimeException("分表失败"); + } + + return shardTableName.toString(); + } + + /** + * springBoot不允许直接给静态变量赋值,但是可以通过非静态方法给静态变量赋值 + * @param tableCount + */ + @Value("${shardbatis.tableCount}") + public void setTableCount(Integer tableCount){ + SsmDefaultShardStrategy.tableCount = tableCount; + } +} diff --git a/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/package-info.java b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/package-info.java new file mode 100644 index 0000000..fc2f9a2 --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/java/com/micro/fast/common/shardbatis/shardstrategy/package-info.java @@ -0,0 +1,4 @@ +/** + *提供默认的分表策略 + */ +package com.micro.fast.common.shardbatis.shardstrategy; \ No newline at end of file diff --git a/boot-starter/boot-starter-ssm/src/main/resources/shard_config.xml b/boot-starter/boot-starter-ssm/src/main/resources/shard_config.xml new file mode 100644 index 0000000..33e185e --- /dev/null +++ b/boot-starter/boot-starter-ssm/src/main/resources/shard_config.xml @@ -0,0 +1,19 @@ + + + + + + + + + xxx.dao.UserMapper.insertSelective + xxx.dao.UserMapper.selectByPrimaryKey + xxx.UserMapper.updateByPrimaryKeySelective + + + + + + diff --git a/pom.xml b/pom.xml index 329f148..1837c47 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,8 @@ true 1.5.7 2.2.1 + 2.0.0B + 0.7.0 @@ -318,6 +320,17 @@ gatling-charts-highcharts ${gatling.version} + + + org.shardbatis + shardbatis + ${shardbatis.version} + + + net.sf.jsqlparser + jsqlparser + ${net.sf.jsqlparser.jsqlparser.version} + @@ -405,11 +418,11 @@ registry.cn-hangzhou.aliyuncs.com - - - - - + + + + +