天天看点

day82_淘淘商城项目_15_项目总结 + 项目中的问题_匠心笔记

项目总结

第一天

1、电商行业的背景,b2b、b2c、b2b2c、c2c、o2o2。

2、系统的架构。基于SOA的架构。

3、工程搭建。使用maven管理工程。

4、svn的使用。

第二天

1、ssm框架整合。

2、使用dubbo进行通信

  1)服务提供者

  2)服务消费者

  3)注册中心

  4)监控中心

3、商品列表查询

  1)PageHelper分页插件

  2)EasyUI的DataGrid控件

第三天

1、商品分类选择,EasyUI的异步Tree控件。

2、图片上传

  1)图片服务器FastDFS。tracker、storage

  2)实现图片上传使用KindEditor的插件

3、富文本编辑器。纯js实现。textarea控件

4、商品添加功能实现。

第四天

1、商城首页展示。

2、cms系统搭建

  1)内容分类管理

  2)内容管理

3、前台从数据库中取内容信息实现动态展示。

第五天

1、redis的安装。

2、redis的启动。

3、redis的5种数据类型。

4、redisCluster

  1)至少有三个节点

  2)JedisCluster对象操作redis集群

5、向业务逻辑中添加缓存。

6、缓存同步。删掉key。

第六天

1、搜索功能实现,使用solr做搜索。

2、配置业务域及中文分析器。

3、新的商品数据导入索引库。

4、搜索的实现。

第七天

1、solrCloud

  1)zookeeper集群(3个)

  2)solr集群(4个分两片)

2、使用solrJ连接solr集群

  1)CloudSolrServer对象连接solr集群

第八天

1、Activemq,作用是系统之间解耦时使用。实现数据的最终一致。

2、queue点到点、topic广播

3、Producer

4、Consumer

第九天

1、商品详情页面动态展示:jsp+redis

  1)缓存设置有效期

2、网页静态化

  1)freemarker

  2)创建模板

  3)使用freemarker生成静态页面

第十天

1、nginx访问静态资源

2、nginx配置虚拟主机

3、nginx实现反向代理

4、nginx实现负载均衡

第十一天

1、sso系统,主要解决分布式环境下Session共享的问题。

2、使用redis保存Session,设置过期时间。

3、token相当于jsessionid,要保存到cookie中。

第十二天

1、把购物车保存到cookie中

2、把购车保存到服务端redis中

第十三天

1、订单系统。拦截器,判断用户是否登录。

2、订单确认页面。收货地址列表+支付方式列表。

3、生成订单。订单号可以使用redis的incr命令生成。

第十四天

  项目部署

  项目总结

项目中的问题

  PS:以下描述若与就业老师所说有冲突,请以就业老师为准,另外参考简历一定要改,切不可拿来主义

1、淘淘商城简历中的描述

参考简历。

  注意:在真实的开发项目中,开发工程师不可能开发所有的模块,只会负责某几个模块,大家所要描述的是:你所负责的模块(一般3到4个模块)。

2、淘淘网站的并发量

  大概:说5000左右也行。(此处要问怎么来的,可以说经过

压力测试

出来的,自己没做过,但是知道。有些情况下,并不是所有的事情都是由你来做,由面试官决定用不用你,你把所知道的说清楚就行)可以满足目前的业务需求。由于我们的系统是分布式架构,支持

水平扩展

,如果将来并发量提高的话,可以

增加服务器

来提高并发量。

3、淘淘商城人员的配置

  产品经理:3人,确定需求及给出产品原型图。

  项目经理:1人,项目管理。

  前端团队:5人,根据产品经理给出原型制作出静态页面(当然也包括UI)。

  后端团端:20人,实现产品的功能(你们就属于后端团队)。

  测试团队:5人,负责测试产品的所有的功能。

4、开发周期

  现在开发采用

敏捷开发,快速迭代

,开发周期大概6-8个月,后期一般采用

迭代的方式

开发,一般迭代的周期为一个月左右。(迭代就是所谓的一个小版本的开发)

5、SKU

表示唯一确定唯一的商品的单位(最小库存单位)SKU==商品ID

例如:对于京东的一款商品:一种颜色,一种配置,一种配送方式,就唯一确定一个商品,这种就叫做一个SKU。

类似于下图:

