springboot多節(jié)點(diǎn)應(yīng)用里的雪花算法唯一性詳解
雪花算法的唯一性,在單個(gè)節(jié)點(diǎn)中是可以保證的,對應(yīng)kubernetes中的應(yīng)用,如果是橫向擴(kuò)展后,進(jìn)行多副本的情況下,可能出現(xiàn)重復(fù)的ID,這需要我們按著pod_name進(jìn)行一個(gè)workId的生成,我還是建議通過不引入第三方組件和網(wǎng)絡(luò)請求的前提下解決這個(gè)問題,所以我修改了kubernetes的yaml文件。
- k8s的yaml配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image:latest
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name # 獲取當(dāng)前 Pod 的名稱- 字符串(0~1024)數(shù)字方法,通過掩碼的方式
public static int stringToNumber(String input) {
// 使用CRC32計(jì)算字符串的哈希值
CRC32 crc = new CRC32();
byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
crc.update(bytes);
// 獲取哈希值并限制在0到1023之間
long hashValue = crc.getValue();
return (int) (hashValue % 1024);
}- 獲取服務(wù)器機(jī)器碼
/**
* 獲取機(jī)器碼.
* @return
*/
public static String getUniqueMachineId() {
StringBuilder uniqueId = new StringBuilder();
try {
// 獲取本機(jī)的IP地址
InetAddress localHost = InetAddress.getLocalHost();
uniqueId.append(localHost.getHostAddress()).append("_");
// 獲取網(wǎng)絡(luò)接口并獲取MAC地址
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
byte[] mac = networkInterface.getHardwareAddress();
if (mac != null) {
for (int i = 0; i < mac.length; i++) {
uniqueId.append(String.format("%02X", mac[i]));
if (i < mac.length - 1) {
uniqueId.append("-");
}
}
uniqueId.append("_");
}
}
// 添加系統(tǒng)信息作為補(bǔ)充
String osName = System.getProperty("os.name");
String osVersion = System.getProperty("os.version");
String userName = System.getProperty("user.name");
uniqueId.append(osName).append("_").append(osVersion).append("_").append(userName);
}
catch (Exception e) {
e.printStackTrace();
}
return uniqueId.toString();
}- ID生成器的改進(jìn)
@Slf4j
public class IdUtils {
static SnowFlakeGenerator snowFlakeGenerator;
public static String generateId() {
if (snowFlakeGenerator == null) {
long podNameCode = stringToNumber(Optional.ofNullable(System.getenv("POD_NAME")).orElse(stringToNumber(getUniqueMachineId())));
log.debug("podNameCode:{}", podNameCode);
snowFlakeGenerator = new SnowFlakeGenerator(podNameCode);
}
return snowFlakeGenerator.hexNextId();
}到此這篇關(guān)于springboot~多節(jié)點(diǎn)應(yīng)用里的雪花算法唯一性的文章就介紹到這了,更多相關(guān)springboot雪花算法唯一性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)嵌入式 Servlet容器
傳統(tǒng)的Spring MVC工程部署時(shí)需要將WAR文件放置在servlet容器的文檔目錄內(nèi),而Spring Boot工程使用嵌入式servlet容器省去了這一步驟,本文就來設(shè)置一下相關(guān)配置,感興趣的可以了解一下2023-12-12
mybatis plus 的動(dòng)態(tài)表名的配置詳解
這篇文章主要介紹了mybatis plus 的動(dòng)態(tài)表名的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
MyBatis-Plus中實(shí)現(xiàn)自定義復(fù)雜排序邏輯的詳細(xì)步驟
這篇文章主要介紹了MyBatis-Plus中實(shí)現(xiàn)自定義復(fù)雜排序邏輯,通過使用MyBatis-Plus的QueryWrapper和SQL原始片段,我們可以靈活地實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)排序邏輯,這種方法尤其適用于需要對數(shù)據(jù)進(jìn)行特定規(guī)則排序的場景,需要的朋友可以參考下2024-07-07
Java實(shí)現(xiàn)List與數(shù)組互相轉(zhuǎn)換的兩種方法
在 Java 編程中,List 和數(shù)組是兩種常用的數(shù)據(jù)結(jié)構(gòu),List 提供了動(dòng)態(tài)大小、豐富的操作方法,而數(shù)組則以其高效的隨機(jī)訪問和內(nèi)存效率著稱,在實(shí)際開發(fā)中,我們經(jīng)常需要在這兩者之間進(jìn)行轉(zhuǎn)換,本文將深入探討 List 與數(shù)組之間的相互轉(zhuǎn)換,需要的朋友可以參考下2025-12-12
Java Swing JFrame窗口的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing JFrame窗口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot整合SpringSecurity認(rèn)證與授權(quán)
在項(xiàng)目開發(fā)中,權(quán)限認(rèn)證是很重要的,尤其是一些管理類的系統(tǒng),對于權(quán)限要求更為嚴(yán)格,本文主要介紹了SpringBoot整合SpringSecurity認(rèn)證與授權(quán),感興趣的可以了解一下2023-11-11
JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式
今天小編就為大家分享一篇關(guān)于JAVA使用Elasticsearch查詢in和not in的實(shí)現(xiàn)方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)
在我們開發(fā)項(xiàng)目過程中,經(jīng)常需要定時(shí)任務(wù)來幫助我們來做一些內(nèi)容,本文介紹了springboot中設(shè)置定時(shí)任務(wù)的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12

