00:00
接下来我们来专门创建一个微服务,来编写我们秒杀所有的功能。首先对于我们秒杀这个业务来说,它最大的特点呢,就是拥有瞬间的高并发流量,比如我们这个秒杀时间一到,那现在呢,大家人都等着,大量请求全部涌进来,那对于这类的业务,我们最起码呢要做到,那它这个业务呢,要有他自己独立的模块,我们最好能独立部署,我们不跟别人混淆在一起,这样的话,我们即使大并发流量过来,如果压不住,也只是我们这个模块压不住,而不去影响其他的模块。好,我们现在就专门来创建一个微服务,我们来创建一个秒杀为服,来创建右键有一个model。我们还是使用spring的初始化向导com.T硅谷,我们现在呢是鼓励mail,我们叫秒杀鼓励mail second kill好,我们现在这个秒杀服务呢,我们把它这个包名来改一下。来写上秒杀,下一步来选中我们需要的模块,那现在先选一个版本212,我们这个spring boot DV tos,我们的开发工具,我们现在需要还有我们的long bank,包括我们现在web开发,我们来选中web,我们现在秒杀的页面,商品详情页,那些我们用商品系统的就行,那么可以不用模板引擎,包括我们这个秒杀,对于这些大并发的系统来说,我们肯定缓存要使用,所以我们提前呢,先来加上一个red,我就spring data red,包括我们可能要远程调用,我们来把open phone我们也来加上,好,我们现在呢就来加这几个模块来选择下一步finish先来创建出我们这个项目,那创建出来以后呢,我们这个项目我们来先添上依赖,我们每一个项目呢,都得依赖我们的common,好,我们先来上来dependency,我们的古力mail common,我们把这个common模块依赖过来,但是common模块里边呢,我们之前引入了西塔,我们现在这一块不需要不需要。
01:59
那我们就直接给它排除掉,在这来写一个exclusion来找到common项目里边来选一些啊它的西塔,西塔依赖把这个J坐标来复制过来。
02:11
好。接下来我们来对我们这个项目来做一个配置,我们现在引了reddi,包括我们赢了common common里边的有accos,那现在来配一下我们的这些,首先我们来配一个应用的名字,应用名字呢是我们这个秒杀项,包括我们给它来编排一个端口号,比如server port,我们就叫两万五吧。好,现在呢,我们再来写上我们这个注册中心的地址,Nacos discovery server ad drr12 7.0.0.1,那现在是8848,包括我们reddis的地址red host192.16 8.56.10。好,我们现在把这些公共配置我们先来加上,然后我们再来开启服务注册发现功能,保证他自己呢能注册到注册中心,Enable discovery client,我们先来启动服务来测试一下,看我们这个微服务能不能启动正常走,好,我们看到呢,这一块来启动报错,那启动报错的原因是我们说这个数据源的问题,我们common里边依赖了马贝蒂斯相关的,我们看。
03:12
给排除掉,也可以直接在这把数据源的自动配置一排除就行了,排除掉data source auto configuration,好,现在我们来重新启动我们这个项目,我们这个项目呢,专门来做我们的秒杀功能,好们现在项目呢,两万五端口启动正常,好我们把这个关掉,包括我们在这呢也来配置一下,那让我们这个项目以后启动呢,别占太多的内存,把这一块内存限制我们也来加上。好,那现在我们接下来说一下秒杀业务,首先我们这个秒杀业务来参照我们这一块的秒杀流程,我们秒杀呢,首先秒杀的商品要上架,那这个上架是一个什么操作来想秒杀这些商品呢?由于它我们这个高并发访问经常要用,我们不可能每一次进去都来查数据库,我们看页面展示的时候,去数据库看哪些商品要秒杀,包括秒杀的一些流程,我们都来实时查数据库,这样感觉太慢了,而且呢会把数据库压垮,所以呢,我们可以在秒杀的商品将要秒杀之前,我们提前呢把它上架,上架呢我们可以放到缓存中,那这样的话,我们商品的所有数据我们全部从缓存中拿,这样我们的数据库压力就不大,包括我们这个秒杀商品的,特别是它的库存处理,库存处理呢,我们每次也不应该去直接扣减数据库,我们也可以去将秒杀商品要用的库存们也上架到缓存里边,我们每次扣库存呢,从缓存里边来。
04:40
进行扣除就行了,好,那我们现在要做的第一个流程就是秒杀商品的上架,上架呢我们可以来做成一个叫定时任务,这个定时任务就是比如我们每天晚上11点的时候,我们将第二天将秒杀的商品呢,我们全部扫描,然后呢放到缓存里边,这样就是为了减轻我们第二天商品秒杀的时候我们数据库的这些压力,详细的流程呢,我们先放到这儿,我们先来说一下我们定时任务,所以我们现在呢,需要我们这个定时任务功能,定时任务是我们系统里边以后经常要用到的一些功能,比如我们每天支付的这些订单,我们去支付宝来进行一些对账操作的,我们这些对账单包括呢,每个月可能定期我们要进行一个财务汇总的,我们这些定时任务,包括在我们这个服务闲的时候,我们还可以定时去来统计一下当天所有信息数据的等等等等,我们后来呢,会用到非常多的定时任务场景,那这个定时任务该怎么做?
05:40
首先我们这个定时任务呢,有一个非常流行的框架叫cos,就是它,我们看到它这呢介绍它是一个任务的调度器,包括如果我们使用一些Java原生的API,比如我们原生里边呢,有一个timer这个类,我们也可以来做一些定时任务,特别是我们这个spring框架,它以原生的来支持我们这些定时任务,包括它的这个定时任务也是可以来整合我们这个cos来做定时任务,那我们要做定时任务,我们首先来说的第一个概念就是我们这个任务要什么时候执行,我们这个执行呢,得给一个时间计划,那这个时间计划呢,我们可以用一个表达式叫CH表达式,这个表达式的规则呢是这样,我们下边的这块规则呢,截自于我们cos的这一块文档,他呢,说我们这个chome表达式,它是一个字符串,字符串呢是六到七个属性,用我们这个空格分割的,这些属性呢,可以允许我们这些值,而且我们这个六到七位分。
06:40
也代表秒分时,还有我们这个每一月的第几天,我们说的日,还有哪一月,包括呢,我们周几,还有我们的年,整个呢就是秒分时日月周年,但是我们这个年呢,我们这个spring里边,它暂时不支持这个年的写法,而且我们这年的写法呢,也是可以来忽略的,所以我们正常来写的只需要六位,我们可以来写一个C表达式,这个表达式可以来指定。
07:09
我们一个任务什么时候执行,那这个表达式呢,我们来看每一位能出现什么样的字符,实际上在秒的位置,我们允许出现的值呢,比如零到59,而且这个位置呢,Yes yes,这是必须写的,零到59,那我写一个零,那就是这个整秒执行一,那就是在第一秒的时候执行。还有我们允许一些特殊字符,我们发现呢,这些特殊字符好多人都允许,比如这个逗号,杠星,还有我们这个斜线,这些呢,所有的位置我们发现均可允许这几个,那这几个是什么意思?第一个逗号指的是枚举,枚举意思我们在秒的位置,如果写个一逗号二,逗号五,逗号七,那就是第一秒,第二秒,第五秒、第七秒的时候,我们都去来执行这个任务,比如我们下边这个表达式,我们来看我们第一个位置,空格没分割,这是秒分时、日月周,我们这个秒呢,写个七九二十三,那就是在任意时刻,星星就代表任意时间,那相当于在每分钟的第七秒,第九秒、第23秒,我们都要启动这个任务。还有一个杠叫范围,比如我们来写了一个秒位置,写了一个七杠20,那就是在第七秒到第20秒之间,我们每秒呢都要执行一次,特别是我们这个。
08:30
定时任务它的精确只能精确到秒,不能精确到我们这个毫秒、纳秒等等级别,以及我们说的这个步长,我们也可以这么来写,比如我来写一个七杠五,那七杠五的意思呢,就是我们第七秒启动,每隔五秒执行一次,包括我们来写一个星杠五,星因为是任意时刻,那新杠五就是你任意时刻只要启动起来,然后呢,每五秒就执行一次,这是我们说的四个特别常用的通位符下来,还有我们说的这个问号,那这个问号呢,它是出现在日和周几的位置,那就是这这呢有一个日的位置,还有周几的位置,这是为了防止我们这个日期冲突的,所以我们一般就是在日和周几的位置,如果一个精确的另外一个呢,我们就可以来写一个问号,或者一个写星了,一个呢,就必须来写这个问号,那么现在呢,假设是这样子的秒分时日日的话呢,相当于是每月。
09:30
的一号,相当于我们每月的一号呢,我们就要执行这个任务,那如果周几呢?假设我们现在呢,想要让周二执行或者周日执行,我们这个呢,可以来写一杠七,一杠七代表的是Sunday,也就是说周日到我们这个Sunday,那如果我写一个Sunday Sunday,那现在呢,这个问题就来了,我们每月的一号呢,它不一定是周日,所以我们一般呢,在这一块可以有一个通配符,那就是来使用这个问号,包括我们这个LL呢代表最后一个,比如3L,由于一呢代表的是周日,二就代表周一,三就代表周二,那3L呢,就是每个月最后一个周二,包括我们说的这个通被符WW呢代表的是工作日,我们来看秒分时日,日的话呢,就是每个月的工作日,因为日是在我们这个每个月的几号这个时间,然后呢,月呢是每个月周几呢,我们无所谓,那么这块呢,没有指。
10:30
正周二,那是下面的这个表达式,每个月的工作日,我们也可以来写成LW,那就是每个月的最后一个工作日,包括我们井,井呢代表第几个,比如我们在这秒分时日月周周的话,我写一个五景二,二就代表第二个景呢,前边由于一是代表周日,所以五代表周四,那就是第二个周四,所以我们可以来写这么一些表达式,来让他执行这些定时任务,特别是这个表达式呢,如果大家不会写,我们还可以往上有非常多的生成表达式的CR,我们来搜索CR表达式,它呢有这个在线生成器,比如我们选中什么时候,比如秒,我们希望呢,他们在这些秒的时候呢,可以来执行,那么在秒的位置点一个指定,包括风中,我们希望呢,在从第五分钟开始,每三分钟执行一次我们这个任务,我们就可以把这个选中小时,我们希望每小时都要干这个。
11:30
的事日,比如我们希望呢,本月的最后一天,或者我们来指定一个日期,只要你在这儿有了你这个要指定的这些时间,你明确知道你要什么时候执行,然后我们在这月,比如我们来选中我们从三月到八月我们都来执行这个任务的话,那么就能看到下边呢,直接会为我们生成一个这个表达式,我就可以直接来使用这个表达式就行了,包括它也为我们生成了最后我们十次的运行时间,我们能看一下是否满足我们需要的要求,这是我们说的要做定时任务,我们先要会写一个表达式,就是这个可容表达式,来看一下几个表达式的示例,这个示例呢,也摘自于我们cos的官方网站的这个示例,比如看一下第一个事例,零零十二星星问号,那零秒分十那秒呢,就是十是12:12点整分整秒启动我们这个任务,那就是星,我们每一天呢。
12:30
都要启动,那我们现在呢,就是发艾特,我们在每天的12点,我们都会定时的执行这个任务,把我们现在看秒分时,我们发现这个日和周呢,这个位置一个是问号,一个就写星就行了,这个同位符呢,大家不能都写星,那这个意思呢,就是10:15整,我们去来执行下面这两个呢,表达式是一样的意思,这三个都是一样的意思,在年的位置写了一个行,而这个呢,在年的位置写了个2005,那就代表我们在2005年这个时候10:15来启动我们这个任务,我们再来看这个零星14,那这个代表的就是14点与秒的位置是零,那就是整秒,但是风钟的位置呢心,那就是每一分钟,也就是我们,我们每天我们两点整启动,然后呢,每一分钟启动一次,相当于我们两点整到02:59,那现在呢,就59次任务执。
13:30
行,我们每一分钟只执行这么一次,然后下下边这个也一样,我们14点整分钟启动,但是呢,我们接下来零杠五,那就是我们每五分钟执行一次,诶这个是反斜线五,那下边这个也一样,秒分时。十呢,那就是14点和18点这两个时间呢,我们都是整分钟启动,每隔五分钟执行一次,下边这个这是一个区间,比如说零到五分钟的时候才执行,那就是两点到2.05的时候,每一分钟执行一次,下边用更多的,比如我们来看上一个这个这一块呢,6L,我们来看一下秒分时、日、月、周、周的位置,是首先写了一个6L,因为一代表的是周日,那六就代表周五,L呢,就代表最后一个,那月的位置呢,日的位置,这是每月的每天,但是我们要求是最后一个周五,相当于每月的最后一个周五,我们10:15就来启动了,因为最后一个周五肯定不是每天都有最后一个周五。
14:36
所我们在这个位置呢,写一个问号同配就行了。那下边这个也一样,六景三,六呢就是周五景三,那就是第三个周五,每一个月的第三个周五,我们就去来执行我们这个任务就可以了,这是我们来写的一些克隆表达式的这个事例,那么下一节课就来看一下spring boot里边我们如何结合克隆表达式来写一个定时任务。
我来说两句