SpringBoot3+Vue3 开发高并发秒杀抢购系统
核心代码,注释必读
// download:
3w ukoou com
微服务架构
单体式架构与微服务架构 单体式架构与微服务架构 传统的应用构建方法专注于单体式架构。在单体式架构中,一个应用内的所有功能和服务都锁在一起,作为一个单元来运行。以任何方式对应用进行增添或改进时,其架构会变得愈加复杂。这使得在不拆开整个应用的前提下,优化应用中的任何单一功能变得更加困难。这也意味着,如果应用中的一个进程需要扩展,那么整个应用也都必须扩展。
在微服务架构中,应用中的每一核心功能独立运行。这样,开发团队可以构建和更新新的组件,以满足不断变化的业务需求,而不必中断整个应用。
面向服务的架构与微服务架构 微服务架构是面向服务的架构(SOA)的一种演进。这两种方法的相似之处在于,它们都将庞大、复杂的应用分解为更易处理的较小组件。由于它们的相似性,人们经常将 SOA 和微服务架构相混淆。二者的主要区别是它们的范围:SOA 是一种企业级的架构方案,而微服务则是应用开发团队的一种实施策略。
微服务架构的优势 微服务可通过分布式部署,大幅提升您的团队和日常工作效率。您还可以并行开发多个微服务。这意味着更多开发人员可以同时开发同一个应用,进而缩短开发所需的时间。
SpringBoot3+Vue3 开发高并发秒杀抢购系统 - 自定义日期工具类-DateUtil
import cn.hutool.core.date.DateUtil;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
* cn.hutool.core.date.DateUtil#date() 当前时间
* cn.hutool.core.date.DateUtil#dateSecond() 当前时间-忽略毫秒部分
*/
public class ShunShunDateUtil {
/**
* 1、获取当前时间
* @return
*/
public static Date getCurrentDate(){
return DateUtil.date();
}
/**
* 2、获取当前时间的时间戳(毫秒级)
* @return 时间
*/
public static long getCurrentTimestampMS() {
return DateUtil.current();
}
/**
* 3、获取当前时间的时间戳(秒级)
* @return 当前时间秒数
* @since 4.0.0
*/
public static long getCurrentTimestampS() {
return DateUtil.currentSeconds();
}
/**
* 4、当前时间格式化,格式 yyyy-MM-dd HH:mm:ss
* @return 当前时间的标准形式字符串
*/
public static String now() {
return DateUtil.now();
}
/**
* 5、当前日期格式化,格式 yyyy-MM-dd
* @return 当前日期的标准形式字符串
*/
public static String today() {
return DateUtil.today();
}
/**
* 1、获得指定日期所属季度,从1开始计数
* 2、获得指定日期的月份,从0开始计数
* 3、获得指定日期是所在年份的第几周
* 4、获得指定日期是所在月份的第几周
* 5、获得指定日期是这个日期所在月份的第几天
* 6、获得指定日期是这个日期所在月份的第几天
* 7、获得指定日期是星期几,1表示周日,2表示周一
* 8、判断指定日期是否为周末(周六或周日)
* 9、获得指定日期的小时数部分、分钟数部分、秒数部分、毫秒数部分
* 10、判断当前日期 是否为上午、是否为下午、是否为今年
* 11、返回当前日期的 月份、所在年份的第几周、所在月份的第几周、是这个日期所在月份的第几天、是星期几、小时数部分、分钟数部分、秒数部分、毫秒数部分
* 12、获得指定日期年份和季节、获得指定日期区间内的年份和季节
* 13、格式化日期时间、根据特定格式格式化日期、格式化日期时间、仅格式化日期部分、仅格式化时间、格式化为Http的标准日期格式、格式化为中文日期格式
* 14、解析UTC时间
* 15、解析CST时间
* 16、获取秒级别的开始时间、获取秒级别的结束时间
* 17、获取某小时的开始时间/结束时间、获取某分钟的开始时间/结束时间、、获取某天的开始时间/结束时间、、获取某周的开始时间/结束时间、获取某月的开始时间、获取某季度的开始时间、获取某年的开始时间
* 18、获取同一时刻 昨天、明天、上周、下周、上个月、下个月、
* 19、偏移毫秒数、秒数、分钟、小时、偏移天、偏移周、偏移月
* 20、获取指定日期偏移指定时间后的时间,生成的偏移日期不影响原日期
* 21、判断两个日期相差的时长、判断两个日期相差的毫秒数、判断两个日期相差的天数
* 22、计算指定时间区间内的周数、计算两个日期相差月数、计算两个日期相差年数、
* 23、当前日期是否在日期指定范围内、是否为相同时间
* 24、比较两个日期是否为同一天、比较两个日期是否为同一周、比较两个日期是否为同一月
* 25、计时,常用于记录某段代码的执行时间
* 26、计时器
* 27、生日转为年龄,计算法定年龄、是否闰年
* 28、计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
* 29、判定给定开始时间经过某段时间后是否过期、判定在指定检查时间是否过期
* 30、HH:mm:ss 时间格式字符串转为秒数、秒数转为时间格式
* 31、创建日期范围生成器
* 32、俩个时间区间取交集、俩个时间区间取差集
* 33、按日期范围遍历、创建日期范围生成器
* 34、通过生日计算星座、计算生肖
* 35、安全的日期比较
* 36、纳秒转毫秒、纳秒转秒
* 37、{@link Date} 转换为 {@link LocalDateTime},使用系统默认时区
* 38、获得指定年份的总天数、获得指定月份的总天数、
* 39、 创建{@link SimpleDateFormat}
* 40、获取时长单位简写
*/
public static void main(String[] args) {
}
}
二、自定义日期工具类-LocalDateUtils
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import lombok.extern.slf4j.Slf4j;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* LocalDateTime工具类
* LocalDateTime年月日十分秒;LocalDate日期;LocalTime时间;
* LocalDateTime 类型都带的有毫秒
*/
@Slf4j
public class LocalDateUtils {
/**
* hutool工具包提供的LocalDateTime工具类
* cn.hutool.core.date.LocalDateTimeUtil
* 1、获取当前时间
* 2、毫秒转{@link LocalDateTime}
* 3、{@link Date}转{@link LocalDateTime}
* 4、格式化日期时间为yyyy-MM-dd HH:mm:ss格式、格式化日期时间为指定格式、格式化日期时间为yyyy-MM-dd格式
* 5、日期偏移
* 6、获取两个日期的差
* 7、修改为一天的开始时间、修改为一天的结束时间
* 8、是否为周末(周六或周日)、获取{@link LocalDate}对应的星期值
* 9、检查两个时间段是否有时间重叠
* 10、获得指定日期是所在年份的第几周
* ...
*/
public static void main(String[] args) {
}
/**
* 比较两个时间的先后
* @param time1
* @param time2
* @return
* 0、相等
* -1、time1小于time2
* 1、tim1大于time2
*/
public static Integer compareLocalDateTime(LocalDateTime time1,LocalDateTime time2){
if(time1.equals(time2)){
return 0;
}else if(time1.isBefore(time2)){
return -1;
}else{
return 1;
}
}
/**
* LocalDateTime 转 LocalDate
* @param time
* @return (注意带了毫秒)
*/
private static LocalDate localdatetimeToDate(LocalDateTime time){
LocalDate localDate=time.toLocalDate();
log.info("localDate = " + localDate.toString());
return localDate;
}
/**
* LocalDateTime 转 LocalTime
* @param time
* @return (注意带了毫秒)
*/
private static LocalTime localdatetimeToTime(LocalDateTime time){
LocalTime localTime=time.toLocalTime();
log.info("localTime = " + localTime.toString());
return localTime;
}
/**
* 拆解时间子项
* @param time
* @param type
* 0、获取年份
* 1、获取月份
* 2、获取日期为所在月的几号
* 3、获取日期为周几(LocalDateTime---星期一为周一)
* 4、获取日期为当年的第几天
* 5、获取小时
* 6、获取分钟
* 7、获取秒
* @return
*/
public static Integer dismantleTime(LocalDateTime time, int type){
switch (type){
case 0:
return time.getYear();
case 1:
return time.getMonthValue();
case 2:
return time.getDayOfMonth();
case 3:
return time.getDayOfWeek().getValue();
case 4:
return time.getDayOfYear();
case 5:
return time.getHour();
case 6:
return time.getMinute();
case 7:
return time.getSecond();
default:
return 0;
}
}
/**
* LocalDateTime转换为Date
*
* @param dateTime 日期时间
* @return Date
*/
public static Date toDate(LocalDateTime dateTime) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
String dateString = simpleDateFormat.format(date);
Date result = null;//parse():String--->date
try {
result = simpleDateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}
}
三、日期处理小测试
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;
/**
* @author oldA
* @Description
* @date 2023/6/28
*/
public class LocalDateTest {
public static void main(String[] args) {
//1、获取当前时间
//2、自定义时间
//3、拆解时间子项
//4、 Date 转LocalDate
//4、LocalDateTime 转 LocalTime(时间)
//5、LocalDateTime 转 LocalDate(日期)
//6、比较两个时间的先后
//7、格式化日期时间为yyyy-MM-dd HH:mm:ss格式
//8、格式化日期时间为指定格式
//9、格式化日期时间为yyyy-MM-dd格式
//10、获取一天的起始和结束一刻-MM-dd格式
//11、日期偏移(加一天、减一天)
//12、获取昨天的起始和结束一刻
//13、获取昨天两个月前的起始时间
//14、获取当前日期所在月份的起始时间和结束时间
//1、获取当前时间
LocalDateTime nowLocalDateTime= LocalDateTimeUtil.now();
//2、自定义时间
LocalDateTime oFnocalDateTime= LocalDateTime.of(2022,10,16,20,50,50,50);
//2.1、 Date 转LocalDate
LocalDateTime localDateTime=LocalDateTimeUtil.of(DateUtil.date());
for (int i = 0; i < 8; i++) {
//3、拆解时间子项 返回年月日时分秒
System.out.println("i = " + LocalDateUtils.dismantleTime(oFnocalDateTime,i));
}
//4、 LocalDateTime 转 LocalTime(时间)
System.out.println(LocalDateUtils.localdatetimeToTime(nowLocalDateTime));
//5、 LocalDateTime 转 LocalDate(日期)
System.out.println(LocalDateUtils.localdatetimeToDate(nowLocalDateTime));
//6、比较两个时间的先后
System.out.println(LocalDateUtils.compareLocalDateTime(oFnocalDateTime,nowLocalDateTime));
//7、格式化日期时间为yyyy-MM-dd HH:mm:ss格式
System.out.println(LocalDateTimeUtil.formatNormal(nowLocalDateTime));
//8、格式化日期时间为指定格式
System.out.println(LocalDateTimeUtil.format(nowLocalDateTime,"yyyy/MM/dd"));
//8,1、格式化日期时间为yyyy-MM-dd格式
System.out.println(LocalDateTimeUtil.formatNormal(localDateTime));
//9、获取一天的起始和结束一刻
System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.beginOfDay(oFnocalDateTime))));
System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.beginOfDay(oFnocalDateTime))));
//10、日期偏移 (可操作任意类型 天、小时、月份等)
//10.1、 加一天
System.out.println(String.format("%s>>>>>>%s","日期偏移+加一天",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.offset(oFnocalDateTime,1, ChronoUnit.DAYS))));
//10.2、减一天
System.out.println(String.format("%s>>>>>>%s","日期偏移+减一天",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.offset(oFnocalDateTime,-1, ChronoUnit.DAYS))));
//11、获取昨天的起始和结束一刻
LocalDateTime yesterDayTime=LocalDateTimeUtil.offset(oFnocalDateTime,-1, ChronoUnit.DAYS);
LocalDateTime yesterdayTimeBegin=LocalDateTimeUtil.beginOfDay(yesterDayTime);
LocalDateTime yesterdayTimeEnd=LocalDateTimeUtil.endOfDay(yesterDayTime);
System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",LocalDateTimeUtil.formatNormal(yesterdayTimeBegin)));
System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",LocalDateTimeUtil.formatNormal(yesterdayTimeEnd)));
//12、获取昨天两个月前的起始时间
LocalDateTime temp1=LocalDateTimeUtil.offset(yesterDayTime,-2, ChronoUnit.MONTHS);
LocalDateTime temp2=LocalDateTimeUtil.beginOfDay(temp1);
System.out.println(String.format("%s>>>>>>%s","获取昨天两个月前的起始时间",LocalDateTimeUtil.formatNormal(temp2)));
//13、获取当前日期所在月份的起始时间和结束时间
Date temp3=LocalDateUtils.toDate(oFnocalDateTime);
//获取某月的开始时间
Date beginOfMonth=DateUtil.beginOfMonth(temp3);
//获取某月的结束时间
Date endOfMonth=DateUtil.endOfMonth(temp3);
System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.of(beginOfMonth))));
System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",LocalDateTimeUtil.formatNormal(LocalDateTimeUtil.of(endOfMonth))));
}
}
import cn.hutool.core.date.DateUtil;
import java.util.Calendar;
import java.util.Date;
/**
* @author oldA
* @Description
* @date 2023/6/28
*/
public class DateTest {
public static void main(String[] args) {
//1、获取当前时间
//2、自定义时间
//3、比较两个时间
//4、格式化日期时间为yyyy-MM-dd HH:mm:ss
//5、根据特定格式格式化日期
//6、获取一天的起始和结束一刻
//7、日期偏移(加一天、减一天)
//8、获取昨天的起始和结束一刻
//9、获取昨天两个月前的起始时间
//10、获取当前日期所在月份的起始时间和结束时间
//1、获取当前时间
Date currentDate=ShunShunDateUtil.getCurrentDate();
//2、自定义时间
Calendar calendar=Calendar.getInstance();
calendar.set(2022,10,16,20,50,50);
Date customDate=DateUtil.date(calendar);
//3、比较两个时间
System.out.println(DateUtil.compare(currentDate,customDate));
//4、格式化日期时间为yyyy-MM-dd HH:mm:ss
System.out.println(DateUtil.formatDateTime(customDate));
//5、根据特定格式格式化日期
System.out.println(DateUtil.format(customDate,"yyyy/MM/dd"));
//6、获取一天的起始和结束一刻
System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",DateUtil.formatDateTime(DateUtil.beginOfDay(customDate))));
System.out.println(String.format("%s>>>>>>%s","获取一天的起始和结束一刻",DateUtil.formatDateTime(DateUtil.endOfDay(customDate))));
//7、日期偏移 (可操作任意类型 天、小时、月份等)
//7.1、 加一天
System.out.println(String.format("%s>>>>>>%s","日期偏移+加一天",DateUtil.formatDateTime(DateUtil.offsetDay(customDate,1))));
//7.2、减一天
System.out.println(String.format("%s>>>>>>%s","日期偏移+减一天",DateUtil.formatDateTime(DateUtil.offsetDay(customDate,-1))));
//8、获取昨天的起始和结束一刻(偏移量影响原日期、如不想影响可使用offset)
Date yesterDayTime=DateUtil.offsetDay(customDate,-1);
Date yesterdayTimeBegin=DateUtil.beginOfDay(yesterDayTime);
Date yesterdayTimeEnd=DateUtil.endOfDay(yesterDayTime);
System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",DateUtil.formatDateTime(yesterdayTimeBegin)));
System.out.println(String.format("%s>>>>>>%s","获取昨天的起始和结束一刻",DateUtil.formatDateTime(yesterdayTimeEnd)));
//9、获取昨天两个月前的起始时间(偏移量影响原日期、如不想影响可使用offset)
Date temp1=DateUtil.offsetMonth(yesterDayTime,-2);
Date temp2=DateUtil.beginOfDay(temp1);
System.out.println(String.format("%s>>>>>>%s","获取昨天两个月前的起始时间",DateUtil.formatDateTime(temp2)));
//10、获取当前日期所在月份的起始时间和结束时间
//获取某月的开始时间
Date beginOfMonth=DateUtil.beginOfMonth(customDate);
//获取某月的结束时间
Date endOfMonth=DateUtil.endOfMonth(customDate);
System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",DateUtil.formatDateTime(beginOfMonth)));
System.out.println(String.format("%s>>>>>>%s","获取当前日期所在月份的起始时间和结束时间",DateUtil.formatDateTime(endOfMonth)));
}
}