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 短链接。掌握了基本开发流程,就可以上手开始项目。

项目质量怎么样?

1. 创建优惠券模板

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

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

2. 分库分表

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

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

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

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

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

3. 防重复提交

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

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

4. 解析 Excel 行数

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

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

5. 更多亮点

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

  • 缓存击穿、穿透:绝对企业级解决方案,基本上牛券里的方案可以说是在当下环境下最为合适的。
  • 秒杀流程:项目里没点秒杀逻辑,都不好意思说是高并发系统。在牛券中自然也是会存在的,针对高频优惠券会有较热的流量。
  • 幂等逻辑:针对 Web 端 API 接口防重复提交,以及针对消息队列的防止重复消费,会给大家掰开揉碎进行讲解。
  • 线上配置:用个 Redis 默认配置跑个 Demo 以为这就是全部,其实大错特错,会在牛券里讲解最适合项目的淘汰策略等。
  • ......

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

项目结构&分支

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

为了让大家更好的学习,我们将课程和项目分支进行了结合。有一个完整代码 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延时消息修改优惠券结束状态。
  • ......

常见问题答疑

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 项目仓库截图: