Skip to main content

oneCoupon牛券优惠系统

作者:程序员马丁

在线博客:https://nageoffer.com

note

热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。

什么是 oneCoupon 牛券?

oneCoupon 寓意为一个优惠券系统,同时起了个代号叫做牛券。

牛券是一款高性能优惠券系统,与其他网上优惠券系统不同,牛券能够承受近十万次查询和分发请求的高并发压力

项目旨在帮助校招和社招的同学掌握足够的亮点,为获得理想的 offer 助力。此次代码实现非常优雅,甚至细致到参数定义都蕴含深意,值得大家学习借鉴。

其中的一些亮点部分已重点标记,大家可根据实际情况学习即可。该图会持续更新。

业务架构

从优惠券的业务属性上来说,每个平台都离不开优惠券,优惠券又分为平台券和店铺券,在此之上券类型分为折扣券、满减券以及立减券。当然,优惠券的领取和使用同样具有限制,详情如下:

下方的业务架构图全面描述了项目的服务集合、组件库列表和基础设置层等要素,有助于用户快速了解牛券平台的顶层设计和业务细节,从零到一进行构建。

能力层部分虽然涵盖了多个问题解决方案,但与整个项目的亮点相比,这部分内容并非全面展示。随着学习的深入,大家将能够更清楚地理解和掌握这些内容,并从中获得更多的实际应用能力。

技术架构

我们选择了基于 Spring Boot 3 和 JDK17 进行底层建设,同时组件库的版本大多也是最新的。这样做既能享受新技术带来的性能提升,也能体验到新特性带来的惊喜。

如果用一张图来概括牛券的技术架构,其展现形态如下图所示。

技术架构涵盖了 SpringBoot 3、SpringCloudAlibaba、Nacos、Sentinel、Skywalking、RocketMQ 5.x、ElasticSearch、Redis、MySQL、EasyExcel、XXL-Job、Redisson 等技术。

学习项目需要什么前置技术?

虽然上面的技术点用到的很多,但是很多只是知道框架是做什么,会使用 API 即可满足开发条件,不需要深入原理。所以看着技术点比较多,但是上手必须的框架技术却很少。

其实强依赖的只有 分布式缓存 Redis消息队列 RocketMQ,其他大家都不需要刻意学习,课程讲的过程当中会说明。

从项目学习的角度上,大家需要至少做过一个 SpringBoot 项目,比如点评、外卖或者 SaaS 短链接。掌握了基本开发流程,就可以上手开始项目。

另外星球提供了 Redis 和 RocketMQ 的云中间件服务,大家可以直接使用。你只需在本地启动一个 5.7.x 版本的 MySQL,就可以开始项目学习了!

项目质量怎么样?

1. 兑换/秒杀优惠券

项目里没点秒杀逻辑,都不好意思说是高并发系统。在牛券中自然也是会存在的,针对高频优惠券会有较热的流量。

秒杀的类型也不是一成不变的,牛券中利用了两种完全不同的秒杀方式,并且详细介绍了两者的区别和对应的优惠券,让大家能够在合适的业务使用适合的架构方案。

2. 分发用户优惠券

为应对平台和商家的销售额提升,平台通过批量发送优惠券的方式主动推送给用户。我们开发了基于 Excel 文件的优惠券分发功能。考虑到常规的 Excel 文件解析常常导致内存占用过高和 OOM(内存溢出)问题,我们采用了 EasyExcel 解决方案以高效完成此功能。

并且 v1 版本业务分发逻辑中会通过默认的单条数据分发,然后再演变成 v2 批量分发,让大家直观看到这个过程中各自的性能差距。

3. 创建优惠券模板

很多同学都说后台增删改查没什么技术含量,在我看来其实并不是。

以创建优惠券模板举例,这是商家用户在后管平台里简单的一个创建流程,基本上算不上并发,但是会涉及到责任链设计模式、优雅记录操作日志、缓存预热等逻辑。如果把这些技能学会,可以很好应用到自己项目当中,增加代码的健壮性和可扩展。

4. 分库分表

现阶段但凡上点体量的公司,都得在分库分表和分布式数据库上进行抉择。相对于分布式数据库而言,我个人认为可能会有以下的不足,以下说法谨代表我个人看法:

  • 兼容性:部分分布式数据库并不能 100%兼容 MySQL,导致业务无法平滑迁移。

  • 技术储备:需要有这方面的分布式数据库专家,平常使用谁都可以,线上出现了问题不知道怎么解决才是致命。

  • 使用成本:阿里云和腾讯云没有开源版本,付费版本相对于 MySQL 成本偏高。TiDB 开源版本 Issue BUG 较多,商业未知。

