【畅购电商】项目总结(二 )

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 【畅购电商】项目总结

2.11 电商术语

  • SKU、SPU
  • SKU:stock keeping unit(库存量单位),进出库的最小单位,不能分隔。也就是具体的一个产品。
  • SPU:Standard Product Unit(标准产品单位),一组可复用产出特性,相当于一个小的分类。
  • PV、UV
  • PV:Page View 页面浏览量,每访问一个页面就记录一次,同一个用户,同一个页面,访问多次,也记录多次。访问的累积量。
  • UV:unique visitor 独立房客,同一个IP地址,在同一天内访问的次数。

3 项目中的业务

3.1 注册业务

  • 为什么使用验证码?
  • 防止用户的恶意点击
  • 防止程序恶意访问
  • 验证码有几种形式?
  • 静态图片验证码(jpeg图)
  • 动态图片验证码(gif图)
  • 邮件验证码
  • 短信验证码
  • 特殊验证码(滑动图片部分、9宫格、选择若干汉字 等)
  • 验证码是否有有效时长?如果有是多久?
  • 有,一般5分钟
  • 在后端存放到redis中有效时长。
  • 为什么使用倒计时?时长多久?
  • 防止用户恶意点击、误点击
  • 短信存在延迟,需要有一个接收的时间
  • 时长一般为60秒,不建议太长,用户不乐意等待
  • 减少对服务器的访问次数,从而降低服务器请求压力
  • 描述一下实现倒计时的基本思路?
  • 一共需要使用3个变量:btnDisabled、seconds、timer
  • seconds变量,用于进行倒计时,如果为零,将重置所有状态
  • btnDisabled变量,用于控制按钮是否可以,倒计时阶段不能用
  • timer变量,用于记录轮询,当倒计时为零时,停止轮询。

  • 倒计时结束后,验证码是否仍有效?
  • 有效,倒计时为60秒,发送验证码时,在redis中存5分钟,此时仍有效。
  • 倒计时结束后,是否还可以发送验证码?
  • 可以,60秒倒计时后,按钮就可以点击了。
  • 短信发送失败的原因,及其解决方案?
  • 阿里大鱼余额不足,无法发送。检查余额,及时充钱。
  • 短信服务没有响应。检查对应短信服务,是否可以访问。
  • 第三方软件不可用。检查redis、mq等是否可用
  • 前端ajax没有发送成功。检查ajax路径、参数等,前端没有绑定ajax
  • Redis的数据类型有哪些?
  • redis有5种数据类型
  • string类型:字符串,在redis最常用的类型,可以存放任意数据,通常转换成json即可。一键一值。
  • list:有序集合,一键多值,值可以重复。
  • set:无序,一键多值,值不可以重复。
  • zset:有序不可重复的集合。一键多值。
  • hash:键值对
  • 验证码如何在redis唯一标识的?是否还有其他方案?
  • 需要用户填写用户名/手机号,redis唯一标识固定串+手机号固定串+用户名
  • 弊端:用户没有填写手机号前,不能点击获得验证码的。在用户填写验证码后,失去焦点时,进行ajax请求
  • 常见方案:
  • 每一个用户第一次访问页面时,给其分配一个随机数,记录再浏览器端(cookie、localStorage)
  • 之后每次访问,都将携带该随机数,用随机数表示当前用户。

3.2 权限任务业务

  • 权限认证使用的框架是什么?
  • JWT: JSON Web Tokens , 目前最流行的跨域身份验证解决方案
  • JWT的理解?JWT鉴权的流程

  • Base64:使用64个可打印字符来表示二进制数据,从而进行数据的加密和解密。
  • MD5: Message Digest Algorithm 消息摘要算法, 任意长度的数据字符串转化成短小的固定长度的值
  • SHA: Secure Hash Algorithm,安全散列算法
  • RSA:一种非对称加密算法,需要一对密钥,一个用于加密,另一个用于解密。
  • 登录成功后,用户信息如何保存?
  • 在微服务系统中,保存sessionStorage中
  • 如果数据存放到vuex中,如何解决刷新页面数据丢失的问题?
  • 方案1:不是公共组件:页面在pages目录下,可以nuxt.js提供 fetch进行操作。
  • 方案2:是公共组件:组件在components目录下,借助第三方进行存储(cookie、localStorage、sessionStorage)
  • 选择1:sessionStorage存放数据,如果vuex中没有,将sessionStorage同步过去。
  • 选择2:vuex中actions模块就可以发送ajax,从而同步数据。
  • 白名单是什么?如果使用?
  • 白名单中的路径,无需鉴权校验,可以直接放行。

