赞
踩
需要根据SPI来注入
META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
内容:com.example.user.sharding.UserIdSharding
Java代码
- @Data
- public class UserIdSharding implements StandardShardingAlgorithm<String> {
- private static final String SHARDING_COUNT_KEY = "sharding-count";
-
- /**
- * 对应props配置
- */
- private Properties props = new Properties();
-
- private int shardingCount;
-
- /**
- * 初始化调用
- */
- @Override
- public void init() {
- shardingCount = getShardingCount();
- }
-
- private int getShardingCount() {
- Preconditions.checkArgument(props.containsKey(SHARDING_COUNT_KEY), "Sharding count cannot be null.");
- return Integer.parseInt(props.get(SHARDING_COUNT_KEY).toString());
- }
- /**
- * Standard Sharding
- * @param availableTargetNames real table
- * @param preciseShardingValue Single Sharding key
- * @return
- */
- @Override
- public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> preciseShardingValue) {
- long l = Long.parseLong(preciseShardingValue.getValue()) % shardingCount;
- for (String availableTargetName : availableTargetNames) {
- if (availableTargetName.endsWith(String.valueOf(l))) {
- return availableTargetName;
- }
- }
-
- return null;
- }
-
- /**
- * Complex Sharding
- * @param availableTargetNames real table
- * @param rangeShardingValue Multiple Sharding Key
- * @return
- */
- @Override
- public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<String> rangeShardingValue) {
- return null;
- }
-
- /**
- * SPI根据配置Type获取
- * @return
- */
- @Override
- public String getType() {
- return "USER_ID";
- }

配置
- spring:
- config:
- activate:
- on-profile: prod
- shardingsphere:
- datasource:
- names: master,slave
- master:
- type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://asus:3306/auth_db?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false
- username: auth_user
- password: zxc521cxzPass!
- slave:
- type: com.alibaba.druid.pool.DruidDataSource # 数据库配置,配置属性名 不同连接池,连接名不一样。根据数据库连接池DataSource来配置
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://dell:3306/auth_db?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false
- username: auth_user
- password: zxc521cxzPass!
- props:
- sql-show: true
- rules:
- readwrite-splitting:
- load-balancers:
- roundRobin:
- type: ROUND_ROBIN #从库路由算法,ROUND_ROBIN:轮询,RANDOM:随机
- data-sources:
- read-write_0:
- #自动发现数据源名称(配置动态读写分离规则显示),库中不配置则读写分离不生效,不配置则为静态分离,可以动态扩容。
- #只支持MySQL的自动发现,可以拓展成根据配置进行动态扩容?
- #auto_aware_data_source_name
- load-balancer-name: roundRobin #轮询算法
- read-data-source-names: slave #读库
- write-data-source-name: master #写库
- sharding:
- tables:
- users:
- table-strategy:
- standard:
- sharding-algorithm-name: table-inline
- sharding-column: user_id
- actual-data-nodes: read-write_0.users_$->{0..1} #read-write_0 为读写分离的逻辑表明
- sharding-algorithms:
- table-inline:
- type: USER_ID
- props:
- sharding-count: 2

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。