天天看點

java 商城系統源碼分享-snowflake發号器

目的

snowflake是常見的id(編号)生成算法,由時間戳+業務id+機器id+序列号組合而成,在電商系統中,用于訂單号的生成、支付單号的生成等等。本發号器主要解決在容器化的部署情況時,自動擴容時保持機器id的唯一性。

本解決方案是基于spring boot實作,适合将發号器嵌入在應用内部,而非獨立的生成器app:

java 商城系統源碼分享-snowflake發号器

思路

難點在于擴容時,産生的一個app多個執行個體。 通過的app啟動時在redis中注冊自己,同時存在一個心跳,定時向redis中報告自己的存活。 如果挂掉,reids裡面清掉自己的執行個體,根據執行個體的情況運算workid。

java 商城系統源碼分享-snowflake發号器

代碼:

https://gitee.com/javashop/snowflake

使用

@Autowired    SnCreator snCreator;  
 public String test() {       
    String id = snCreator.create(1);   
    return id;  
}
           

其中create的參數是子業務id,不同子產品調用時加以區分。

整合

如果要整合進自己的app,參考JavashopAppRunner,使應用在啟動時,注冊自己的執行個體:

@Component
@Order(value = 1)
public class JavashopAppRunner implements ApplicationRunner {

    @Autowired
    protected InstanceContext instanceContext;


    @Override
    public void run(ApplicationArguments args) throws Exception {
        //注冊本執行個體
        instanceContext.register();

    }
    
}
           

以上為本次分享内容,更多精彩文章可以檢視我的文章清單,也可以關注我們公衆号 “易族智彙” ,每周都會有技術文章分享。

易族智彙(javashop)原創文章