提交 e09412fa 编写于 作者: H HappyChan

完成支持领域的开发

上级 6de4cbde
......@@ -10,6 +10,10 @@
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
......@@ -30,13 +34,16 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<artifactId>lottery-domain</artifactId>
......
......@@ -9,7 +9,9 @@ import cn.happy.lottery.domain.award.service.goods.impl.RedeemCodeGoods;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......
package cn.happy.lottery.domain.support.ids;
/**
* @author Happy
* @description: 生成ID接口
* @date 2022/2/20
*/
public interface IIdGenerator {
/**
* 获取ID,目前有两种实现方式
* 1. 雪花算法,用于生成单号
* 2. 日期算法,用于生成活动编号类,特性是生成数字串较短,但指定时间内不能生成太多
* 3. 随机算法,用于生成策略ID
*
* @return ID
*/
long nextId();
}
package cn.happy.lottery.domain.support.ids;
import cn.happy.lottery.common.Constants;
import cn.happy.lottery.domain.support.ids.impl.RandomNumeric;
import cn.happy.lottery.domain.support.ids.impl.ShortCode;
import cn.happy.lottery.domain.support.ids.impl.SnowFlake;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @author Happy
* @description: Id 策略模式上下文配置「在正式的完整的系统架构中
* ID 的生成会有单独的服务来完成,其他服务来调用 ID 生成接口即可」
* 这里采用注解方式来进行自动装配,可以去了解 @Configuration 和 @Bean 的实现原理
* @date 2022/2/20
*/
@Configuration
public class IdContext {
@Bean
public Map<Constants.Ids, IIdGenerator> idGenerator(SnowFlake snowFlake, RandomNumeric randomNumeric, ShortCode shortCode) {
Map<Constants.Ids, IIdGenerator> idGeneratorMap = new HashMap<>();
idGeneratorMap.put(Constants.Ids.SnowFlake, snowFlake);
idGeneratorMap.put(Constants.Ids.ShortCode, shortCode);
idGeneratorMap.put(Constants.Ids.RandomNumeric, randomNumeric);
return idGeneratorMap;
}
}
package cn.happy.lottery.domain.support.ids.impl;
import cn.happy.lottery.domain.support.ids.IIdGenerator;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.RandomStringUtils;
/**
* @author Happy
* @description: 工具类生成 org.apache.commons.lang3.RandomStringUtils
* @date 2022/2/20
*/
@Component
public class RandomNumeric implements IIdGenerator {
@Override
public long nextId() {
return Long.parseLong(RandomStringUtils.randomNumeric(11));
}
}
package cn.happy.lottery.domain.support.ids.impl;
import cn.happy.lottery.domain.support.ids.IIdGenerator;
import org.springframework.stereotype.Component;
import java.util.Calendar;
import java.util.Random;
/**
* @author Happy
* @description: 短码生成策略,仅支持很小的调用量,用于生成活动配置类编号,保证全局唯一
* @date 2022/2/20
*/
@Component
public class ShortCode implements IIdGenerator {
@Override
public synchronized long nextId() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int week = calendar.get(Calendar.WEEK_OF_YEAR);
int day = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
StringBuilder idStr = new StringBuilder();
idStr.append(year - 2020);
idStr.append(hour);
idStr.append(String.format("%02d", week));
idStr.append(day);
idStr.append(String.format("%03d", new Random().nextInt(1000)));
return Long.parseLong(idStr.toString());
}
}
package cn.happy.lottery.domain.support.ids.impl;
import cn.happy.lottery.domain.support.ids.IIdGenerator;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import cn.hutool.core.net.NetUtil;
/**
* @author Happy
* @description: hutool 工具包下的雪花算法
* 15位雪花算法推荐:https://github.com/yitter/idgenerator/blob/master/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java
* @date 2022/2/20
*/
@Component
public class SnowFlake implements IIdGenerator {
private Snowflake snowflake;
@PostConstruct
public void init() {
// 0 ~ 31位,可以采用配置的方式使用
long workerId;
try {
workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
} catch (Exception e) {
workerId = NetUtil.getLocalhostStr().hashCode();
}
workerId = workerId >> 16 & 31;
long datacenterId = 1L;
snowflake = IdUtil.createSnowflake(workerId, datacenterId);
}
@Override
public long nextId() {
return snowflake.nextId();
}
}
package cn.happy.lottery.test.domain;/**
* @description:
* @author Happy
* @date 2022/2/20
*/ public class SupportTest {
public static void main(String[] args){
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册