likes
comments
collection
share

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

作者站长头像
站长
· 阅读数 92

大家好,我是程序员马丁。

今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。

什么是 oneCoupon 牛券?

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

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

项目旨在帮助校招和社招的同学掌握足够的亮点,为获得理想的 offer 助力。此次代码实现非常优雅,甚至细致到参数定义都蕴含深意,值得大家学习借鉴。其中的一些亮点部分已重点标记,大家可根据实际情况学习即可。

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

业务架构

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

看了牛券架构图之后想学?在线学习地址:oneCoupon 牛券系统

技术架构

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

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

框架技术和版本号关系如下表格所示。

技术名称版本官网
1Spring Boot基础框架3.0.7spring.io/projects/sp…
2SpringCloud Alibaba分布式框架2022.0.0.0-RC2github.com/alibaba/spr…
3SpringCloud Gateway网关框架2022.0.3spring.io/projects/sp…
4MyBatis-Plus持久层框架3.5.7baomidou.com
5MySQLOLTP 关系型数据库5.7.36www.mysql.com/cn
6Redis分布式缓存数据库Latestredis.io
7RocketMQ消息队列2.3.0rocketmq.apache.org
8ShardingSphere数据库生态系统5.3.2shardingsphere.apache.org
9FastJson2JSON 序列化工具2.0.36github.com/alibaba/fas…
10CanalBinLog 订阅组件1.1.6github.com/alibaba/can…
11HuTool小而全的工具集项目5.8.27hutool.cn
12Maven项目构建管理3.9.1maven.apache.org
13RedissonRedis Java 客户端3.27.2redisson.org
14Sentinel流控防护框架1.8.6github.com/alibaba/Sen…
15XXL-Job分布式定时任务框架2.4.1www.xuxueli.com/xxl-job
16BizLog操作日志工具3.0.6github.com/mouzt/mzt-b…
17EasyExcelExcel 处理工具4.0.1easyexcel.opensource.alibaba.com
18ElasticSearch分布式搜索引擎7.17.13github.com/elastic/ela…

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

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

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

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

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

项目质量怎么样?

1. 兑换/秒杀优惠券

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

2. 分发用户优惠券

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

3. 创建优惠券模板

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

4. 分库分表

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

  • 兼容性:部分分布式数据库并不能 100%兼容 MySQL,导致业务无法平滑迁移。
  • 技术储备:需要有这方面的分布式数据库专家,平常使用谁都可以,线上出现了问题不知道怎么解决才是致命。
  • 使用成本:阿里云和腾讯云没有开源版本,付费版本相对于 MySQL 成本偏高。TiDB 开源版本 Issue BUG 较多,商业未知。

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

5. 防重复提交

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

6. 解析 Excel 行数

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

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

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

7. 设计模式

好的代码设计自然离不开设计模式,牛券中在很多好的业务上合理运用了较多设计模式,包括不限于:策略、责任链、模板方法、单例、构造者模式等。而且会和大家讲解有设计模式和没有设计模式的区别,以及详细的如何应用规范等,帮助大家在业务上理解和使用设计模式。

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

8. 更多亮点

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

  • 缓存击穿、穿透:绝对企业级解决方案,基本上牛券里的方案可以说是在当下环境下最为合适的。
  • 幂等逻辑:针对 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 项目,并拆分通用基础组件避免技术类重复定义。而且,我们定义的包结构是适用于绝大部分场景的,你学完牛券,再去看公司的项目,基本上不会有违和。

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

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

