From 14899b291edb29911cd725745fdf2f5bb712b67a Mon Sep 17 00:00:00 2001
From: tangmingyou <234767776@qq.com>
Date: Tue, 5 Apr 2022 21:38:14 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8Fid=E5=8F=B7=E6=AE=B5?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../net/sopod/soim/common/util/ImClock.java | 4 +-
im-das/im-das-user/pom.xml | 7 +-
.../das/user/service/HelloServiceImpl.java | 6 ++
.../src/main/resources/application.yml | 2 +-
.../DasImUserShardingTest.java} | 4 +-
.../user/service/SegmentIdGeneratorTest.java | 35 ++++++++++
.../{api => user}/auth/model/ReqLogin.java | 2 +-
.../auth/service/AuthService.java | 4 +-
.../{api => }/user/service/UserService.java | 2 +-
im-logic-api/im-segment-id-api/pom.xml | 17 +++++
.../config/SegmentIdAutoConfiguration.java | 37 +++++++++++
.../logic/api/segmentid/core/Segment.java | 34 ++++++++++
.../segmentid/core/SegmentIdGenerator.java | 56 ++++++++++++++++
.../segmentid/model}/NextSegmentParam.java | 2 +-
.../segmentid/model/SegmentRange.java} | 4 +-
.../segmentid/service/SegmentIdService.java | 17 +++++
.../logic/segmentid/api/model/Segment.java | 13 ----
.../api/service/SegmentIdService.java | 18 -----
.../main/resources/META-INF/spring.factories | 1 +
im-logic/im-logic-user/pom.xml | 66 +++++++++++++++++++
...serMain.java => LogicUserApplication.java} | 3 +-
.../logic/user/service/UserServiceImpl.java | 10 +++
im-logic/im-segment-id/pom.xml | 2 +
.../service/SegmentIdServiceImpl.java | 17 ++---
.../test/SegmentIdApplicationTest.java | 6 +-
pom.xml | 18 ++++-
26 files changed, 330 insertions(+), 57 deletions(-)
rename im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/{test/DasUserApplicationTest.java => dao/DasImUserShardingTest.java} (92%)
create mode 100644 im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/service/SegmentIdGeneratorTest.java
rename im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/{api => user}/auth/model/ReqLogin.java (77%)
rename im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/{api => user}/auth/service/AuthService.java (63%)
rename im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/{api => }/user/service/UserService.java (75%)
create mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/config/SegmentIdAutoConfiguration.java
create mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/Segment.java
create mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/SegmentIdGenerator.java
rename im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/{segmentid/api/model/dto => api/segmentid/model}/NextSegmentParam.java (82%)
rename im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/{segmentid/api/model/dto/SegmentDTO.java => api/segmentid/model/SegmentRange.java} (75%)
create mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/service/SegmentIdService.java
delete mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/Segment.java
delete mode 100644 im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/service/SegmentIdService.java
create mode 100644 im-logic-api/im-segment-id-api/src/main/resources/META-INF/spring.factories
rename im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/{UserMain.java => LogicUserApplication.java} (80%)
create mode 100644 im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/service/UserServiceImpl.java
diff --git a/im-common/src/main/java/net/sopod/soim/common/util/ImClock.java b/im-common/src/main/java/net/sopod/soim/common/util/ImClock.java
index 4d7460d..c581f7d 100644
--- a/im-common/src/main/java/net/sopod/soim/common/util/ImClock.java
+++ b/im-common/src/main/java/net/sopod/soim/common/util/ImClock.java
@@ -40,8 +40,10 @@ public class ImClock {
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
- public static void setClock(Clock newClock) {
+ @Deprecated
+ private static void setClock(Clock newClock) {
Preconditions.checkNotNull(newClock);
+ // 有循环超时判断依赖,回调导致一直循环
Preconditions.checkArgument(
clock.millis() <= newClock.millis(),
"不允许回调时间: current=%s, new=%s",
diff --git a/im-das/im-das-user/pom.xml b/im-das/im-das-user/pom.xml
index 04cf859..4c0efe4 100644
--- a/im-das/im-das-user/pom.xml
+++ b/im-das/im-das-user/pom.xml
@@ -12,6 +12,11 @@
im-das-user
+
+ net.sopod
+ im-common
+ ${soim.version}
+
net.sopod
im-das-user-api
@@ -19,7 +24,7 @@
net.sopod
- im-common
+ im-segment-id-api
${soim.version}
diff --git a/im-das/im-das-user/src/main/java/net/sopod/soim/das/user/service/HelloServiceImpl.java b/im-das/im-das-user/src/main/java/net/sopod/soim/das/user/service/HelloServiceImpl.java
index a8294d2..d8f605e 100644
--- a/im-das/im-das-user/src/main/java/net/sopod/soim/das/user/service/HelloServiceImpl.java
+++ b/im-das/im-das-user/src/main/java/net/sopod/soim/das/user/service/HelloServiceImpl.java
@@ -1,8 +1,11 @@
package net.sopod.soim.das.user.service;
+import net.sopod.soim.logic.api.segmentid.core.SegmentIdGenerator;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.rpc.RpcContext;
+import javax.annotation.Resource;
+
/**
* HelloServiceImpl
*
@@ -12,6 +15,9 @@ import org.apache.dubbo.rpc.RpcContext;
@DubboService(version = "1.0.0")
public class HelloServiceImpl implements HelloService {
+ @Resource
+ private SegmentIdGenerator segmentIdGenerator;
+
@Override
public String sayHello(String name) {
System.out.println("be invoked! client:" + RpcContext.getClientAttachment().getObjectAttachments());
diff --git a/im-das/im-das-user/src/main/resources/application.yml b/im-das/im-das-user/src/main/resources/application.yml
index 605fdbe..2f6839d 100644
--- a/im-das/im-das-user/src/main/resources/application.yml
+++ b/im-das/im-das-user/src/main/resources/application.yml
@@ -4,7 +4,7 @@ dubbo:
registry:
address: nacos://124.222.131.236:3848
protocol:
- port: 8081
+ port: 3011
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
diff --git a/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/test/DasUserApplicationTest.java b/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/dao/DasImUserShardingTest.java
similarity index 92%
rename from im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/test/DasUserApplicationTest.java
rename to im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/dao/DasImUserShardingTest.java
index 8f0e4c5..686f64e 100644
--- a/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/test/DasUserApplicationTest.java
+++ b/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/dao/DasImUserShardingTest.java
@@ -1,4 +1,4 @@
-package nets.sopod.soim.das.user.test;
+package nets.sopod.soim.das.user.dao;
import net.sopod.soim.common.util.ImClock;
import net.sopod.soim.das.user.DasUserApplication;
@@ -18,7 +18,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DasUserApplication.class)
-public class DasUserApplicationTest {
+public class DasImUserShardingTest {
@Autowired
private UserMapper userMapper;
diff --git a/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/service/SegmentIdGeneratorTest.java b/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/service/SegmentIdGeneratorTest.java
new file mode 100644
index 0000000..9ce29a7
--- /dev/null
+++ b/im-das/im-das-user/src/test/java/nets/sopod/soim/das/user/service/SegmentIdGeneratorTest.java
@@ -0,0 +1,35 @@
+package nets.sopod.soim.das.user.service;
+
+import net.sopod.soim.common.util.ImClock;
+import net.sopod.soim.das.user.DasUserApplication;
+import net.sopod.soim.logic.api.segmentid.core.SegmentIdGenerator;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.annotation.Resource;
+
+/**
+ * SegmentIdGeneratorTest
+ *
+ * @author tmy
+ * @date 2022-04-04 09:34
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = DasUserApplication.class)
+public class SegmentIdGeneratorTest {
+
+ @Resource
+ private SegmentIdGenerator segmentIdGenerator;
+
+ @Test
+ public void test() {
+ long begin = ImClock.millis();
+ for (int i = 0; i < 100000; i++) {
+ System.out.println(segmentIdGenerator.nextId("im_user"));
+ }
+ System.out.println(ImClock.millis() - begin + "ms");
+ }
+
+}
diff --git a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/model/ReqLogin.java b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/model/ReqLogin.java
similarity index 77%
rename from im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/model/ReqLogin.java
rename to im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/model/ReqLogin.java
index 3984dee..1a9349e 100644
--- a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/model/ReqLogin.java
+++ b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/model/ReqLogin.java
@@ -1,4 +1,4 @@
-package net.sopod.soim.logic.api.auth.model;
+package net.sopod.soim.logic.user.auth.model;
/**
* LoginParam
diff --git a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/service/AuthService.java b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/service/AuthService.java
similarity index 63%
rename from im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/service/AuthService.java
rename to im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/service/AuthService.java
index 36e1185..8953309 100644
--- a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/auth/service/AuthService.java
+++ b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/auth/service/AuthService.java
@@ -1,6 +1,6 @@
-package net.sopod.soim.logic.api.auth.service;
+package net.sopod.soim.logic.user.auth.service;
-import net.sopod.soim.logic.api.auth.model.ReqLogin;
+import net.sopod.soim.logic.user.auth.model.ReqLogin;
/**
* AuthService
diff --git a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/user/service/UserService.java b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/service/UserService.java
similarity index 75%
rename from im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/user/service/UserService.java
rename to im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/service/UserService.java
index f7684a0..adc0ecf 100644
--- a/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/api/user/service/UserService.java
+++ b/im-logic-api/im-logic-user-api/src/main/java/net/sopod/soim/logic/user/service/UserService.java
@@ -1,4 +1,4 @@
-package net.sopod.soim.logic.api.user.service;
+package net.sopod.soim.logic.user.service;
/**
* UserService
diff --git a/im-logic-api/im-segment-id-api/pom.xml b/im-logic-api/im-segment-id-api/pom.xml
index ed9ccff..dd5c414 100644
--- a/im-logic-api/im-segment-id-api/pom.xml
+++ b/im-logic-api/im-segment-id-api/pom.xml
@@ -12,5 +12,22 @@
im-segment-id-api
+
+
+ org.springframework
+ spring-context
+ provided
+
+
+ org.apache.dubbo
+ dubbo
+ provided
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ compile
+
+
\ No newline at end of file
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/config/SegmentIdAutoConfiguration.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/config/SegmentIdAutoConfiguration.java
new file mode 100644
index 0000000..5ee758a
--- /dev/null
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/config/SegmentIdAutoConfiguration.java
@@ -0,0 +1,37 @@
+package net.sopod.soim.logic.api.segmentid.config;
+
+import net.sopod.soim.logic.api.segmentid.core.SegmentIdGenerator;
+import net.sopod.soim.logic.api.segmentid.service.SegmentIdService;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * SegmentIdAutoConfiguration
+ * o( ̄ヘ ̄o#)
+ *
+ * @author tmy
+ * @date 2022-04-05 21:02
+ */
+@ConditionalOnProperty(
+ prefix = "im-segment-id",
+ name = {"enabled"},
+ matchIfMissing = true
+)
+@Configuration
+public class SegmentIdAutoConfiguration {
+
+ @DubboReference
+ private SegmentIdService segmentIdService;
+
+ @Bean
+ public SegmentIdGenerator segmentIdGenerator() {
+ if (segmentIdService == null) {
+ throw new NullPointerException("segmentIdService bean not exists!");
+ }
+ return new SegmentIdGenerator(segmentIdService);
+ }
+
+
+}
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/Segment.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/Segment.java
new file mode 100644
index 0000000..87d1865
--- /dev/null
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/Segment.java
@@ -0,0 +1,34 @@
+package net.sopod.soim.logic.api.segmentid.core;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Segment
+ *
+ * @author tmy
+ * @date 2022-04-03 23:12
+ */
+public class Segment {
+
+ private final AtomicLong atomicId;
+
+ private final long end;
+
+ public Segment(long begin, long end) {
+ atomicId = new AtomicLong(begin);
+ this.end = end;
+ }
+
+ public boolean hasNext() {
+ return this.atomicId.get() <= this.end;
+ }
+
+ public long next() {
+ long id = this.atomicId.getAndIncrement();
+ if (id > this.end) {
+ throw new IllegalStateException("id最大值超过范围");
+ }
+ return id;
+ }
+
+}
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/SegmentIdGenerator.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/SegmentIdGenerator.java
new file mode 100644
index 0000000..efa2675
--- /dev/null
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/core/SegmentIdGenerator.java
@@ -0,0 +1,56 @@
+package net.sopod.soim.logic.api.segmentid.core;
+
+import net.sopod.soim.logic.api.segmentid.model.SegmentRange;
+import net.sopod.soim.logic.api.segmentid.service.SegmentIdService;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * SegmentGenerator
+ *
+ * @author tmy
+ * @date 2022-04-03 23:21
+ */
+public class SegmentIdGenerator {
+
+ private final SegmentIdService segmentIdService;
+
+ private final Map> segmentsMap;
+
+ public SegmentIdGenerator(SegmentIdService segmentIdService) {
+ this.segmentIdService = segmentIdService;
+ segmentsMap = new HashMap<>();
+ }
+
+ /**
+ * TODO 动态增加步长
+ * TODO 剩余数一半时, 异步更新 segment
+ * @param bizTag 业务标签,同一业务标签生成id唯一
+ * @return id
+ */
+ public long nextId(String bizTag) {
+ if (bizTag == null || bizTag.isEmpty()) {
+ throw new IllegalStateException("bizTag can not be empty!");
+ }
+ synchronized (bizTag.intern()) {
+ LinkedList segments = segmentsMap.computeIfAbsent(bizTag, tag -> {
+ LinkedList nextSegments = new LinkedList<>();
+ SegmentRange range = segmentIdService.nextSegmentId(bizTag);
+ Segment segment = new Segment(range.getBeginId(), range.getEndId());
+ nextSegments.add(segment);
+ return nextSegments;
+ });
+ Segment segment = segments.getFirst();
+ if (!segment.hasNext()) {
+ SegmentRange nextRange = segmentIdService.nextSegmentId(bizTag);
+ segment = new Segment(nextRange.getBeginId(), nextRange.getEndId());
+ segments.removeFirst();
+ segments.add(segment);
+ }
+ return segment.next();
+ }
+ }
+
+}
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/NextSegmentParam.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/NextSegmentParam.java
similarity index 82%
rename from im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/NextSegmentParam.java
rename to im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/NextSegmentParam.java
index 61b7e3e..2c58eea 100644
--- a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/NextSegmentParam.java
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/NextSegmentParam.java
@@ -1,4 +1,4 @@
-package net.sopod.soim.logic.segmentid.api.model.dto;
+package net.sopod.soim.logic.api.segmentid.model;
import lombok.Data;
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/SegmentDTO.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/SegmentRange.java
similarity index 75%
rename from im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/SegmentDTO.java
rename to im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/SegmentRange.java
index b52da8e..46e0b15 100644
--- a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/dto/SegmentDTO.java
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/model/SegmentRange.java
@@ -1,4 +1,4 @@
-package net.sopod.soim.logic.segmentid.api.model.dto;
+package net.sopod.soim.logic.api.segmentid.model;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -13,7 +13,7 @@ import java.io.Serializable;
*/
@Data
@Accessors(chain = true)
-public class SegmentDTO implements Serializable {
+public class SegmentRange implements Serializable {
private static final long serialVersionUID = 4767453140231279111L;
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/service/SegmentIdService.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/service/SegmentIdService.java
new file mode 100644
index 0000000..7c1625a
--- /dev/null
+++ b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/api/segmentid/service/SegmentIdService.java
@@ -0,0 +1,17 @@
+package net.sopod.soim.logic.api.segmentid.service;
+
+import net.sopod.soim.logic.api.segmentid.model.SegmentRange;
+
+/**
+ * SegmentIdService
+ *
+ * @author tmy
+ * @date 2022-04-02 23:07
+ */
+public interface SegmentIdService {
+
+ SegmentRange nextSegmentId(String bizTag);
+
+ SegmentRange nextSegmentId(String bizTag, Long step);
+
+}
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/Segment.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/Segment.java
deleted file mode 100644
index 05180f3..0000000
--- a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/model/Segment.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package net.sopod.soim.logic.segmentid.api.model;
-
-/**
- * Segment
- *
- * @author tmy
- * @date 2022-04-02 11:58
- */
-public class Segment {
-
-
-
-}
diff --git a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/service/SegmentIdService.java b/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/service/SegmentIdService.java
deleted file mode 100644
index 5ac20cc..0000000
--- a/im-logic-api/im-segment-id-api/src/main/java/net/sopod/soim/logic/segmentid/api/service/SegmentIdService.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.sopod.soim.logic.segmentid.api.service;
-
-import net.sopod.soim.logic.segmentid.api.model.dto.NextSegmentParam;
-import net.sopod.soim.logic.segmentid.api.model.dto.SegmentDTO;
-
-/**
- * SegmentIdService
- *
- * @author tmy
- * @date 2022-04-02 23:07
- */
-public interface SegmentIdService {
-
- SegmentDTO nextSegmentId(String bizTag);
-
- SegmentDTO nextSegmentId(String bizTag, Long step);
-
-}
diff --git a/im-logic-api/im-segment-id-api/src/main/resources/META-INF/spring.factories b/im-logic-api/im-segment-id-api/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..8a09a3e
--- /dev/null
+++ b/im-logic-api/im-segment-id-api/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=net.sopod.soim.logic.api.segmentid.config.SegmentIdAutoConfiguration
\ No newline at end of file
diff --git a/im-logic/im-logic-user/pom.xml b/im-logic/im-logic-user/pom.xml
index cc9a36a..fa91a7f 100644
--- a/im-logic/im-logic-user/pom.xml
+++ b/im-logic/im-logic-user/pom.xml
@@ -11,5 +11,71 @@
im-logic-user
+
+
+ net.sopod
+ im-logic-user-api
+ ${soim.version}
+
+
+ net.sopod
+ im-common
+ ${soim.version}
+
+
+ net.sopod
+ im-das-user-api
+ ${soim.version}
+
+
+ net.sopod
+ im-segment-id-api
+ ${soim.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j2
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
+
+
+ org.apache.dubbo
+ dubbo-spring-boot-starter
+
+
+ org.apache.dubbo
+ dubbo-registry-nacos
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
\ No newline at end of file
diff --git a/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/UserMain.java b/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/LogicUserApplication.java
similarity index 80%
rename from im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/UserMain.java
rename to im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/LogicUserApplication.java
index 8643dde..be34652 100644
--- a/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/UserMain.java
+++ b/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/LogicUserApplication.java
@@ -6,10 +6,11 @@ package net.sopod.soim.logic.user;
* @author tmy
* @date 2022-03-26 01:41
*/
-public class UserMain {
+public class LogicUserApplication {
public static void main(String[] args) {
}
}
+
diff --git a/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/service/UserServiceImpl.java b/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/service/UserServiceImpl.java
new file mode 100644
index 0000000..4da2f84
--- /dev/null
+++ b/im-logic/im-logic-user/src/main/java/net/sopod/soim/logic/user/service/UserServiceImpl.java
@@ -0,0 +1,10 @@
+package net.sopod.soim.logic.user.service;
+
+/**
+ * UserServiceImpl
+ *
+ * @author tmy
+ * @date 2022-04-04 10:03
+ */
+public class UserServiceImpl {
+}
diff --git a/im-logic/im-segment-id/pom.xml b/im-logic/im-segment-id/pom.xml
index 8542119..4534fd9 100644
--- a/im-logic/im-segment-id/pom.xml
+++ b/im-logic/im-segment-id/pom.xml
@@ -87,4 +87,6 @@
+
+
\ No newline at end of file
diff --git a/im-logic/im-segment-id/src/main/java/net/sopod/soim/logic/segmentid/service/SegmentIdServiceImpl.java b/im-logic/im-segment-id/src/main/java/net/sopod/soim/logic/segmentid/service/SegmentIdServiceImpl.java
index ac189d6..020aa77 100644
--- a/im-logic/im-segment-id/src/main/java/net/sopod/soim/logic/segmentid/service/SegmentIdServiceImpl.java
+++ b/im-logic/im-segment-id/src/main/java/net/sopod/soim/logic/segmentid/service/SegmentIdServiceImpl.java
@@ -6,8 +6,8 @@ import com.google.common.base.Preconditions;
import lombok.AllArgsConstructor;
import net.sopod.soim.common.util.ImClock;
import net.sopod.soim.common.util.ObjectUtil;
-import net.sopod.soim.logic.segmentid.api.model.dto.SegmentDTO;
-import net.sopod.soim.logic.segmentid.api.service.SegmentIdService;
+import net.sopod.soim.logic.api.segmentid.model.SegmentRange;
+import net.sopod.soim.logic.api.segmentid.service.SegmentIdService;
import net.sopod.soim.logic.segmentid.config.SegmentConfig;
import net.sopod.soim.logic.segmentid.mapper.SegmentIdMapper;
import net.sopod.soim.logic.segmentid.model.entity.SegmentId;
@@ -38,12 +38,12 @@ public class SegmentIdServiceImpl implements SegmentIdService {
private final SegmentConfig segmentConfig;
@Override
- public SegmentDTO nextSegmentId(String bizTag) {
+ public SegmentRange nextSegmentId(String bizTag) {
return nextSegmentId(bizTag, null);
}
@Override
- public SegmentDTO nextSegmentId(String bizTag, Long step) {
+ public SegmentRange nextSegmentId(String bizTag, Long step) {
SegmentId segmentId = segmentIdMapper.selectById(bizTag);
if (segmentId == null) {
String key = SegmentConfig.KEY_PREFIX_SEGMENT_ID_INSERT + bizTag;
@@ -79,12 +79,13 @@ public class SegmentIdServiceImpl implements SegmentIdService {
throw new RuntimeException(String.format("%s分段数据不存在,新增失败", bizTag));
}
}
+ // 在超时时间内根据表版本号字段(并发时重复更新)尝试获取新分段
long begin = ImClock.millis();
for (int i = 0; ; i++) {
if (i > 0) {
segmentId = segmentIdMapper.selectById(bizTag);
}
- SegmentDTO segment = getSegment(segmentId, step);
+ SegmentRange segment = this.getSegment(segmentId, step);
if (segment != null) {
if (i > 0)
logger.info("{} get segment try {} times", bizTag, i);
@@ -115,7 +116,7 @@ public class SegmentIdServiceImpl implements SegmentIdService {
return false;
}
try {
- Thread.sleep(100);
+ Thread.sleep(ThreadLocalRandom.current().nextInt(50) + 50L);
} catch (InterruptedException e) {
logger.error("wait release redis lock interrupted!", e);
}
@@ -128,7 +129,7 @@ public class SegmentIdServiceImpl implements SegmentIdService {
* @param dbSegmentId 当前DB segmentId
* @param step 步长
*/
- private SegmentDTO getSegment(SegmentId dbSegmentId, Long step) {
+ private SegmentRange getSegment(SegmentId dbSegmentId, Long step) {
step = ObjectUtil.defaultValue(step, dbSegmentId.getInitStep(), dbSegmentId.getInitStep());
Preconditions.checkState(step > 0, "步长需大于0");
// 开始id, 结束id
@@ -150,7 +151,7 @@ public class SegmentIdServiceImpl implements SegmentIdService {
return null;
}
// 更新成功
- return new SegmentDTO()
+ return new SegmentRange()
.setBeginId(currentId)
.setEndId(endId);
}
diff --git a/im-logic/im-segment-id/src/test/java/net/sopod/soim/logic/segmentid/test/SegmentIdApplicationTest.java b/im-logic/im-segment-id/src/test/java/net/sopod/soim/logic/segmentid/test/SegmentIdApplicationTest.java
index d6819d9..38677c1 100644
--- a/im-logic/im-segment-id/src/test/java/net/sopod/soim/logic/segmentid/test/SegmentIdApplicationTest.java
+++ b/im-logic/im-segment-id/src/test/java/net/sopod/soim/logic/segmentid/test/SegmentIdApplicationTest.java
@@ -2,8 +2,8 @@ package net.sopod.soim.logic.segmentid.test;
import net.sopod.soim.common.util.ImClock;
import net.sopod.soim.logic.segmentid.SegmentIdApplication;
-import net.sopod.soim.logic.segmentid.api.model.dto.SegmentDTO;
-import net.sopod.soim.logic.segmentid.api.service.SegmentIdService;
+import net.sopod.soim.logic.api.segmentid.model.SegmentRange;
+import net.sopod.soim.logic.api.segmentid.service.SegmentIdService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,7 +33,7 @@ public class SegmentIdApplicationTest {
new Thread(() -> {
try {
long begin = ImClock.millis();
- SegmentDTO segment = segmentIdService.nextSegmentId("im-user");
+ SegmentRange segment = segmentIdService.nextSegmentId("im-user");
System.out.println(idx + segment.toString() + (ImClock.millis() - begin));
}catch (Exception e){
System.out.println(idx + "fail:" + e.getMessage());
diff --git a/pom.xml b/pom.xml
index ba2ebd6..2a38844 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,12 +113,22 @@
1.18.22
provided
-
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
org.springframework.boot
spring-boot-starter
${spring-boot.version}
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ ${spring-boot.version}
+ compile
+
org.springframework.boot
spring-boot-starter-log4j2
@@ -134,6 +144,11 @@
lettuce-core
6.1.6.RELEASE
+
+ org.apache.dubbo
+ dubbo
+ ${dubbo.version}
+
org.apache.dubbo
dubbo-spring-boot-starter
@@ -188,7 +203,6 @@
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
- test
org.springframework