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