day82_淘淘商城项目_15_项目总结 + 项目中的问题_匠心笔记

6、你说你用了redis,你们redis存的是什么格式的数据,都是怎么存的?

  redis中存放数据都是key-value的形式。

  我们商城使用

string类型

来存放的。拿商品来说:商品的id就是key,商品相关的商品信息组成一个JSON存放。

7、你前台系统portal采用4服务器做集群部署,前台系统的并发量提升上去,那对于数据库会不会造成一个瓶颈,这一块你们是怎么处理的?

  portal在高并发的情况下,可以通过

部署集群

来提高并发量,这种时候,如果每次都访问数据,确实会对数据库造成很大的压力,那么这时候,我们就采用在

服务层增加缓存

,使用

redis实现

,这样客户端请求到达时,先从缓存中读取,如果存在数据则直接返回,而不会再从数据库查询,如果缓存中没有,则从数据库查询,这样就可减少数据库的访问,达到提升数据的访问瓶颈。

8、购物车存在cookie中,可以实现不登录就可以使用购物车,如果我没有登录,购买了商品,现在更换了设备(电脑),那还能不能看到我买的商品?如果看不到怎么做cookie同步?

  不能;现阶段,淘淘商城是采用cookie的方式存放购物车,以减少服务端的存储压力。但是弊端就是当更换设备后将看不到已添加的商品,也就是不能同步商品信息。

  打算下一步这么实现:当用户没有登录时,商品的数据放入购物车中,将存放于cookie中,此时如果用户登录,将cookie中的数据存放在redis中,并且是和用户的ID关联,并将cookie中的数据删除。此时如果用户更换设备,只要使用同一帐号登录,就可以看到购物车中的商品信息,就达到了同步cookie的目的。

9、你们商城是通过什么来做搜索的?

因为系统要使用站内搜索功能,数据量很大,需要使用solr。

solr是(基于lucene)搜索引擎,可以

独立部署

,来实现搜索功能、高亮显示、性能优化,可以

解决高并发

的搜索需求。

  例如:我们系统就是用solr做商品搜索。–> 怎么做的呢?

solr是一个服务器,需要搭建,需要先定义好

Field

FieldType

,定义

中文分词器

,再使用。

通过solr的Java客户端solrj连接solr服务,它提供丰富的操作索引的方法,可以通过这个客户端来实现搜索功能。

  你们索引库一般有多少数据?答:几百万

  如果数据量特别大?怎么办?答:做集群。

  索引库是如何同步?答:activemq异步消息队列。

10、solr和lucene他们之间有什么区别?

lucene

是一个

工具包

,类似于一个类库。

solr

是一个

基于solr的搜索引擎

,可以独立运行和部署,它可以通过

http请求来索引和搜索

  打个比方:solr就相当于一辆汽车,而lucene只是汽车中的引擎,你可以开车,但不开引擎。

另外,使用solr可以独立部署,扩展容易,所以可以最大程度的解耦,而lucene使用需要在业务逻辑中添加代码,逻辑耦合度很高,不易维护。

11、你们使用activemq应用在哪种业务场景中,既然都是系统通信,和其他的系统通信有什么区别?

  我们使用activemq应用在生成商品详情,同步索引库。

activemq是一个消息中间件

异步发送消息

,而其他通信技术:比如

dubbo

,是

同步等待

  比如:使用activemq在商品服务模块,添加商品并不需要等待索引库同步完成后才能继续添加下一个商品,只需要异步发送一个消息告诉索引服务 ,索引服务通过商品ID查询商品更新索引。

  再有:面试中,要淡定,如果有面试官问:数据库设计这样做正确吗?

  你不清楚的情况下,你就说我们公司就是这么解决的。其他的我不知道。

  有些面试官,可能他也不知道,他也想知道。

12、电商活动倒计时方案

  1、确定一个

基准时间

。可以使用一个sql语句从数据库中取出一个当前时间。

SELECT NOW()

  2、活动开始的时间是固定的。

  3、使用活动开始时间减去基准时间可以计算出一个秒为单位的数值。

  4、在redis中设置一个key(活动开始标识)。设置key的过期时间为第三步计算出来的时间。

  5、展示页面的时候取出key的有效时间。

ttl命令

。使用

js倒计时

  6、一旦活动开始的key失效,说明活动开始。

  7、需要在活动的逻辑中,先判断活动是否开始。

