01. 绪论
绪论部分,包括讲师介绍、初识电商项目、课程介绍、几个热身问题等模块。
(1)讲师介绍
知一老师
主讲项目实战课
高级架构师
擅长微服务系统基础架构
RPC
注册中心
MQ
分布式文件存储
分布式 K-V 存储
擅长互联网业务系统架构
电商系统
IM 系统
直播答题
(2)初识电商项目
淘宝核心流程
首页
taobao.com
搜索页
s.taobao.com
商品详情页
item.taobao.com
购物车页
cart.taobao.com
结算页
buy.taobao.com
下单支付页
cashiersa127.alipay.com
浏览 “我的商城”
前端
首页
搜索页
商品详情页
购物车页
结算页
下单页
支付页
秒杀
后台
首页
商品
订单
用户
运营
统计
设置
mymall 工程
my-web-front
mymall_root
模块数 20+
模块逻辑关系
模块名规范
包名规范
麻雀虽小五脏俱全
不止于此,不断拔高自己
(3)课程介绍
互联网研发流程
需求分析
产品、运营、架构师
站在不同视角进行需求分析
分析需求的关键是逻辑闭环
降本增效解决需求问题
两个案例
架构设计
架构师
根据规模和复杂度确定系统架构
架构是不断演进的
技术选型
架构师
选择合适的技术轻便式解决问题
代码落地
开发工程师
C
Java
Go
系统测试
测试工程师
自动化测试
性能压测
安全测试
部署运维
运维工程师
DevOps
智能运维
课程介绍
核心部分
需求分析
架构设计
技术选型
代码落地
扩展部分
内容扩展
服务拆分
IM 系统
模型总结
需求分析模型
电商模型
架构模型
课程目录介绍
(4)几个热身问题
你是怎样做需求分析的?有没有一套可以遵循的完整的思维框架或模型?
你了解哪些成熟的并被广泛应用的业务系统架构?
你怎样对一套系统做服务拆分?包括从零搭建的系统和已经运行很长时间的系统
在技术选型时,你会重点考虑哪几方面?
对微服务系统进行架构治理时,会涉及哪些方面?
什么是前后端分离?什么是前后端未分离?
亿级别的用户量,怎么同时做到账号登录、邮箱登录、手机号码登录呢?
数万级规格属性的商品,怎么进行统一的有效管理?
千万级别订单量,怎么同时做到根据订单id、买家id 和 卖家id 进行查询呢?
生成一个唯一的分布式 ID 有哪些方案?哪一个是省力和便捷的?
微信支付的流程是怎样的?
秒杀系统需要解决哪些关键问题呢?
02. 需求分析
需求分析部分,包括电商业务分析、需求分析模型、功能需求分析和非功能需求分析等模块。
(1)电商业务分析
电商模式
名词解释
B:Business 企业
C:Consumer 消费者
经营方式
B2B:1688
B2C:自营店
C2B:找靓机
C2C:闲鱼
O2O
online to offline
offline to online
offline to online to offline
滴滴,饿了么,快递
B2B2C
天猫
京东
C2B2C
转转优品
电商系统特性
技术应用新且广
业务非常复杂
用户多业务体量大
海量数据
电商模型分析
关键词
用户
商品
订单
交易平台
(2)需求分析模型
需求分析模型
功能需求
基础功能需求:核心且稳定
扩展功能需求:非核心、容易变化、 运营类
非功能需求
稳定性需求
高吞吐需求
高扩展需求
IM 系统需求分析
IM 功能需求
IM 基础功能需求
消息:私信消息,系统消息,云消息,离线消息
用户:登录,状态
联系人:个人联系人,系统联系人
IM 扩展功能需求
群消息
多媒体消息
子母号
红包
IM 非功能需求(三高需求)
高扩展(功能/容量)
高吞吐(高性能/高并发)
高稳定性(高可用/高可靠)
(3)功能需求分析
基础功能需求
商品发布
商品搜索
商品详情
购物车管理
订单提交
订单支付
即时通讯
扩展功能需求
营销系统
广告系统
物流系统
评论系统
推荐系统
直播系统
风控系统
客服系统
爬虫系统
推送系统
功能需求的逻辑闭环性
短视频系统举例
(4)非功能需求分析
高扩展
功能扩展
消息队列
数据结构
文档型 MongoDB
注册中心
工程结构
容量扩展
集群伸缩
无状态性
高吞吐
高性能
流程优化
异步
并行
代码优化
池化
数据结构优化
GC
算法优化
缓存优化
高并发
集群并发
扩展集群容量
单机并发
计算密集型并发:多进程、多线程
IO密集型并发:BIO、NIO(epoll)、AIO(IOCP node.js)
高稳定性
高可用
冗余:副本是分布式系统容错技术的唯一手段
高可靠
代码容错性
案例
TiDB 压测
03. 架构设计
架构设计部分,包括架构选型分析、架构治理分析、电商架构设计、服务化拆分等模块。
(1)架构选型分析
架构概述
架构随业务逐步演进,绝非固定
先基于需求设计业务架构,再设计技术架构
常见业务架构选型
单体架构
分层架构、面向服务架构
微服务架构
单体架构
概述
一个程序就是一个项目,一个进程就可包罗万象
启动一个进程,就可以直接为用户提供服务
是否用过或记得 war包
单体架构图
优势
劣势
开发(前期)简单、部署简单、测试简单、运维简单
快就是硬道理
创业之初,备受青睐
迭代越多,逻辑越臃肿
任何小改动,都需要重新编译和重新部署
技术栈受限,只能垂直扩展,且深陷其中
IM 单体架构案例
分层架构
概述
分层架构的每一层都是一个独立的程序,进行独立部署
分层之间存在依赖关系
每一层一般都是从单体架构的一个分层模块演化而来
分层架构图
优势
劣势
每层只关注核心职能,结构清晰,开发和维护成本低
有效解决每层的关键问题,防止单层架构无限扩大
方便引入不同的技术栈,快速解决问题和优化系统
部署、测试和运维成本增高
接口调用增多,网络延时增大,容错成本升高
IM 分层架构案例
微服务架构
概述
一种互联网系统中期常用的架构风格
整个系统划分成高度内聚的服务程序,服务之间相互协调和配合
每个服务独立开发、独立部署、独立维护
单一职责,关注分离,模块化和分而治之
通常与组织结构保持一致
微服务架构图
优势
劣势
业务系统之间充分低耦合和高内聚,业务影响降到最低
拆分粒度更细,资源利用率更高
开发和维护效率也更高
服务化的实例增多,会带来服务治理的成本升高
上下游之间可能会形成很长的复杂的依赖链条,出现雪崩效应
出现其他技术问题,如:分布式事务、幂等性设计等等
IM 微服务架构案例
(2)架构治理分析
架构治理
指通过各种机制保证架构的稳定、高效和扩展,通常包含三方面
组件治理
远程调用
消息队列
注册中心
容错治理
限流
熔断
降级
监控治理
监控系统
链路追踪
日志系统
远程调用
理解 RPC
通信协议,基于网络表达语义和传达数据
像调用本地方法一样调用远程服务
扩展了算力,是微服务架构基础
RPC 作用
屏蔽了组包和解包
屏蔽了数据发送和接收
提高了开发效率
核心组成
对象代理
序列化和反序列化
网络模块
应用场景及调用方式
服务消费方关注服务提供方的计算结果
同步调用和异步调用
RPC 原理思考
RPC 框架是一个黑盒子,在同一内存空间如何实现对接口的调用?
消息队列
理解 MQ
保存消息的容器
避免进程直接通讯
消息具有高可靠性
MQ 角色
主题
生产者
订阅者
MQ 应用场景
一多应用
轻重分离
结果忽略
流量缓冲
架构保护
MQ 应用思考
MQ 的消息具有高可靠性,而且解耦了服务调用,那么 MQ 能否取代 RPC 呢?
注册中心
理解注册中心
解耦了服务依赖关系
微服务系统中枢
唯一触达所有节点的组件
核心功能
服务注册
服务发现
监控检查
变更通知
工作流程
服务负责人
服务管理平台
注册中心
服务提供方
服务消费方
注册中心思考
如果开发一个注册中心,需要考虑哪里核心技术问题呢?
限流
理解限流
限流是指限制单位时间内发出的请求量或接收的请求量
限流指标: QPS (泛指请求)
互联网系统一直追求的是吞吐量,但超过负载的吞吐量需要限制或丢弃
核心服务采用限流
为什么要限流
影响其他服务
服务雪崩
限流方式
消费方限流
提供方限流
同时限流
熔断
理解熔断
下游服务不可用时,临时切断对下游服务的访问,直接返回
下游服务不可用,包括:网络中断、超时次数过多、错误次数过多
下游服务可用时,恢复对下游服务的访问
熔断意义
没有服务熔断,容易造成服务雪崩
服务熔断针对非核心服务
服务熔断是手段,保护整个系统是目的
断路器
打开状态
半开状态
关闭状态
降级
理解降级
在资源不足或访问异常等不可改变条件下,策略性丢弃部分功能
有损提供服务,实现服务柔性可用
降级条件
发生熔断,即熔断降级
调用超时或异常
人为降级
降级策略
停止次要功能,例:双十一,停止评论功能
返回默认数据,例:默认推荐页、默认广告页
返回假数据,例:计数
友好提示,例:当前功能暂时不可用
监控系统
理解监控
监控系统能帮助我们预防问题
监控系统能帮助我们主动发现问题
监控是粮草,系统是兵马;兵马未动,粮草先行
监控内容
监控自己和用户关心的数据
系统层面:CPU、内存、网络、磁盘、进程等
应用层面:qps、error、timeout、delay等
业务层面:日活、在线时长、消息量等
常用监控系统
Zabbix
Open-falcon
Prometheus
链路追踪
理解链路追踪
链路追踪能宏观展现整个微服务系统,直观分析请求链路
通过链路追踪可以快速排查问题,定位性能瓶颈,优化服务依赖
常用链路追踪系统
简单易上手的Twitter Zipkin
云原生的链路监控组件 Uber Jaeger,基于Zipkin发展
探针性能低损耗的 Sky Walking
链路统计信息详细的 Pinpoint
分布式系统链路追踪
代码埋点
数据存储
查询展示
核心概念
Span: 一次服务调用,是基本的工作单元
Trace:表示一条完整的调用链路,是树结构的Span集合
Annotation: 记录特定事件
CS: Client Sent,客户端发起请求
SR: Server Receive, 服务端收到请求
SS: Server Send,服务端完成处理后发送结果给客户端
CR: Client Receive,客户端收到服务端返回信息
日志系统
理解日志
日志是一种工具,类似于日记、黑匣子
日志的本质是字符信息,用于反馈当时场景的上下文信息
通过上下文精准还原历史场景
日志表达
初次接触该日志的同学可以无成本理解和定位问题
traceID:唯一标识一次调用,实现全链路
日志级别:FATAL. ERROR. WARN. INFO. DEBUG
日志示例
event=begin_send_msg //begin日志
event=end_send_msg. //end日志
event=show_uid uid=%d //过程变量日志
event=show_getDetail() result=%v //过程方法日志
event=fail_getDetail() err=%v //失败日志
日志方案
ELK 方案
本地化方案
(3)电商架构设计
普适性电商系统架构
终端层
PC 浏览器
苹果 APP
安卓 APP
代理层
反向代理
LVS、 Nginx、SLB、TGW
更少的资源、更多的连接、更高的效率
负载均衡
API 网关层
隐藏细节,统一入口
业务无关,通用功能
流量过滤,请求转发
鉴权、限流、协议转换
业务逻辑层
数据聚合
数据服务层
访问数据存储
对接第三方
数据存储层
数据库
缓存
搜索引擎
第三方
我的商城系统架构
终端层
用户端系统
后台管理系统
业务逻辑层
商城首页
用户中心
订单中心
秒杀系统
后台系统
数据服务层
用户服务
商品服务
订单服务
秒杀服务
系统服务
广告服务
支付服务
短信服务
数据存储层
用户库
商品库
订单库
秒杀库
系统库
广告库
第三方支付
第三方短信
(4)服务化拆分
服务化拆分方式
一般按业务流程拆分
业务解耦原则
大数据量原则
复杂逻辑原则
电商系统服务化拆分
用户服务
首先电商平台需要吸引一批卖家用户
商品服务
这批用户会在平台上发布商品
用户服务
然后平台引流一批买家用户
商品服务
这批用户会浏览商品
订单服务、支付服务
碰到中意的会下单和支付
物流服务
支付过的商品会通过物流快递到买家用户手中
广告服务
另外,为了引流更多用户和促销,平台还需要打广告和做营销
服务化拆分模型
梳理业务流程
信息系统架构
识别业务实体
名词属性
动词属性
抽象业务服务
筛选 “鹅蛋”
重复情况
子集情况
交集情况
分类 “鹅蛋”
低耦合、高内聚
抽取业务单元
服务 “鹅蛋”
合并简单 “鹅蛋”
拆分复杂 “鹅蛋”
04. 技术选型
技术选型部分,包括怎样做技术选型、我的商城技术选型、关键技术分析、项目工程搭建等模块。
(1)怎样做技术选型
技术选型关键
功能是否满足
社区是否活跃
语言是否符合
技术选型原则
合适原则
合适优于业界领先
简单原则
简单优于复杂
技术选型案例
两周内实现 单体架构 IM 系统
通讯协议选型
选择最简单和容易落地的协议—Http
协 议 名 称
TCP
连 接 性
长连接
无连接
短连接
长连接
归属网络分层
传输层
复杂性
高
成熟度(普及)
高
高
高
中
UDP
传输层
高
Http
应用层
低
WebSocket
应用层
中
编程语言选型
选择公司和团队最熟悉的语言—Go
编程语言
C++
复杂度
高
社区
活跃
活跃
活跃
活跃
开源框架
并发模型
多线程
多线程
多进程
多协程
中
多
多
多
Java
中
PHP
低
Go
低
数据库选型
选择满足需求且容易运维的数据库—MySQL
数据库类型
数据库名称
MySQL
数据模型
关系型
文档型
关系型
集群性
单机
事务性
强事务
弱事务
成熟度
高
SQL 数据库
NoSQL数据库
NewSQL 数据库
MongoDB
TiDB
集群
高
集群
分布式事务
中
(2)我的商城技术选型
前端技术
编程语言
html
css
javascript
商城页面
vue
基于 html、css、javascript 构建用户界面的 JavaScript 框架
thymeleaf
渲染 H5 内容的模板引擎,类似 JSP、Velocity、FreeMarker
管理后台
vue
elementUi
和 Vue 配合良好的一个 UI 框架
vue 示例
hello {{msg}}
后端技术
编程语言
Java
基础组件
远程调用:Dubbo
注册中心:Zookeeper
消息队列:RocketMQ
数据访问:Mybatis
主框架
SpringBoot
存储组件
数据库: MySQL
缓存: Redis
搜索引擎: elasticsearch
文件存储:oss
其他组件
安全:SpringSecurity
单点登录: CAS
支付: 微信支付
短信: 大鱼
(3)关键技术分析
本节对电商系统关键技术的实现原理进行深入分析,帮助大家理解系统的底层设计;关键技术包括:远程调用、注册
中心、配置中心、消息队列、网关、限流、熔断和文件存储。
远程调用
RPC 消费方模型
代理
序列化
请求路由
负载均衡
连接管理
超时处理
反序列化
RPC 提供方模型
IO 线程
反序列化
请求队列
工作线程池
序列化
过载保护
超时丢弃
优雅关闭
注册中心
服务与节点关系
服务与节点之间的映射
节点与服务之间的映射
订阅关系
订阅关系映射
被订阅关系映射
zookeeper 数据结构
Root
Service
Type
URL
配置中心
服务端
管理员发布配置
服务端推送更新通知
客户端sdk
定时拉取配置
通知后拉取配置
配置写本地文件
应用程序
主动获取配置
被动接收更新通知
消息队列—RocketMQ
部署架构
NameServer
Broker
Producer
Consumer
存储架构
CommitLog
ConsumerQueue
事务消息机制
发送半消息
执行本地事务
提交或回滚
服务端回查
事务消息原理
半消息队列
RMQ_SYS_TRANS_HALF_TOPIC
OP消息队列
RMQ_SYS_TRANS_OP_HALF_TOPIC
对比回查
Commit 重新投递
删除 Rollback 消息
回查事务状态
API 网关
网关作用
隐藏细节,统一入口
业务无关,通用功能
流量过滤,请求转发
网关需求
功能需求
过滤:鉴权、限流、反作弊
转发:协议转换
非功能需求
高性能
高扩展
Zuul
本质是 Servlet
一切皆 filter
PRE
Routing
Post
动态编译
网关设计思路
限流算法
计数器算法
限制单位时间内请求数量
超过阈值则丢弃
滑动窗口算法
定时移动窗口
计算窗口中的请求数量
超过阈值则丢弃
漏桶限流算法
发往服务端的请求先进入漏桶
超出漏桶容量的请求则丢弃
漏桶以固定频率发送请求到服务端
令牌桶算法
令牌器与客户端是生产者与消费者关系
令牌器按需生产令牌放入令牌器
客户端获取令牌后方可请求服务端
客户端若获取不到令牌,则丢弃请求
令牌器往往与服务端的负载相关
熔断
断路器
三态变化
滑动窗口
定时移动窗口
计算窗口中的异常数量
超过阈值则触发熔断
文件存储—FastDFS
文件上传
client
tracker
storager
文件下载
client
tracker
storager
下载定位
每个 Storager 节点按时间顺序同步文件
每个 Storager 节点主动 push 文件到副本
每个 Storager 节点上报文件同步信息到 Tracker
Tracker 计算每个 Storager 节点最小同步文件时间
(4)项目工程搭建
我的商城系统架构
工程名称:mymall
业务逻辑层:web
商城首页:mymall_web_portal
用户中心:mymall_web_usercenter
订单中心:mymall_web_order
秒杀系统:mymall_web_seckill
后台系统:mymall_web_manager
数据服务层:service
用户服务:mymall_service_user
商品服务:mymall_service_goods
订单服务:mymall_service_order
支付服务:mymall_service_pay
秒杀服务:mymall_service_seckill
系统服务:mymall_service_system
广告服务:mymall_service_business
短信服务:mymall_service_sms
工程模块关系
父模
mymall_root
公共模块
mymall_pojo
mymall_common
mymall_common_web
mymall_common_service
mymall_common_cas
mymall_interface
web 层模块
mymall_web_manager
…
service 层模块
mymall_service_order
…
包名结构
商业.工程名.架构分层名.模块名.逻辑分层名
com.mymall.service.user.dao
com.mymall.service.user.impl
05. 代码落地
代码落地部分是本章的核心和重点,包括请求处理流程、前端工程、portal页、商品中心、搜索中心、购物车、订单
中心、支付中心、用户中心和秒杀系统等模块。
(1)请求处理流程
互联网系统请求处理流程
DNS
CDN
LVS
Nginx
网关集群
应用集群
DB集群
缓存集群
中间件集群
基础服务集群
普适请求处理逻辑
基础设施
DNS
CDN
LVS
NG
应用系统
网关层
业务逻辑层
数据访问层
存储系统
数据库
缓存
我的商城请求处理流程
登录(后台)
mymall_web_manager
login.html
WebSecurityConfig
UserDetailsServiceImpl
AuthenticationSuccessHandlerImpl
mymall_service_system
AdminServiceImpl
ResourceServiceImpl
mymall_system
tb_admin
tb_resource
订单列表(后台)
mymall_web_manager
order.html
OrderController
mymall_service_order
OrderServiceImpl
mymall_order
tb_order
我的购物车(前台)
mymall_web_order
cart.html
CartController
mymall_service_order
CartServiceImpl
redis
hash
(2)前端工程
前端应用发展
桌面应用
移动应用
浏览器应用
纯网页静态应用
动态应用
页面与业务逻辑分离
前后端分离
前后端未分离
前后端未分离关键特征
浏览器负责页面展示
后端负责渲染页面和重定向
后端控制前端展示
前端与后端高耦合
前后端未分离模型
浏览器
请求动态页面
解析 html
应用服务器
查询数据库
渲染模板
返回 html
重定向
数据库
持久化数据
前后端分离
前后端分离关键特征
浏览器负责页面渲染
后端负责生产数据
前端和后端职责分离
前端和后端完全解耦
前后端分离模型
浏览器
获取静态页面
通过 js 访问后端接口获取数据
静态文件服务器
存储静态文件,如:html、 js、 css
应用服务器
查询数据库
提供统一 API 接口
数据库
持久化数据
我的商城 “后台” 工程
页面与业务逻辑完全分离
本质上前后端分离
开发流程上,前后端未分离
我的商城 “前台” 工程
前端和后端是两个工程
完全前后端分离
前端工程通过 npm run serve 调试
(3)portal 页
portal页
业务需求
商品分类
商品菜单
广告轮播图
业务分析
数据变动性小
数据访问高频
99.999% 读 + 0.001%写
适合缓存
业务实现
初始化读库写缓存
从缓存高频读取
代码分析
my-web-front
Home.vue
mymall_web_portal
IndexController
mymall_service_goods
CategoryServiceImpl
InitService
mymall_service_business
AdServiceImpl
Init
数据表设计
tb_category
tb_ad
数据库和缓存一致性
引入缓存目的
提供高性能的数据读取
关键问题
追求强一致性,不用缓存
写多读少,不用缓存
缓存和数据库之间实现的是最终一致性
整体思路
插入操作
只写数据库
查询操作
先查缓存
再查数据库
然后数据写入缓存
删除操作
先删除数据库
再删缓存
更新操作
更新数据库
删除缓存
优化方案
思考:删除缓存失败了,如何处理?
过期策略
开发成本低
缓存管理成本低
一致性的时间完全依赖过期时间
事务消息
解决了同一个请求同时连接MySQL和Redis问题
逻辑上解耦
保证了操作的可靠性
引入了时序性的问题
引入消息队列,成本较高
binlog同步
在mysql压力不大情况下,延迟较低
保证了操作的时序性
与业务解耦
引入binlog成本太大
离线任务
分布式锁
(4)商品中心
商品设计
商品举例
手机
颜色
内存
行李箱
颜色
尺寸
SPU
SKU
Standard Product Unit (标准化产品单元)
商品信息聚合的最小单位
属性相同的商品可以称为一个 SPU
Stock Keeping Unit (库存单位)
库存进出的计量单位
用来定价和管理库存
商品关键词
关键词列表
商品分类
商品品牌
商品模板
商品规格(商品属性)
商品参数
商品SPU
商品SKU
商品实体关系
数据表设计
商品分类表
商品品牌表
商品模板表
商品规格表
商品参数表
商品SPU表
商品SKU表
商品添加流程
选择商品所属分类 (tb_category)
根据商品分类得到 template_id
根据商品分类得到其所有品牌,确定一个品牌 (tb_brand)
由 template_id 获取其规格选项 和 参数选项
将规格选项进行排列组合,生成 sku 列表
上传商品图片
将页面加工的 spu 和 sku列表传入后端,写入 tb_spu 和 tb_sku表
代码分析
mymall_web_manager
goods_edit.html
SpuController
mymall_service_goods
SpuServiceImpl
AlbumItemImpl
mymall_goods
tb_spu
tb_sku
tb_album
关键技术点分析
分布式ID
雪花算法
页面静态化
图片存储
OSS
代码分析
FastDFS
水平扩容
垂直扩容
普适性商品中心设计模型
实体关系
实体表设计
(5)搜索中心
搜索系统
适合非固定字段的多条件查询
适合大数据量查询
适合模糊查询
搜索引擎对比
传统搜索引擎 solr
实时搜索引擎 elasticsearch
搜索流程
数据写入
数据查询
代码分析
数据写入
mymall_web_manager
goods_edit.html
SpuController
mymall_service_goods
SpuServiceImpl
AlbumItemImpl
数据查询
my-web-front
search.vue
mymall_web_portal
SearchController
mymall_service_goods
SkuSearchServiceImpl
批量导入
mymall_web_manager
SkuSearchController
mymall_service_goods
SkuServiceImpl
SkuSearchServiceImpl
搜索中心(搜索中台)
数据写入
MQ
配置文件
数据查询—Proxy
Proxy 屏蔽 ES 复杂度
Proxy 限制用户操作
Proxy 优化查询请求
(6)购物车
业务需求
添加商品到购物车
从购物车中移除商品
更新购物车中商品数量
随时查看购物车信息
商品金额满减优惠
业务分析
购物车数据需要存储在服务端
购物车操作频繁,容忍丢失
购物车数据很少参与大数据分析
购物车适合缓存实现
满减优惠数据需要持久化实现
结算复杂度后移
业务实现
购物车
hash 结构
Key—CART_LIST
Field—username
Value—List
满减优惠
优惠表结构
优惠表数据
代码分析
mymall_web_order
cart.html
CartController
mymall_service_order
CartServiceImpl
PreferentialServiceImpl
redis
hash
mymall_order
tb_preferential
扩展
IM 系统在线用户维护
Key—uid
Field—client_type
Value—object(state、heart_time、device_token、entry_addr)
(7)订单中心
订单业务分析
结算页,提交订单
订单记录入库
减少商品库存
结算页重定向到支付页
关键技术分析
分布式事务问题
订单入库
更新库存
分布式事务解决方案
2PC、3PC
TCC、SAGA
Seata
事务消息
代码分析
mymall_web_order
order.html
OrderController
mymall_service_order
OrderServiceImpl
TransactionListenerImpl
OrderConsumer
CartMessageConsumer
mymall_order
tb_order
tb_order_item
mymall_goods
tb_sku
redis
hash
订单统计
定时任务
交易统计
会员统计
代码分析
mymall_web_manager
CategoryReportController
mymall_service_order
CategoryReportServiceImpl
mymall_order
tb_category_report
扩展
C2C电商订单表设计
满足买家和卖家查询需求
实现方案演进
方案1:单表方案
买家字段 buyer_id 建立查询索引 idx_buyer
卖家字段 seller_id 建立查询索引 idx_seller
方案2:分表方案
根据主键 order_id 分表
买家和卖家查询订单时,需要遍历所有表
方案3:映射方案
KV 存储 + 关系存储
KV 存储关联 order_id 列表
关系存储原始订单数据
通过映射避免遍历所有表
方案4:基因注入方案
通过雪花算法生成 uid
uid 中第三个字段固定为表索引字段
生成订单时,将 “表索引” 作为基因注入到 order_id 中
针对每一条订单双向存储两条记录
买家和卖家所有订单全部落在同一张表中
(8)支付中心
支付流程
获取支付链接
二维码支付
获取查询结果
代码分析
mymall_web_order
pay.html
weixinpay.html
PayController
mymall_service_pay
WeixinPayServiceImpl
(9)用户中心
C 端用户系统
mymall_user
tb_address
tb_user
tb_provinces
tb_cities
tb_area
B 端用户系统
实体关系
管理员
角色
资源
菜单
mymall_system
tb_admin
tb_role
tb_admin_role
tb_resource
tb_role_resource
tb_menu
tb_resource_menu
单点登录
常用方案
共享 session
中央存储 cookie
CAS 服务器
CAS 原理
CAS Server 进行用户登录
所有服务向 CAS Server 验证 tiket
跨域
跨域产生原因
浏览器同源策略
协议 + 主机 + 端口
跨域解决方案
服务代理
jsonp
websocket
CORS
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Credentials
Access-Control-Max-Age
扩展
大规模用户存储方案
满足用户分别通过账号、电话、邮箱查询需求
实现方案演进
方案一:单表方案
分别在account、phone、email上创建索引
方案二:多表方案
理论方案
需要遍历所有表
方案三:映射方案
KV存储 + 关系存储
KV存储 account、phone、email 与 uid映射关系
关系存储保存用户分表数据,通过 uid % 256进行分表
(10)秒杀系统
红包实现逻辑
业务流程
发红包
抢红包
拆红包
实现流程
插入记录到数据库和缓存
第一次读缓存
第二次读缓存
更新数据库
更新缓存
大型秒杀系统
秒杀简介
什么是秒杀?
一秒内完成高吞吐量业务处理
解决高并发问题、用户作弊问题、商品超卖问题
关键点分析
秒杀系统独立部署,避免对电商平台造成冲击
秒杀商品页面静态化处理,避免动态页面对数据库产生高负载
临时租用网络带宽和服务器,降低成本
动态生成随机下单URL,避免用户作弊
整体优化思路
尽量将请求拦截在上游
充分利用缓存
合理利用队列
我的商城秒杀系统
业务流程
商城后台建立秒杀活动,提交秒杀商品
商城后台运营进行审核
商城前台在秒杀频道展示秒杀商品信息
商城前台打开秒杀商品详情页面
开始秒杀,抢单成功后,进行支付
若支付失败,则取消订单和恢复库存
核心设计
秒杀数据库
tb_seckill_goods
tb_seckill_order
秒杀逻辑设计
队列 + 多线程
随时查询秒杀状态
限制用户只抢一次
解决超卖问题
解决未支付问题
代码分析
mymall_web_seckill
seckill-index.html
seckill-item.html
SeckillOrderController
mymall_service_seckill
SeckillGoodsTask
SeckillOrderServiceImpl
MultiThreadingCreateOrder
SeckillOrderMessaageListener
mymall_seckill
tb_seckill_goods
tb_seckill_order
redis
list
hash
06. 项目总结
项目总结部分,包括项目部署、关键问题和重点回顾等模块。
(1)项目部署
部署中间件
MySQL
mymall_business
mymall_cas
mymall_config
mymall_goods
mymall_order
mymall_seckill
mymall_system
mymall_user
Redis
Zookeeper
安装步骤
https://blog.csdn.net/qq_29752857/article/details/127792052
修改端口号
conf/zoo.cfg 中 admin.serverPort=8888
启动
双击 zkServer.cmd
双击 zkCli.cmd
测试
RocketMQ
安装步骤
https://blog.csdn.net/weixin_41983685/article/details/124952445
启动 NameServer
双击 mqnamesrv.cmd
启动 Broker
命令窗口执行 mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true
Elasticsearch
安装步骤
https://blog.csdn.net/weixin_43564583/article/details/129716464
启动
命令窗口执行 elasticsearch.bat
启动服务
service 层
mymall_service_business
mysql 连接信息
mymall_service_goods
mysql 连接信息
elasticsearch 连接信息
mymall_service_order
mysql 连接信息
mymall_service_pay
微信支付信息
mymall_service_seckill
mysql 连接信息
mymall_service_sms
短信配置信息
mymall_service_system
mysql 连接信息
mymall_service_user
mysql 连接信息
web 层
mymall_web_manager
OSS 配置信息
mymall_web_order
CAS 配置信息
mymall_web_portal
CAS 配置信息
mymall_web_seckill
CAS 配置信息
mymall_web_usercenter
CAS 配置信息
cas
cas 直接部署到 tomcat 中
\webapps\cas\WEB-INF\classes\application.properties 修改数据库连接信息
前端
my-web-front
npm install
npm run serve
(2)关键问题
系统三高
高稳定
高可用
高可靠
高吞吐
高性能
高并发
高扩展
功能扩展
容量扩展
集群 + 负载均衡
安全交易
风控系统
风控系统核心是规则引擎
风控系统位置
中台建设
服务 / 系统 / 中台
中台是战略需求
中台是演进出来的
(3)重点回顾
我们从 “电商系统”、“我的商城”、“基础架构”、“模型总结” 和 “扩展应用” 等五个视角对互联网项目实战课程进行复习
和重点回顾。
电商系统
电商模式
B2B
B2C
C2B
C2C
电商模型
普适性电商系统架构
我的商城
需求分析
系统架构
技术选型
前端技术
vue thymeleaf elementUi html css javascript
后端技术
Java Dubbo Zookeeper RocketMQ Mybatis Springboot MySQL Redis elasticsearch CAS
工程搭建
前后端工程
后台工程
前台工程
portal 页
商品中心
搜索中心
购物车
订单中心
支付中心
用户中心
秒杀系统
基础架构
架构治理
组件治理
远程调用
消息队列
注册中心
容错治理
限流
熔断
降级
监控治理
监控系统
链路追踪
日志系统
关键技术分析
远程调用
注册中心
配置中心
消息队列
网关
限流
熔断
计数器算法
滑动窗口算法
漏桶限流算法
令牌桶算法
文件存储
互联网系统请求处理流程
模型总结
需求分析模型
架构模型
单体架构
分层架构
微服务架构
服务化拆分模型
梳理业务流程
识别业务实体
抽象业务服务
数据库和缓存一致性
引入缓存目的
关键问题
整体思路
优化方案
普适性商品实体关系
扩展应用
IM三类业务架构
单体架构
分层架构
微服务架构
搜索中台
IM 在线用户维护
订单表基因注入实现方案
用户中心映射存储方案
红包流程逻辑