我们这个项目是基于SOA的架构来实现的。采用的是dubbo中间件来实现表现层跟服务层之间的通信。
我们项目分为前台后台,前台提供内容展示,商品展示,商品搜索,购物车,订单等,支付等模块,后台提供管理商品,内容管理,订单管理等模块。

下面我给您具体介绍一下。

首先进入我们的网站首页:最上面是我们的网站的logo,搜索框,下面左边是测分类栏对商品进行分类,轮中间是轮播图广告位,跟着下面是新闻公告栏,再下面是一些热门商品的展示。这上面内容都是动态的展示出来的,所以我们要有一个后台来管理这些内容。

我介绍下我参与的模块:

比如说广告位的展示吧,我们后台要管理这些内容,在后台页面最左边就会有一个网站内容管理模块,内容模块包含内容分类管理,内容管理。当我们点击内容分类,在右边就会显示所有商品的一个分类,在点击子节点,比如说我们这里的广告位,就会异步加载数据的显示查出广告内容。我们再在这个基础上对广告进行增删改查。考虑高并发量,为了避免频繁的与数据库交互,我们将数据存在了redis中,当在首页中点击广告时,我们将不再直接去数据库中查找数据,而是先判断缓存中是否有数据,如果有直接返回数据,如果没有就去查数据库并将数据缓存在redis中,另外我们修改内容后,会将原来的缓存删除掉,来同步数据库。

后台模块还有商品管理模块,这一块是对商品的列表展示,以及增删改查操作;新增商品的话,在商品添加界面录入商品信息。其中图片存储考虑到数量比较多,采用的是分布式文件存储系统(FastDFS),图片多了可以搭建集群,图片的访问我使用了Nginx的Http服务器能力,对图片的访问都交给图片服务器;

然后我们再来说下首页的其他部分,最上面有个搜索框,当用户在首页没有看到想要的商品时,可以有针对性的进行搜索,使用了solr技术,根据IK分词器,对查询的关键字进行查询,首先创建一个SolrQuery对象作为商品搜索的查询条件,设置分页条件,指定默认的搜索域,设置高亮,执行查询,计算出总页数和总条数,返回一个QueryResponse结果集,在将结果集循环遍历添加到自己定义的集合里面,返回给页面,这样我们就搜索到我们想要的一些商品。

这里有一个问题就是索引库要同步,当我们添加商品的时候,我们使用了一个消息中间件rabbitmq来同步索引库,添加商品时,发送消息。在搜索模块中,接收消息,取商品id,根据商品id查询数据库,创建一SolrInputDocument对象,使用SolrServer对象写入索引库。

当用户搜索到自己想要的商品时,就会去点击那个商品图片或者名称进入商品详情页面。商品详情展示要查两个表,一个是商品表,一个是商品描述表,当访问量很大时,如热门商品,就会频繁的跟数据库交互,为了减轻数据库的压力,考虑使用缓存。热门商品访问量比较大,需要做缓存,普通商品却需求不大。要区别对待,我们考虑到使用记录访问量来记录访问次数,来区别热门商品,针对的做缓存,但这样操作麻烦。最终我们采用设置redis过期时间来处理这个问题, 热门商品访问比较深多,过期了又会存进去。

不过我们为了进一步减少数据库的压力,商品详情页采用了FreeMarker模板引擎技术,生成一个静态化页面。这样能减轻服务器的压力。当我们添加商品的时候,我们使用了一个消息中间件rabbitmq发送消息,取商品id。

将生产的静态页面放到Nginx静态服务器上,并且将css,js,png等准备好的静态资源放在静态资源服务器,然后在使用Nginx负载均衡进行请求分发,静态资源访问交给静态资源服务器处理,tomcat只需要处理页面的动态请求,在使用keepalived对Nginx搭建集群实现了Nginx的高可用;

我再讲下购物车模块,当客户查看商品详情后,想购买了,就会加入购物车。为了减少用户流失量,在不登陆的情况下,可以把购物车信息写入cookie,这样用户体验好。读写cookie抽取出TokenUtil,使用@Cookie进行获取。加入时先判断商品id在商品列表中是否存在。如果存在,商品数量相加。不存在,根据商品id查询商品信息,把商品添加到购车列表,把购车商品列表写入cookie。如果登录的话将购物车直接写入mysql数据库中,如果没有登录的话,将购物车信息写入redis中缓存起来,等用户登录后将缓存中的购物车信息加入到mysql数据库中,然后清除缓存。展示购物车列表时,也是需要判断是否登录,如果登录从数据库中将购物车信息读出来,如果没有登录,从cookie中取商品列表,商品列表传递给页面。修改商品数量时,页面发送一个异步请求,后台接收两个参数商品id和数量,再从cookie或者mysql中取商品列表,遍历商品列表找到对应商品,更新商品数量,把商品列表写入cookie/mysql。