分支列表如下:

  • main:主分支,包含最新代码和改动。
  • 20240708_init-code_ding.ma:初始化分支,包括一些公用代码,比如基础架构规约封装等。
  • 20240814_dev_create-template_chain_ding.ma:基于责任链模式创建优惠券模板。
  • 20240815_dev_coupon-tablue_shardingsphere_ding.ma:通过ShardingSphere完成优惠券分库分表。
  • 20240816_dev_operation-log_mzt-biz-log_ding.ma:引入日志组件优雅记录操作日志。
  • 20240817_dev_no-duplicate-submit_lock_ding.ma:基于注解实现分布式锁防重复提交。
  • 20240818_dev_other-coupon-template_feature_ding.ma:开发优惠券模板结束、增加发行量等功能
  • 20240821_dev_coupon-template-close_rocketmq5_ding.ma:RocketMQ5.x延时消息修改优惠券结束状态。
  • 20240822_dev_create-coupon-task_easyexcel_ding.ma:通过 EasyExcel 创建优惠券分发任务。
  • 20240823_optimize_create-coupon-task_threadpool-delayqueue_ding.ma:通过线程池和延迟队列优化分发任务创建流程。
  • 20240824_dev_coupon-task-execute_template-method_ding.ma:执行优惠券分发任务。
  • 20240825_dev_coupon-task-timing_xxl-job_ding.ma:通过 XXL-Job 定时执行优惠券分发任务。
  • 20240826_dev_coupon-template-query_cache_ding.ma:解决缓存击穿、穿透等问题。
  • 20240829_dev_coupon-distribute-v1-4_easyexcel-cache_ding.ma:一步步优化用户优惠券分发过程,提高执行性能。
  • 20240908_dev_acquire-coupon_seckill_ding.ma:通过缓存配合数据库以及 Canal 完成秒杀流程。
  • 20240910_dev_acquire-coupon-v2_seckill_ding.ma:通过缓存配合 ROcketMQ 消息队列完成秒杀流程。
  • ......

常见问题答疑

1. 牛券适合哪些同学?

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

2. 需要花多久学习?

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

3. 没学过 SpringCloud 能学会么?

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

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

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

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

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

预计牛券能写到简历上的内容大概在 26 条以上,以下举两个业务例子如下所示:

代码入口:

  • com.nageoffer.onecoupon.merchant.admin.controller.CouponTemplateController#createCouponTemplate

业务亮点:

  • 通过自定义注解 @NoDuplicateSubmit 防止用户重复点击创建按钮,进而导致多个重复请求同时创建相同优惠券模板。
  • 通过责任链模式验证商家创建优惠券提交参数是否正确,保障验证代码高内聚、低耦合,保障了开闭原则。
  • 通过 BizLog 操作日志框架记录商家对优惠券的操作行为,比如创建、增加发行量、结束等逻辑,确保系统行为留痕。
  • 为了支持大量商家创建优惠券记录,采用 ShardingSphere 分库分表方案,以提升优惠券模板的存储和查询效率。

代码入口:

  • com.nageoffer.onecoupon.merchant.admin.controller.CouponTaskController#createCouponTask

业务亮点:

  • 通过自定义注解 @NoRepeatSubmit 防止用户重复点击创建按钮,进而导致多个重复请求同时创建相同优惠券推送任务。
  • 使用 EasyExcel 解析百万量级用户优惠券推送 Excel 文件,避免因文件过大导致的内存溢出问题。
  • 通过线程池 ThreadPoolExecutor 和 Redisson 延时队列异步执行解析 Excel 文件行数,提高创建优惠券推送接口响应时间。
  • 为避免系统耦合,通过消息队列 RocketMQ 解耦用户优惠券推送和通知逻辑,后管模块发送推送消息并由分发模块进行消费。
  • 支持定时优惠券推送任务执行,通过 XXL-Job 定时任务扫描数据库记录,如达到发送时间调用消息队列触发执行流程。
  • 解决数据库查询IN语句导致的跨库连接表不存在问题,通过数据库粒度拆分成多个单独查询,然后在应用层进行合并方式解决。

牛券 oneCoupon GitCode 项目仓库截图:

新项目oneCoupon牛券来啦!今天和大家分享我写的第三个关于面试的硬核项目:oneCoupon 牛券系统。 什么是

转载自:https://juejin.cn/post/7413218910248353827
评论
请登录