电商秒杀系统:整体介绍

参考

ABP微服务示例

什么是电商秒杀系统--参考文档

项目需求

规模

模拟京东秒杀,千万级用户抢购十万商品。

秒杀业务流程

用户==》秒杀==》生成订单==》支付

单台服务器每秒查询率

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”

中台(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异步生成订单:
    • 聚合服务发布生成订单的消息
    • 订单服务订阅的消息,然后根据消息生成订单到数据库

高并发拆分原则

  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个项目服务

备注:也可以把全部需要启动的命令都写入到“一键批量启动”中,这样点击一次就行了

项目时序图

时序图

 

架构图

 

posted @ 2020-09-07 16:40  日积月累码农  阅读(1252)  评论(0编辑  收藏  举报