# 《Seckill秒杀系统》第72章:下单流程整合预约系统

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:在下单流程中整合预约系统,重点掌握下单流程与预约系统的整合流程,并理解下单流程与预约系统的整合方式,将多系统集成的思想灵活运用到实际项目中。

大家好,我是冰河~~

在前面的文章中,我们已经梳理了预约系统的业务流程,并且设计了最简化的接口交互逻辑,也实现了运营端和用户端的业务逻辑。接下来,就要整合下单流程与预约系统了。

# 一、前言

对于预约微服务和商品微服务以及订单微服务来说,都是分属于秒杀交易链路上不同的服务,用户通过商品微服务获取到商品的信息时,可以通过异步的方式来加载商品的预约配置信息和是否预约过商品的数据。

对于下单流程来说,在下单过程中,就需要通过预约微服务来校验秒杀商品是否开启了预约通道,如果秒杀商品开启了预约通道,并且秒杀商品的预约配置信息有效,则进一步校验用户是否预约了秒杀商品,只有预约秒杀商品成功的用户才能对商品进行抢购和下单。

# 二、本章诉求

整合下单流程与预约系统逻辑,在用户下单时,调用预约微服务检验用户是否能够正常下单,如果能够正常下单,则继续执行下单流程,如果不能正常下单,则提示用户不能正常下单。

# 三、预约系统提供服务

在下单流程整合预约系统的设计中,预约系统主要提供用户是否能够正常下单的校验逻辑。具体的校验逻辑实现步骤如下所示。

(1)新增SeckillReservationDubboService接口

预约系统通过Dubbo对外提供预约校验的执行逻辑,其他微服务如果需要校验用户是否符合预约微服务的校验逻辑,则只需要调用预约微服务对外提供的Dubbo接口即可。

源码详见:seckill-dubbo-interfaces工程下的io.binghe.seckill.dubbo.interfaces.reservation.SeckillReservationDubboService。

public interface SeckillReservationDubboService {
    boolean checkReservation(Long userId, Long goodsId);
}
1
2
3

checkReservation()方法返回boolean类型的数据,如果返回true则表示用户可以正常下单,如果返回false,则表示用户不能正常下单。

(2)新增SeckillReservationDubboServiceImpl类

SeckillReservationDubboServiceImpl类主要是SeckillReservationDubboService接口的实现类,并且以Dubbo服务的形式实现了SeckillReservationDubboService接口中定义的checkReservation()方法。

源码详见:seckill-reservation-application工程下的io.binghe.seckill.reservation.application.dubbo.SeckillReservationDubboServiceImpl。

@Component
@DubboService(version = "1.0.0")
public class SeckillReservationDubboServiceImpl implements SeckillReservationDubboService {

    @Autowired
    private SeckillReservationConfigCacheService seckillReservationConfigCacheService;
    @Autowired
    private SeckillReservationUserCacheService seckillReservationUserCacheService;

    @Override
    public boolean checkReservation(Long userId, Long goodsId) {
        //获取商品配置信息
        SeckillBusinessCache<SeckillReservationConfig> seckillReservationConfigCache = seckillReservationConfigCacheService.getSeckillReservationConfig(goodsId, 0L);
        //缓存中不存在配置数据
        if (!seckillReservationConfigCache.isExist()){
            return true;
        }
        //获取商品的具体配置信息
        SeckillReservationConfig seckillReservationConfig = seckillReservationConfigCache.getData();
        //商品配置为空,或者不是上线的状态,直接返回true,可以直接抢购下单
        if (seckillReservationConfig == null || !SeckillReservationConfigStatus.isOnline(seckillReservationConfig.getStatus())){
            return true;
        }
        //商品配置信息正常,则获取用户是否预约了商品
        SeckillBusinessCache<SeckillReservationUser> seckillReservationUserCache = seckillReservationUserCacheService.getSeckillReservationUserCacheByUserIdAndGoodsId(userId, goodsId, 0L);
        //用户预约的商品配置缓存为重试状态,或者不存在数据,则直接返回false
        if (seckillReservationUserCache.isRetryLater() || !seckillReservationUserCache.isExist()){
            return false;
        }
        //获取指定用户的商品预约信息
        SeckillReservationUser seckillReservationUser = seckillReservationUserCache.getData();
        return seckillReservationUser != null && SeckillReservationUserStatus.isNormal(seckillReservationUser.getStatus());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码