有两种配置方式,一种是使用系统提供的雪花算法,另一种是使用自定义的算法。
第一种:系统雪花算法:
// 系统默认使用雪花算法
userRuleConfiguration.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("ID", "snowflake"));
ShardingRuleConfiguration shardingRuleConfiguration = new ShardingRuleConfiguration();
shardingRuleConfiguration.getTables().add(userRuleConfiguration);
// 内置Snowflake分布式序列算法配置
Properties snowflakeProp = new Properties();
snowflakeProp.setProperty("worker-id", workid);
shardingRuleConfiguration.getKeyGenerators().put("snowflake",
new ShardingSphereAlgorithmConfiguration("SNOWFLAKE", snowflakeProp));
需要注意的是,这里的分配算法配置参数"SNOWFLAKE",参数提供workid。
第二种方式是:
// 增加分布式主键
userRuleConfiuration.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("ID", "mysnowflake"));
ShardingRuleConfiguration shardingRuleConfiguration = new ShardingRuleConfiguration();
shardingRuleConfiguration.getTables().add(userRuleConfiguration);
// 自定义分布式序列算法配置
Properties snowflakeProperties = new Properties();
snowflakeProperties.setProperty("worker-id", workid);
shardingRuleConfiguration.getKeyGenerators().put("mysnowflake",
new ShardingSphereAlgorithmConfiguration("SHLD_DEVICE_SNOWFLAKE", snowflakeProperties));
实现一个自定义ID生成算法类:
import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
public class SnowflakeKeyGenerator implements KeyGenerateAlgorithm {
@Override
public String getType() {
// 返回算法类型表示
return "SHLD_DEVICE_SNOWFLAKE";
}
@Override
public void init() {
// 这里可以进行必要的初始化
}
@Override
public Comparable<?> generateKey() {
// 这里自定义生成KEY的算法
Long lKey = 123456l;
return lKey;
}
}
具体的算法根据业务需要自定义实现。
最后还需要添加一个SPI配置,resource下面的META-INF/services生成一个文件org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm,配置算法类的全路径。
com.demo.cloudshield.server.config.SnowflakeKeyGenerator
这样就可以用于分布式id生成了。