所以,类似于以 ShardingSphere 为代表的分库分表框架依然抗打。我们在牛券里会大量应用,不仅局限于分表,更会和大家操作分库逻辑,让大家能更好的接收相关知识。

5. 防重复提交

如果涉及到多场景通用代码,写到业务里只是第一步,更重要的是能够掌握抽象的能力,SpringAOP 和注解相关的知识就必不可少。我们在文档和视频讲解的时候,先讲如何写到业务,然后再抽象到基础组件 SpringBoot Starter 中。

我们不仅会写功能代码,而且在一些具有代表性功能里,通过 Jmeter 和单元测试的方式给大家演示怎么出现的问题,以及复现出来。通过这种形式,可以更好的掌握系统在实际业务当中可能会出现的问题。

6. 解析 Excel 行数

很多项目是以讲解功能为目的,比如说只讲解怎么使用 EasyExcel 解析和写入 Excel 文件,而不说为什么要使用?

在牛券这个项目中,会先通过市场上主流的框架进行铺垫,讲解有什么样的问题,再说出最终方案的优点是什么。以下文举例,两个不同框架解析 100w 行记录的 Excel,获取行数功能,竟然存在如此大的性能差异。

7. 更多亮点

在这里简单列一下,就不再展开说了,其他非完全统计亮点如下:

  • 缓存击穿、穿透:绝对企业级解决方案,基本上牛券里的方案可以说是在当下环境下最为合适的。
  • 幂等逻辑:针对 Web 端 API 接口防重复提交,以及针对消息队列的防止重复消费,会给大家掰开揉碎进行讲解。
  • 线上配置:用个 Redis 默认配置跑个 Demo 以为这就是全部,其实大错特错,会在牛券里讲解最适合项目的淘汰策略等。
  • ......

这次牛券的项目质量是我付出很多精力打磨的,相信它会是继 12306 铁路购票、SaaS 短链接之后的面试新宠项目。

课程列表

课程将详细讲解项目中的每个技术细节,包括功能扩展和技术实现手段等。通过全程从零到一的视频教学,无论你是初学者还是有一定经验的开发者,都能轻松掌握项目知识和技能。📢 无需担心是否有相关项目经验,课程将帮助你从基础到高级全面提升能力。

1. 项目背景和规范

《牛券oneCoupon系统设计》第01小节:什么是牛券项目?

《牛券oneCoupon系统设计》第02小节:如何学习牛券项目?

《牛券oneCoupon系统设计》第03小节:牛券项目代码规范

《牛券oneCoupon系统设计》第04小节:依赖中间件&公有云使用讲解

2. 后台管理服务

《牛券oneCoupon系统设计》第05小节:从零到一创建SpringBoot项目&初始化通用配置

《牛券oneCoupon系统设计》第06小节:基于责任链模式创建优惠券模板

《牛券oneCoupon系统设计》第07小节:通过ShardingSphere完成优惠券分库分表

《牛券oneCoupon系统设计》第08小节:引入日志组件优雅记录操作日志

《牛券oneCoupon系统设计》第09小节:基于注解实现分布式锁防重复提交

《牛券oneCoupon系统设计》第10小节:开发优惠券模板结束、增加发行量等功能

《牛券oneCoupon系统设计》第11小节:RocketMQ5.x延时消息修改优惠券结束状态

《牛券oneCoupon系统设计》第12小节:EasyExcel解析百万Excel创建批量分发任务

《牛券oneCoupon系统设计》第13小节:通过线程池和延时队列优化推送任务创建响应时间

《牛券oneCoupon系统设计》第14小节:基于模板方法模式开发消息队列发送功能

《牛券oneCoupon系统设计》第15小节:开发XXL-Job定时任务执行推送任务

3. 分发&引擎服务

《牛券oneCoupon系统设计》第15小节:开发用户查询优惠券详情功能(缓存击穿)

《牛券oneCoupon系统设计》第16小节:开发用户查询优惠券详情功能(缓存穿透)

《牛券oneCoupon系统设计》第17小节:如何设置Redis内存淘汰策略?

《牛券oneCoupon系统设计》第18小节:开发用户优惠券分发功能(一)