13、你们的商城的秒杀方案是什么?

  1、将商品的数量放入redis中。

  2、秒杀时,可以使用

decr命令

将商品的数量减一。如果不是负数说明抢到。

  3、如果返回的是负数,说明商品已经抢完。

14、dubbo服务使用流程,运行流程?zookeeper注册中心的作用?

使用流程:

  第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。

  第二步:有了注册中心然后是发布服务,发布服务需要使用

spring容器

dubbo标签

发布服务

。并且发布服务时需要指定注册中心的位置。

  第三步:服务发布之后就是调用服务。一般调用服务也是使用

spring容器

dubbo标签

引用服务

,这样就可以在客户端的容器中生成一个

服务的代理对象

,在action或者Controller中直接调用service的方法即可。

Zookeeper注册中心的作用:主要就是

注册和发现服务

的作用。类似于

房产中介

的作用,在系统中并

不参与服务的调用及数据的传输

15、redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?

  1、Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。并且redis的所有的数据都是放到

内存中

,存取的速度非常快,一般都是用来做缓存使用。

  2、项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了

减轻数据库的压力提高存取的效率

  3、在互联网项目中只要是涉及

高并发

或者是

存在大量读数据的情况下

都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等。

16、AcitveMQ的作用、原理?(生产者。消费者。 p2p、订阅实现流程)

  Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用

进行解耦

,实现系统间的

异步通信

。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。

17、ActiveMQ在项目中如何应用的?

  Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。

18、ActiveMQ如果数据提交不成功怎么办?

  Activemq有两种通信方式,

点到点模式

发布订阅模式

  如果是

点到点模式

的话,如果消息发送不成功此消息默认会保存到activemq服务端直到有消费者将其消费,所以此时消息是不会丢失的。

  如果是

发布订阅模式

的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于

对消息送达率要求不高

的情况。如果要求消息必须送达不可以丢失的话,需要配置

持久订阅

。每个订阅端定义一个id,在订阅时向activemq注册。发布消息和接收消息时需要配置发送模式为

持久化

。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

19、当被问到某个模快存在安全性问题(sso单点登录系统)时,如何回答?

  目前商城的sso系统的解决方案中直接把

token保存到cookie中

,确实存在安全性问题。但是实现简单方便。如果想提高安全性可以使用

CAS框架

实现单点登录。参考链接:https://www.apereo.org/projects/cas

20、当技术面试官问到你某个技术点更深层次研究时,自己没有深入了解怎么回答?

  如果没有深入研究就直接回答不知道就可以了。

21、如何把热点商品或者是推广商品的排名提高?

  可以设置

文档中域的boost值

,boost值越高计算出来的

相关度得分

就越高,排名也就越靠前。

22、solr的原理

  Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档

根据一定的规则拆分成若干个关键词

,然后根据关键词创建索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展示给用户的过程。

23、solr里面IK分词器的原理

  IK分析器的分词原理本质上是

词典分词

。现在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

21、支付接口是怎么做的?

  面试中可以说支付这部分不是我们做的,我们项目中并没有涉及支付部分的处理。如果想了解支付是如何实现可以参考之前学过的

易宝支付

相关处理以及

支付宝

微信支付

相关文档。

  支付宝:https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a.7629065.0.0.eeTXH8&apiId=850&docType=4#

  微信支付:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/faq_tmpl

24、业务如何说?先说业务、说表、说具体实现?

  先说总体的业务流程,然后再说具体业务的实现方法及使用的技术。最后说你在系统中负责的内容。不需要说表结构。

25、单点登录系统,如果cookie禁用,你们怎么解决?

  如果禁用cookie可以使用url中带参数,把token传递给服务端。当然此方法涉及安全性问题,其实在cookie中保存token同样存在安全性问题。推荐使用

SSO框架CAS

实现单点登录。

26、你们做移动端没有,如果没有移动端,你们为什么做单点登录?

  单点登录并不是为移动端准备的,移动端有自己的登录方式。单点登录是解决在

同一个公司内部多个互信网站之间进行跳转时不需要多次登录

,多个系统统一登录入口。

27、单点登录的核心是什么?

  单点登录的核心是如何

在多个系统之间共享身份信息(即共享session)

28、除了单点登陆,还做过什么登陆的方式?

  除了单点登录那就是