在使用Cookie的时候出现了跨域问题,使用Jsonp解决,并且在SSO发现了Cookie的域名问题,使用setDomain()使用二级域名解决;还有就是多个方法的判断登录状况,考虑到订单,支付模块还需要多次进行判断,使用了AOP的思想;通过自定义注解@IsLogin在Controller层方法上添加该注解,实现方式的环绕增强,在进入方法之前通过注解value属性的true/false判断是否强制登录,该注解的作用有通过添加该注解,然后获取cookie值如果cookie中有用户信息的token那就从redis中获取用户信息并通过反射给方法上User对象赋值,在不强制登录的方法中通过对user对象的判断进行登录和未登录的不同操作,如果该注解value设置为true就要求强制登录如果没有登录的的话就直接跳到登录页面,这时就有一个问题,为了提高用户体验,用户被强制登录后需要回到之前的页面,通过页面location.href获得页面的地址当做returnUrl参数拼接然后在带到服务端返回到指定的页面,并且通过Encoding方法对参数的拼接做了处理保证搜索时页面也回到对应的搜索也,关键字也不改变;

最后我讲一下订单模块,购物车完成后要生成订单,订单中有配送信息,因此我们必须要求用户登录从而获得数据库中用户的地址。我们使用的是单点登录,使用redis模拟Session,实现Session的统一管理,这样用户只需要登录一次就可以访问所有相互信任的应用。用户登录成功后,生成token,相当key, 把用户对象value存入redis,模拟Session的过期时间。一般半个小时。最后把token写入cookie中(Cookie需要跨域)。

用户登录后,如果注销登录消息就将用户信息的Cookie设置过期时间为0,并且回到登录页

当点击生成订单时候,就通过AOP+自定义注解实现强制登录然后跳转到订单页面,订单页面使用了存储过程实现新增默认地址的功能,我们需要保证地址新增如果是默认地址的时候同时将数据库中的默认地址设为非默认;用户到了订单页面后就不能选择购物车商品的数量了,然后就是下单操作了,当用户点击付款后,根据用户选择,直接接入支付宝,然后通过异步的等待支付宝消息修改订单状态,并且如果订单取消还需要对商品进行回库操作

订单的操作涉及到了多张表的操作,使用了spring的事务管理

最后是秒杀工程,这是一个常见的商城功能,但也是一个比较麻烦的场景,面对高并发的场景,考虑到对秒杀商品的高速读写,使用了redis作为数据缓存服务器,对秒杀商品的库存进行缓存,用商品id关联做为key,页面使用js的setInterverl定时器+时间服务器对秒杀商品进行倒计时以及抢购按钮做控制

对于秒杀的操作都放在redis中进行,大致逻辑就是首先使用redis+lua脚本实现秒杀整体流程,保证面对高并发的情况下不会出现超买,漏卖的情况,lua脚本先获得需要购买的商品id和商品数量,然后在获取库存,判断库存是否足够,足够才继续往下执行扣减库存,缓存订单信息返回执行结果;在service中执行前缓存lua脚本然后通过evalSha()传参执行,返回值分三种情况,如果秒杀成功就会生成指定的订单,然后在将购物车信息清空,如果秒杀失败就直接返回然后跳转到抱歉页面,还有就是库存为0的情况考虑到有些用户可能只是生成了订单,并没有付款,订单关闭时间为半个小时,通过rabbitmq的延迟队列实现了定时功能,对订单消息进行监听如果订单消息在半小时之内没有被消费,将变成死信消息进入死信队列然后触发订单关闭,将订单状态设置为关闭并且将秒杀商品加回redis中;这个时候秒杀结束,服务器的压力比较小,我们可以直接将redis中的订单信息写回数据库中,然后情况redis相关数据;