《牛券oneCoupon系统设计》第19小节:开发用户优惠券分发功能(二)

《牛券oneCoupon系统设计》第20小节:通过策略模式执行消息发送能力

《牛券oneCoupon系统设计》第21小节:基于注解实现去重表消息防止重复消费

《牛券oneCoupon系统设计》第22小节:开发兑换/秒杀优惠券功能(一)

《牛券oneCoupon系统设计》第23小节:开发兑换/秒杀优惠券功能(二)

《牛券oneCoupon系统设计》第24小节:完成锁定/核销/退还优惠券功能

《牛券oneCoupon系统设计》第25小节:开发支持百万预约优惠券功能

《牛券oneCoupon系统设计》第26小节:推送用户优惠券已预约提醒

《牛券oneCoupon系统设计》第27小节:开发查询/取消优惠券预约提醒功能

4. 结算服务

《牛券oneCoupon系统设计》第28小节:基于多线程完成用户可用/不可用列表

《牛券oneCoupon系统设计》第29小节:完成订单扣减优惠券金额计算功能

5. 面试服务

《牛券oneCoupon系统设计》第30小节:压测优惠券推送任务分发性能

《牛券oneCoupon系统设计》第31小节:压测优惠券秒杀券性能

《牛券oneCoupon系统设计》第32小节:压测优惠券查询可用/不可用券性能

《牛券oneCoupon系统设计》第33小节:压测优惠券计算订单金额性能

《牛券oneCoupon系统设计》第34小节:如何将牛券oneCoupon写到简历上?

项目结构&分支

采用标准基于 Maven 的 SpringBoot 多 Modules 项目,并拆分通用基础组件避免技术类重复定义。而且,我们定义的包结构是适用于绝大部分场景的,你学完牛券,再去看公司的项目,基本上不会有违和。

为了让大家更好的学习,我们将课程和项目分支进行了结合。有一个完整代码 main 分支的技术上,然后开启了一个从零到一的分支,就是说会按照课程目录的形式,这样大家跟着写代码或者看的时候,能够做到绝对的循序渐进。

分支列表如下:

常见问题答疑

1. 牛券适合哪些同学?

  • 实习、秋招&春招简历不容易过筛,投递后经常已读不回。
  • 学历不错,但是因为项目缺少亮点,面试过程中基本不问项目,自身发挥有限,导致泡池子无果。
  • 平常工作 CRUD,想看看中大厂他们都会用些什么技术,消息队列、分库分表、缓存解决方案等,提升自己技术视野。
  • 学习复杂场景解决方案,秒杀、大数据量下数据分发等,提升自己对于技术的理解,看看架构师如何考虑问题。

2. 需要花多久学习?

马上要秋招了,现在换牛券 oneCoupon 学习时间需要花费多久?一般的话,根据星球里的同学反馈,跟着文档走下来应对面试,大概 10-15 天就好。如果底子好的同学,我估计一周不到就可以。

3. 没学过 SpringCloud 能学会么?

可以的,牛券里的架构我做了两种配置,如果你不想学 SpringCloud 或者不会,默认相关的配置是不开启的,比如 Nacos 这些。只有说你想开始这方面学习,修改个开关即可加入学习。

4. 学生能理解这么多技术方案么?

这次的文档非常从零到一,而且搭配上面说的分支方式学习,可以说手把手教学。相信大家只要做过一个 SpringBoot 项目,都能够学明白。

5. 如何把牛券写到我的简历上?

马哥在文档库最后给大家提供了牛券 oneCoupon 写到简历上的亮点、难点以及解决方案。其次,通过牛券去面试的小伙伴的面试题也会进行汇总,免费供大家学习使用。

如何学习牛券?

和 12306 和 SaaS 短链接不一样的是,牛券项目不再实行开源策略,仅加入星球的同学可学习,面试用牛券项目的同学会少很多。

  1. 加入知识星球:点击 🧧知识星球 跳转加入拿个offer-开源&项目实战星球;
  2. 开通权限:按照星球 oneCoupon牛券项目申请说明 提交 GitCode 项目申请。最迟一天内开通权限,一般小时内通过;
  3. 开始学习:根据 oneCoupon牛券项目文档 中汇总的资料,按照顺序学习即可,从零到一实现高并发牛券 oneCoupon 系统!

牛券 oneCoupon GitCode 项目仓库截图: