目的
snowflake是常見的id(編號)生成演算法,由時間戳+業務id+機器id+序列號組合而成,在電商系統中,用於訂單號的生成、支付單號的生成等等。本發號器主要解決在容器化的部署情況時,自動擴容時保持機器id的唯一性。
本解決方案是基於spring boot實現,適合將發號器嵌入在應用內部,而非獨立的生成器app:
思路難點在於擴容時,產生的一個app多個例項。 通過的app啟動時在redis中註冊自己,同時存在一個心跳,定時向redis中報告自己的存活。 如果掛掉,reids裡面清掉自己的例項,根據例項的情況運算workid。
程式碼: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)原創文章