README.md 2.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 通用id生成器设计说明

## 概述
 id生成在分布式系统或数据库mybatis等框架中经常会使用到。因为算法的不同生成的结果不同。
 
 对于需要不同算法生成id的场景,需要单独去实现。该项目提供一个idService用来支持不同算法生成对应id的能力。
 并支持自定义扩展新算法实现。该项目依赖于spring框架。所以需要使用时需要引入spring boot jar。
 
 ## 支持特性
 
 - 指定算法生成
 - 支持自定义拓展算法
 - 项目引入包, spring自动配置
 - 不支持算法抛错处理
 - 支持配置默认算法
16
 - 支持分布式ID 雪花算法
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
 
 ## 使用:
 
 1. 项目引入:
 ```xml
       <dependencies>
            <dependency>
                <groupId>com.kongxiang</groupId>
                <artifactId>kongxiang-spring</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
```

2. 使用 `idService` 生成id
```java

@Component
public class A{
  @Autowired
  private IdService idService ;
    
  public void useMethod(){
    String id = idService.generate();// 默认 uuid
    String id1 = idService.generate("uuid");// 指定
    Set<String> supports = idService.supports();// 获取支持的算法列表
    }
}
```

3. 拓展自定义算法和使用自定义覆盖

- 3.1 : 继承`com.kx.utils.id.IdGenerator` 编写自己的代码生成器,其中getAlgorithm()方法,提供算法名。
- 3.2 : spring 启动时自动加载您定义的生成器类。
- 3.3 : 如果自定义的 idGenerator中的getAlgorithm()方法提供的算法名在系统中有多个,
需要自己使用Spring的`Order`注解去配置优先级。
取Order最大值覆盖替换,如果Order最大值相等,取类名按字符串字典大小比对后最大值的一个。

55
4. 修改默认算法,修改通过generate()方法使用的算法。默认使用`uuid`
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
```java
   /**
    * 本地机器uuid id 生成器
    * @author kongxiang
    */
   @Component
   public class LocalUuidGenerator implements IdGenerator {
   
   
       @Override
       public String generate() {
           return UUID.randomUUID().toString().replace("-","");
       }
   
       @Override
       public String getAlgorithm() {
           return "uuid";
       }
   }
75 76 77 78 79 80 81
```

4.1 使用`application.yml` 修改默认的id生成器
```yaml
spring:
  utils:
    id:
82 83 84 85 86 87 88 89 90
      # 默认算法 'uuid' | 'snowflower'
      defaultIdGenerator: 'uuid' 
      # 雪花算法配置
      snowFlower: 
        dataCenterId: 1
        workerId: 1
    

```
91

92 93 94 95 96
4.2 支持雪花算法

 雪花算法名 `snowflower`