3.3 搜索业务

  • elastisearch是如何搜索的
  • 首先需要创建索引,
  • 然后springboot-data-elasticsearch提供了丰富的API,进行查找所有、分页查找、排序,
  • 还可以直接编写方法名,根据方法名搜索,
  • 如果还不能满足需求,还可以使用NativeSearchQueryBuilder进行自定义查询
  • withQuery 条件查询,通过 boolQueryBuilder进行组合查询
  • matchQuery:分词查找
  • termQuery: 精确匹配
  • rangeQuery:范围搜索
  • withSort :排序查询
  • withPageable :分页查询
  • 项目中的搜索业务是如何实现的?
  • 电商项目中,搜索商品,我们实现了,根据三级分类搜索、关键字搜索,同时根据品牌、规格和规格选项、价格范围、销量降序、价格升序/降序、评论降序、上架时间降序等等条件进行组合搜索

  • elasticsearch中的数据来自哪里?如何存进去的?
  • elasticsearch中的数据会保存两份,一份是来自mysql,一份是来自elasticsearch,
  • 代码同步:将mysql中的数据同步到elasticsearch中

3.4 购物车业务

  • 购物车业务是商城非常核心的业务之一,跟购物车相关的功能有哪些?
  • 加入购物车
  • 修改购物车商品数量
  • 修改购物车商品打钩状态
  • 删除购物车中的商品
  • 为什么使用localStorage?localStorage的优势?有哪些劣势?
  • localStorage的存储量比cookie大,突破了cookie4k的限制
  • localStorage属于永久性直接存储到本地,相当于一个前端页面的数据库,相比于 cookie 可以节约带宽
  • 劣势:
  • 浏览器的大小不统一,并且在 IE8 以上的 IE 版本才支持 localStorage 这个属性。
  • 目前所有的浏览器中都会把localStorage的值类型限定为string类型,这个在对我们日常比较常见的JSON对象类型需要一些转换。
  • localStorage在浏览器的隐私模式下面是不可读取的。
  • localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。
  • localStorage和sessionStorage的区别?
  • localStorage 本地存储,属于永久性。只要浏览器不清空浏览器缓存,数据就可以长期保存。
  • sessionStorage 会话存储,属于临时存储。浏览器端会话结束,数据就被清空。
  • 为什么登录的情况下,将数据放入redis,而不是放入mysql?
  • redis的优势是读写速度都快,写入mysql需要更多的时间,并发能力还没有redis强。
  • 对于加入购物车的功能,操作很频繁,可以通过redis快速的写入、修改、获取,符合业务需求

3.5 订单业务

  • 下单的业务是啥?项目如何实现下单功能的?下单流程是啥?
  • 页面点击"提交"按钮,此时后端下单就开始执行了,流程中需要处理的业务非常多
  • 第一个:需要生成订单的编号,考虑到分布式系统订单量庞大,如何防止订单编号重复呢?我们采用了雪花算法,雪花算法是推特开源的分布式ID生成器,在高并发场景下,可以有效的保证id唯一
  • 第二个:需要根据地址编号addressId发起远程调用,请求address的详细信息,在我们的订单表中,我们是保存了每个订单的详细收货地址信息的,为什么订单需要重复保存收获地址信息呢?不是保存地址编号呢?因为地址信息是可以修改的,如果保存的是地址编号,后期地址信息发生改变的话,我这个订单的地址信息也就发生了改变,这与当时下单需要寄送的地址是冲突的
  • 第三个:获取token,解析userId,根据userId去redis中取出数据。因为下单的商品数据来自redis,下单直接将redis中购物车中打钩的商品数据,保存为订单商品
  • 第四个:保存订单、保存订单商品数据。
  • 第五个:扣减库存,包括mysql、elasticsearch、redis;下单成功,对于mysql,需要修改sku的库存信息;对于elasticsearch,需要修改库存信息;对于redis,删除已经下单成功的商品信息,
  • 第六个:对于第四个业务和第五个业务,要么全部成功,要么全部失败,在SpringCloud微服务架构下,涉及到多个服务间的业务调用,所以我们采用了分布式事务seata来保证数据的一致性和完整性
  • 事务的特性?
  1. 什么是事务?

在一组(ABCD)业务逻辑操作中,要么全部成功,要么全部失败。

  1. 事务有哪些特性?

ACID 4个特性

原子性:一个事务是一个不可分割的整体

一致性:一个事务前后,数据时一致性的,也称为数据完整性。

隔离性:两个事务之间的并发访问问题

持久性:事务一旦操作,不能再改变。

  1. 隔离性有哪些问题?

脏读:一个事务读到了另一个事务没有提交的数据

不可重复读:一个事务读到了另一个事务已经提交的数据(更新)

虚读/幻读:一个事务读到了另一个事务已经提交的数据(添加),理论信息

  1. 如果解决隔离性的问题?

采用隔离级别来进行问题的解决。共4种隔离级别

  1. read uncommitted 读未提交:一个事务读到了另一个事务没有提交的数据。

解决了0个问题,存在脏读、不可重复读、虚读等3个问题。

  1. read commmitted 读已提交:一个事务读到了另一个事务已经提交的数据

解决了脏读等1个问题,存在不可重复读、虚读等2个问题。

  1. repeatable read 可重复读:在一个事务中,读到的数据时一致的。

解决了脏读、不可重复读等2个问题,存在虚读等1个问题。

  1. serializable 串行化:单事务,一次只能有一个事务。

解决了脏读、不可重复读、虚读等3个问题,存在0个问题。

  1. 隔离级别的安全与性能对比?

安全:read uncommitted < read commmitted < repeatable read < serializable

性能:read uncommitted > read commmitted > repeatable read > serializable

  1. 常见数据库的默认隔离级别

mysql:repeatable read

Oracle:read commmitted

  • 分布式事务事务模型?
  • 分布式事务的四种模式:XA 、AT、TCC、Saga、
  • XA模式:基于XA协议的两阶段提交
  • 优点:事务的强一致性,满足ACID原则。常用数据库都支持,实现简单。
  • 缺点:因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差。
  • AT模式:是一种无侵入的分布式事务解决方案。 阿里seata框架,实现了该模式
  • 优点:
  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交
  • 缺点:
  • 两阶段之间属于软状态,属于最终一致,可能会引起脏写
  • 框架的快照功能会影响性能,但比XA模式要好很多
  • TCC模式: 根据自己的业务场景实现 Try、Confirm 和 Cancel 三个操作补偿机制。
  • 优点:
  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库
  • 缺点:
  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况
  • Saga模式: 是长事务解决方案。

3.6 支付业务

电商项目使用的是什么支付?是如何完成支付的?

  • 微信支付

  • 你还了解哪些支付方式?
  • 微信支付
  • 支付支付
  • 银联支付
  • 支付成功的回调,是如何调用本地方法的?
  • 内网穿透技术

4. 项目中有哪些难点?你是如何解决的?

4.1 难点1:下单业务

  1. 涉及到多个多个微服务,多个业务的操作,需要向订单order 表、订单商品order-goods表新增数据,扣减sku的库存、更新elasticsearch的数据、更新redis的数据等等操作
  2. 这些操作要么全部成功,要么全部失败,所有需要采用分布式事务进行控制,

4.2 难点2:支付业务

  1. 微信服务器通知我们的服务器修改订单状态,由于开发的时候是内网,如何通知呢?我查了很多资料,最终发现通过内网穿透工具解决
  2. 项目后端如何通知项目前端根据订单状态进行页面跳转呢?采用websocket,以前没有接触过,自学了websocket,解决了这个问题

4.3 难点3:搜索

elasticsearch搜索,我们实现类跟京东、淘宝几乎一样的功能,搜索条件非常多、需要根据三级分类、关键字、品牌、规格和规格选项、价格排序、销量排序、上架时间排序、评论排序、分页等等功能,前后端都要事先,功能复杂,难度系数大

4.4 难点4:权限认证

  1. 如何保证用户信息的安全?采用MD5+SHA加密密码的方式,即使数据的用户信息被盗,盗用者也无法获取用户的密码信息
  2. 如何保证jwt的安全?JWT通过撒盐的方式,增加破解的难度
  3. 如何保证各个微服务的安全?通过jwt进行鉴权和授权,jwt解析失败,无法访问某些微服务

5. 通过这个项目,你有哪些收获?

  1. 第一次做这么大的项目,从业务逻辑、代码量都有很多提升
  2. 解决bug的能力
  3. 接触到了更多的新技术
  4. 自学了很多新技术
  5. 沟通、合作很重要
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 安全 前端开发
基于springboot技术的美食烹饪互动平台的设计与实现
基于springboot技术的美食烹饪互动平台的设计与实现
|
1月前
|
新零售 供应链
九星创客新零售商城系统开发|源码|方案详情
当下的商业领域,随着网络、电话、电视等平台的日益成熟和壮大
|
13天前
|
前端开发 Java 项目管理
校友社交平台|基于SpringBoot校友社交系统
校友社交平台|基于SpringBoot校友社交系统
|
7天前
|
人工智能 搜索推荐 机器人
开发者选择:全面对比导购APP、淘宝客机器人与淘客系统
开发者选择:全面对比导购APP、淘宝客机器人与淘客系统
|
8月前
|
JSON 小程序 开发者
微信小程序--数字化会议OA系统之首页搭建
微信小程序--数字化会议OA系统之首页搭建
62 0
|
1月前
|
存储 小程序
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三)
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十三)
|
1月前
|
安全 Java 关系型数据库
社区团购|生鲜团购|基于Springboot+Vue实现前后端分离社区团购
社区团购|生鲜团购|基于Springboot+Vue实现前后端分离社区团购
|
9月前
|
监控 Serverless 持续交付
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
2466 44
|
7月前
|
搜索推荐 前端开发 JavaScript
【开题报告】基于SpringBoot的在线乐器购物商城的设计与实现
【开题报告】基于SpringBoot的在线乐器购物商城的设计与实现
128 0
|
7月前
|
Java 测试技术 Maven
淘东电商项目(13) -项目整合WxJava
淘东电商项目(13) -项目整合WxJava
38 0