参考项⽬需求
规模
模拟京东秒杀,千万级⽤户抢购⼗万商品。秒杀业务流程
⽤户==》秒杀==》⽣成订单==》⽀付单台服务器每秒查询率900/s QPS(每秒查询率)
项⽬描述
该项⽬实现了千万级⽤户抢购⼗万商品的秒杀功能,具体包括产品展⽰、⽤户登陆注册、下单、⽀付、防刷等功能,运⽤jmeter做压⼒测试,主要⽤到asp.net core、webapi、微服务、IdentityServer4、restful、redis、lua、nginx、Consul、RabbitMQ、限流、降级、skywalking、等技术
项⽬环境准备
服务器环境
Linux=》CentOS 7/8:操作系统k8s:容器编排⼯具docker:容器
nginx:web服务器开发⼯具
VS2019、MySql压测⼯具
jmeter软件环境
jquery 3.5bootstrap
asp.net core mvc 3.1asp.net core 3.1IdentityServer4mysql 5.7RabbitMQConsulskywalkingredis+lua
项⽬结构说明:
说明:其他服务都是项⽬引⽤依赖框架层Cores和公共层Commons框架层(Framework):组件层
Cores(核⼼层 / 基础设施层):
Cluster:集群、负载均衡组件
DynamicMiddleware:动态中间调⽤组件Exceptions:异常组件Logs:⽇志组件
MicroClients:微服务客户端组件
Middleware:中台调⽤组件,⽤于管理微服务之间的通讯。暂时使⽤http协议的⽅式,后期优化可以改为grpc框架的⽅式Pollys:熔断降级Registry:注册Utils:⼯具前台 (Fronts):前端
SeckillFronts(秒杀前台):5007
Seckill 控制器和视图:默认⾸页
调⽤聚合服务:wwwroot / js 中通过JavaScript脚本⽂件来调⽤ “秒杀聚合服务5006”中台(Middles)
Commons(公共层):
对象映射器:AutoMapperWeb框架:AspNetCore
ORM: EntityFrameworkCore数据库: MySql
分布式缓存: CSRedisCoreProductServices(商品服务):5001OrderServices(订单服务):5002PaymentServices(⽀付服务):5003SeckillServices(秒杀服务):5004UserServices(⽤户服务): 5005
SeckillAggregateServices(秒杀聚合服务):5006 ,集群时只要单独部署这个秒杀聚合服务就⾏
⾼并发集群实现
秒杀聚合服务集群
秒杀觉和服务做集群,扣减库存时直接从Redis缓存集群中扣减库存
Redis缓存(Rdis没有做集群,只有⼀个redis):Redis + lua(批量执⾏、原⼦执⾏)消息队列RabbitMQ异步⽣成订单:
聚合服务发布⽣成订单的消息
订单服务订阅的消息,然后根据消息⽣成订单到数据库
⾼并发拆分原则
1. 拆分原则
1. 系统⾓度:按照系统功能/业务拆分,⽐如:电商系统,商品,⽀付,订单,⽤户2. 功能⾓度:例如:商品添加,删除,批量更新,优惠券,使⽤,发放,添加3. 读写拆分:例如:商品读和写读商品的系统,写商品的系统2. ⽆状态原则
读商品的系统进⾏横向扩展,分流
⽣产环境 ⽆状态服务(硬编码)+有状态配置(json⽂件)3. 服务化原则
单机不⾏是否可以集群,使⽤nginx是否可以进⾏负载均衡4. 消息队列原则
解耦,异步,限流5. 缓存原则
本地缓存(⼀级缓存):内存缓存,和逬程同⽣死(字典)
本地分布式缓存(⼆级缓存):内存缓存,逬程共享,但是通过内⽹访问字典+ redis (内⽹)分布式缓存(三级缓存):内存缓存,逬程共享,但是通过外⽹访问6. 异步并发化原则
async await实现异步操作
快速启动项⽬服务
单个服务启动
在项⽬的根⽬录下,建⽴⼀个或者多个bat⽂件,写⼊下⾯命令,然后双击打开就好⽂件夹路径可以是完整路径,也可以是针对当前⽂件夹的相对路径
批量服务启动
START cmd /k \" \" 命令会⾃动打开多个窗⼝执⾏冒号内的命令注意要把有依赖其他服务的命令放到最后⼀⾏,这⾥是参考端⼝号顺序
迁移注意
每个项⽬迁移前检查上下⽂Context⽂件,要有DbSet类的再迁移,没DbSet类的不⽤迁移没有迁移⽂件的先⽣成迁移⽂件,或者删除迁移⽂件夹重新添加迁移,最后再更新数据库
可以在程序中⼀次⽣成整个数据库的sql脚本,然后在服务器上创建数据库,EF⽣成脚本命令:script-migration
项⽬启动顺序
mysql服务
consual服务RabbitMQ服务Redis服务skywalking服务
⼀键批量启动7个项⽬服务
备注:也可以把全部需要启动的命令都写⼊到“⼀键批量启动”中,这样点击⼀次就⾏了
项⽬时序图
时序图
架构图
因篇幅问题不能全部显示,请点此查看更多更全内容