关于分布式商城的项目讲解相关推荐

  1. JavaEE大型分布式电商项目 上海淘淘商城

    原文出自:https://blog.csdn.net/hjsw1/article/details/76615681 淘淘商城是一个综合性的B2C平台,类似与京东.天猫商城,其打造的是商业模式为&quo ...

  2. JavaEE大型分布式电商项目 上海淘淘商城 29期

    上海29期_张志君老师_淘淘商城_大型分布式电商项目 JavaEE大型分布式电商项目 淘淘商城 29期 需要的加qq:350226234,备注:程序员学习视频 ==================== ...

  3. 分布式商城项目--dubbo 服务的发布和引用。

    分布式商城项目–dubbo 服务的发布和引用. dubbo服务需要zookeeper服务的支持,之前我们已经介绍过zookeeper的安装配置,这里就不在赘述 1.启动zookeeper 2. Pro ...

  4. 分布式商城项目-后台开发-SSM工程整合网站模板

    分布式商城项目-后台开发-SSM工程整合网站模板 我们在JavaWeb开发学习过程中,需要使用到前端的页面,可能很多时候,我们并不擅长于设计UI,比如html,jsp.但又希望自己做出来的程序能够好看 ...

  5. 小程序黑马优购商城项目讲解

    小程序优购商城项目讲解 在我们开始之前 我们需要配好该项目所需要的接口文档以及配好相应的页面,以免在开发过程中会出现遗漏的问题出现. 首先我们要知道优购是分为4部分的 分别为 首页/列表/购物车/我的 ...

  6. 尚硅谷2020微服务分布式电商项目《谷粒商城》学习笔记

    尚硅谷2020微服务分布式电商项目<谷粒商城> 项目简介 资料 百度云 链接:https://pan.baidu.com/s/1eGCTi6pLtKbDCwBs-zCOzQ 提取码:1pm ...

  7. 《谷粒商城》-项目简介以及环境搭建

    谷粒商城 文章目录 谷粒商城 前言 一.项目简介 1.项目背景 1.1电商模式 1.2谷粒商城 2.项目架构图 2.1项目微服务架构图 2.2微服务划分图 3.项目技术&特色 4.项目前置要求 ...

  8. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解

        Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解 在Hadoop分布式环境下实现K-Means聚类算法的伪代码如下: 输入:参数0--存储样本数据的文本文件inpu ...

  9. python爬虫之:IP代理池开源项目讲解

    Table of Contents 一.项目基本介绍 二.项目讲解 三.一些项目问题答疑 四.代理池设计 一.项目基本介绍 本项目来源于github,截止于2019/08/20,star数量:7133 ...

最新文章

  1. spark ml中一个比较通用的transformer
  2. Camstasia studio渲染(生成)视频
  3. java.util.concurrent介绍
  4. ie6和ie7两个div之间有空隙
  5. L - Clock Master Gym - 102798L
  6. mybatis高级查询,批量新增
  7. 利用c语言建立交易系统,【图】手把手教会你构建自己的交易系统 - 4_股票论坛,炒股公式,股票指标,股票公式,选股公式_数据、教程交流论坛_理想论坛 - 股票论坛...
  8. Python程序,辅助微信跳一跳游戏介绍
  9. 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序讲解模板)
  10. 我整理的一个经典分页程序(JSP的)
  11. 第二十节:Scrapy爬虫框架之使用Pipeline存储
  12. OPPO Find X,一款(可能)被全面屏“耽搁”了的AI手机
  13. EMCA创建em资料库时报错
  14. Oracle 数据库入门学习
  15. 《Spring 揭秘》读书笔记
  16. 用MediaCreationTool做纯净版Windows 10系统U盘
  17. 编译华硕路由器ACRH17源代码小记
  18. 如何在word中对在论文标题添加脚注,并且去掉脚注的编号
  19. 计算机连接未识别的网络,电脑网络连接出现未识别的网络怎么办
  20. 网站导航应该怎么设计?

热门文章

  1. 递推最小二乘法的推导和理解
  2. 小分子化合物的蛋白靶点(蛋白质、酶、受体) + IC50、EC50、Ki 是什么?
  3. 网管入门需掌握的电脑知识
  4. 还不会 Vue3 ?一篇笔记带你快速入门
  5. 网络工程师从入门到精通(学习总目录——持续更新)
  6. kaliarp欺骗注入_利用 Kali Linux 进行 Arp 欺骗,实现局域网断网攻击
  7. TASSEL5中利用MLM模型进行GWAS分析
  8. app live photo_让照片动起来,一招教你将 Live Photos 变成动图
  9. 零基础小白该如何学习人工智能?
  10. WindowsPhone-GameBoy模拟器开发系列