普通登录方式

,用户在

同一个公司的多个系统之间跳转时需要多次登录

29、单点登录,http无状态的,别人模仿如何在后端处理?

  http是无状态的,如果别人模仿浏览器发送http请求,一般后台是无法识别的。如果对安全要求高的情况下应该是

https协议

。可以保证在通信过程中无法窃取通信内容。

30、安全性问题(别的网站使用爬虫技术爬你的网站怎么办?有没有安全措施)

  单位时间内请求次数超过某个阈值就让

输入验证码

,可以

极大降低抓取的速度

,如果多次超过某个阀值可以

加入黑名单

。还有就是页面内容使用

json返回

,数据经常

变一变格式

,或者

js动态生成页面内容

31、商品存入数据库怎么保证数据库数据安全?

1、对用户安全管理

  用户操作数据库时,必须通过数据库访问的

身份认证

。删除数据库中的默认用户,使用自定义的用户及高强度密码。

2、定义视图

  为不同的用户定义不同的视图,可以

限制用户的访问范围

。通过视图机制把需要保密的数据对无权存取这些数据的用户隐藏起来,可以对数据库提供一定程度的安全保护。实际应用中常将

视图机制

授权机制

结合起来使用,首先

用视图机制屏蔽一部分保密数据,然后在视图上进一步进行授权

3、数据加密

  数据加密是保护数据在存储和传递过程中不被窃取或修改的有效手段。

4、数据库定期备份

5、审计追踪机制

  审计追踪机制是指系统设置相应的

日志记录

,特别是对数据更新、删除、修改的记录,以便日后查证。日志记录的内容可以包括操作人员的名称、使用的密码、用户的IP地址、登录时间、操作内容等。若发现系统的数据遭到破坏,可以

根据日志记录追究责任

,或者从日志记录中判断密码是否被盗,以便修改密码,重新分配权限,确保系统的安全。

32、订单表的数据量太大,我把订单分到许多表中,那么我我想用一条sql查处所有的订单,怎么解决?

  分库情况下:可以使用

mycat数据库中间件

实现多个表的统一管理。虽然物理上是把一个表中的数据保存到多个数据库中,但是逻辑上还是一个表,使用一条sql语句就可以把数据全部查询出来。

  单库情况下:需要

动态生成sql语句

。先查询订单相关的表,然后将查询多个表的sql语句使用

union连接

即可。

33、咱们单点登录模块中,别人伪造我们cookie中的token怎么办?

  

服务端是无法阻止客户端伪造cookie的

,如果对安全性要求高的话可以可使用

CAS框架

34、第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制?

  可以使用

mysql的行锁机制

,实现

乐观锁

,在更新商品之前将商品锁定,其他用户无法读取,当此用户操作完毕后释放锁。当

并发量高

的情况下,需要使用

缓存工具例如redis来管理库存

35、对数据库只是采用了读写分离,并没有完全解决数据库的压力,那么有什么办法解决?

  如果数据库压力确实很大的情况下可以考虑

数据库分片

,就是将数据库中表拆分到不同的数据库中保存。可以使用

mycat中间件

36、同一账号以客户端登录怎么挤掉另一端。

  用户登录后需要

在session中保存用户的id

。当用户登录时,从当前所有的session中判断是否有此用户id的存在,如果存在的话就把保存此用户id的

session销毁

37、solr的索引查询为什么比数据库要快?

  Solr使用的是

Lucene API

实现的全文检索。全文检索本质上是

查询的索引

。而

数据库中并不是所有的字段都建立的索引

,更何况如果使用like查询时很大的可能是不使用索引,所以使用solr查询时要比查数据库快。

38、solr索引库个别数据索引丢失怎么办?

  首先

Solr是不会丢失个别数据的

。如果索引库中缺少数据,那就向索引库中添加。

39、Lucene索引优化

  直接使用Lucene实现全文检索已经是过时的方案,推荐使用solr。

Solr已经提供了完整的全文检索解决方案

我的GitHub地址:https://github.com/heizemingjun

我的博客园地址:https://www.cnblogs.com/chenmingjun

我的蚂蚁笔记博客地址:https://blog.leanote.com/chenmingjun

Copyright ©2018~2019 黑泽君

【转载文章务必保留出处和署名,谢谢!】