电商秒杀系统:整体介绍
参考
项目需求
规模
模拟京东秒杀,千万级用户抢购十万商品。
秒杀业务流程
用户==》秒杀==》生成订单==》支付
单台服务器每秒查询率
900/s QPS(每秒查询率)
项目描述
该项目实现了千万级用户抢购十万商品的秒杀功能,具体包括产品展示、用户登陆注册、下单、支付、防刷等功能,运用jmeter做压力测试,
主要用到asp.net core、webapi、微服务、IdentityServer4、restful、redis、lua、nginx、Consul、RabbitMQ、限流、降级、skywalking、AutoMapper等技术
项目环境准备
服务器环境
- Linux=》CentOS 7/8:操作系统
- k8s:容器编排工具
- docker:容器
- nginx:web服务器
开发工具
- VS2019、MySql
压测工具
- jmeter
软件环境
- jquery 3.5
- bootstrap
- asp.net core mvc 3.1
- asp.net core 3.1
- IdentityServer4
- mysql 5.7
- RabbitMQ
- Consul
- skywalking
- redis+lua
项目结构说明:
说明:其他服务都是项目引用依赖框架层Cores和公共层Commons
框架层(Framework):组件层
- Cores(核心层 / 基础设施层):
- Cluster:集群、负载均衡组件
- DynamicMiddleware:动态中间调用组件
- Exceptions:异常组件
- Logs:日志组件
- MicroClients:微服务客户端组件
- Middleware:中台调用组件,用于管理微服务之间的通讯。暂时使用http协议的方式,后期优化可以改为grpc框架的方式
- Pollys:熔断降级
- Registry:注册
- Utils:工具
前台 (Fronts):前端
- SeckillFronts(秒杀前台):5007
- Seckill 控制器和视图:默认首页
- 调用聚合服务:wwwroot / js 中通过JavaScript脚本文件来调用 “秒杀聚合服务5006”
- Seckill 控制器和视图:默认首页
中台(Middles)
- Commons(公共层):
- 对象映射器:AutoMapper
- Web框架:AspNetCore
- ORM: EntityFrameworkCore
- 数据库: MySql
- 分布式缓存: CSRedisCore
- ProductServices(商品服务):5001
- OrderServices(订单服务):5002
- PaymentServices(支付服务):5003
- SeckillServices(秒杀服务):5004
- UserServices(用户服务): 5005
- SeckillAggregateServices(秒杀聚合服务):5006 ,集群时只要单独部署这个秒杀聚合服务就行
高并发集群实现
秒杀聚合服务集群
- 秒杀觉和服务做集群,扣减库存时直接从Redis缓存集群中扣减库存
- Redis缓存(Rdis没有做集群,只有一个redis):Redis + lua(批量执行、原子执行)
- 消息队列RabbitMQ异步生成订单:
- 聚合服务发布生成订单的消息
- 订单服务订阅的消息,然后根据消息生成订单到数据库
高并发拆分原则
- 拆分原则
- 系统角度:按照系统功能/业务拆分,比如:电商系统,商品,支付,订单,用户
- 功能角度:例如:商品添加,删除,批量更新,优惠券,使用,发放,添加
- 读写拆分:例如:商品读和写读商品的系统,写商品的系统
- 无状态原则
读商品的系统进行横向扩展,分流
生产环境 无状态服务(硬编码)+有状态配置(json文件) - 服务化原则
单机不行是否可以集群,使用nginx是否可以进行负载均衡 - 消息队列原则
解耦,异步,限流 - 缓存原则
本地缓存(一级缓存):内存缓存,和逬程同生死(字典)
本地分布式缓存(二级缓存):内存缓存,逬程共享,但是通过内网访问字典+ redis (内网)
分布式缓存(三级缓存):内存缓存,逬程共享,但是通过外网访问 - 异步并发化原则
async await实现异步操作
快速启动项目服务
单个服务启动
在项目的根目录下,建立一个或者多个bat文件,写入下面命令,然后双击打开就好
文件夹路径可以是完整路径,也可以是针对当前文件夹的相对路径
批量服务启动
START cmd /k " " 命令会自动打开多个窗口执行冒号内的命令
注意要把有依赖其他服务的命令放到最后一行,这里是参考端口号顺序
迁移注意
- 每个项目迁移前检查上下文Context文件,要有DbSet类的再迁移,没DbSet类的不用迁移
- 没有迁移文件的先生成迁移文件,或者删除迁移文件夹重新添加迁移,最后再更新数据库
- 可以在程序中一次生成整个数据库的sql脚本,然后在服务器上创建数据库,EF生成脚本命令:script-migration
项目启动顺序
mysql服务
consual服务
RabbitMQ服务
Redis服务
skywalking服务
一键批量启动7个项目服务
备注:也可以把全部需要启动的命令都写入到“一键批量启动”中,这样点击一次就行了
项目时序图
时序图
架构图
作者:日积月累码农
如有错误,欢迎您指出。
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。