前言

因为我这里写的是乐优商城项目,所以面试我会按照乐优商城项目来回答
关于具体的架构另一篇blog上有写

问题一:请简单的介绍一下你自己吧!

1.自我介绍:个人信息+教育经历+项目经验

您好,我叫杨椰,我是一名大四应届毕业生,毕业于一所普通二本学校.目前暂无工作经验来找实习工作,有做过一个乐优商城的项目经验(为时一个月):它是一个全品类的电商购物网站(B2C)主线功能就是:用户可以在线购买商品,加入购物车,下单等,管理员可以在后台管理商品的上下架,监控商品销售状况。而我所主要做的就是将这些提供好的Rest风格的业务接口一一实现。

2.如果问到专业:你不是本专业学生为什么选择这个行业

类似作文的技巧:先抑后扬:肯定自己的不足,但是突出自己的优点(所以语气重词突出在但是)

  • 因为喜欢,没错,我不是本专业的学生,这虽然看起来是我简历的缺点:不是本专业学生未具备良好的一个硬件实力基础:教本知识,类似目前的一些公司招聘门槛可能会是必须是与计算机相关专业的学生。
  • 但是呢,我觉得这同时也凸显了我的优点:我不是本专业的学生,现在却依旧能站在面试官您的面前,想必,我也是付出了一些精力和时间的。我觉得我有很强的学习能力和自觉能力。我有很大的自信,我并不比计算机相关专业的学生差。即使现在可能还是一个小菜鸟,但日后我绝对会更加优秀与日变强,我相信我会做到。

3.如果问到你是女生你为什么选择这份工作

突出女性的优点:细心

  • 原因还是因为自己真实喜欢,我知道这个社会大多对女性带有偏见,大学期间,有老师曾说过:性别有时候是一个公司招聘的隐性条件,而如果我不喜欢,我大可不必选择这样一份技术能力要求很高的工作。很多人可能会说:女性在这方面逻辑思考能力相对对男性较弱。但是女性也有更强的地方:细心。这对于一些bug的寻找等等,也有很大的帮助。在我所知:程序媛占比很少,当然我也希望我能成为这占比很少中的优秀程序媛的一份子。

问题二:谈谈你的项目吧!

1.分析:

考官通过看你的简历或者你的介绍来了解你所做的项目,那么考官肯定想更详细的了解你的项目,看是不是与你的简历写的项目经验一致。也就是考核你是否具有真实的项目经验。一般来说,在你的简历至少有一个重点项目,放在简历项目经验栏的第一位。把项目的业务功能描述清楚。在这里你就是重点谈一个项目就可以了。 从下面几个方面来进行陈 述

  • 1. 用一句话简述项目
  • 2. 详细的列出项目实现的功能
  • 3. 说出项目实现的技术和架构,能说出项目的不寻常之处,比如采用了某项新技术,采用 了良好的架框等
  • 4. 能让别人感觉出项目的规模
  • 5. 说出你在项目中的责任 通过这些来证明你是的确开发过了这个项目, 并且这个项目是一个真实的。
    还有就是你是真正具有项目经验的。合乎企业的用人需要。 特别注意要把项目所实现的功能描述得越详细越好。当然用词要简洁,表达要流利。其次要尽可能采用专业术语,显得你的专业。不要犯低级错误。 请记住, 你要描述的是整个项目而不仅仅是你做的那一个模块。 有些项目你只参与了其中一个模块,但是你要把整个项目描述出来,不要仅仅描述你参与的那一个模块。 说出你项目采用的技术及架构,还要能说明你在项目中的责任。

2.回答

乐优商城这个项目采用了目前流行的微服务架构方案。我们选择的是以SpringCloud为核心的,基于Rest风格的微服务架构。我们整个项目是采用了前后端分离的开发模式。

前端分为两部分:

  • 后台管理:主要面向的是数据管理人员,是基于Vue单页应用开发的
  • 门户系统:面向的是客户,门户采用的Vue结合Nuxt实现服务端渲染方式

后端

  • 采用基于SpringCloud的微服务架构,统一对外提供Rest风格接口,无论是后台管理还是门户系统都共享这些微服务接口,而微服务中通过JWT方式来识别用户身份,开放不同接口。

注意:
到这里先不说了,如果继续追问微服务拆分粒度或者SpringCloud细节,再接着回答微服务拆分

(这里大概介绍一下即可,我写的比较详细)
整个项目分为十二个部分:网关,eureka注册中心,公用工具类以及9个微服务
无论是前台还是后台系统,都共享相同的微服务集群,包括

  1. Eureka注册中心
  2. zuul网关服务
  3. 公用工具类:vo,dto,工具类,自定义异常类及枚举等等…

且基于nginx实现初步的请求 负载均衡和请求限流

(九微服务)

  • 1.商品微服务: 主要是进行商品分类管理、品牌管理、商品规格参数管理
    在这里,我记得有一个难点就是商品规格参数的管理:你需要设计Spu(standard product unit标准产品单位)和Sku(standard product unit库存量单位),设计这个你需要去寻找规律,我是看那个京东和淘宝商品详情页下面的规格参数:发现同一分类的规格参数名称是一样的,规格参数名称和分类id绑定到一起,规格参数值和商品id绑定到一起,这里就要设计两个表,采用竖表设计,一个规格组和一个规格参数表。
    额…库存管理设计有一个很大的问题:分布式事务的问题,另说。
  • 2.文件上传微服务: 因为品牌的新增那里需要添加品牌的图片,我就把他给独立出来作为一个文件上传微服务,以后不管是文件还是图片都可以远程调用该微服务。
    这里用到了一个技术就是FastDFS,即分布式文件存储(基于FastDFS解决大数据量的分布式文件存储问题),因为文件上传保存在本地即服务器机器肯定是有问题的,因为单机器存储能力是有限的。
    然后FastDFS它本身是一个轻量级、高性能的开源分布式文件系统,可以做文件存储、同步、访问上传、下载等功能。
    比如上传的大概流程就是:客户端发送文件上传请求给跟踪者TrackerCluster(本身保存组的信息,组有哪些机器),跟踪者跟踪每一次文件上传的路径向去存储集群(storage cluster)查找,并返回可用的存储服务器的ip地址和端口号给客户端,客户端再通过ip和端口号与其中一台存储服务器简历连接,并进行文件上传。最后存储集群返回一个文件ID。【根据上传流程图即非常好理解,所以我决定给他画个图
  • 3.搜索微服务: 主要就是门户系统页面进行商品查找等等. 这里主要采用的技术就是elasticsearch,用来完成商品的全文检索功能
    用它的原因是:
    1.它本身就是基于json的分布式搜索和分析引擎,不需要人工搭建集群,比solar快,因为它能实时搜索。
    2.Restful风格,一切API都遵循Rest原则,易上手(GET/POST/PUT/DELETE)
    3.近实时搜索,数据更新在ElasticSearch中几乎是完全同步的。
    我是把elasticsearch装在了虚拟机里面,然后又在其里面安了一个ik分词器的插件,方便用来查询。
    然后,这里有个难点就是搜索的过滤条件生成,例如:高级聚合功能,说难其实也不难,你首先需要了解并学习全文检索的一些语法:聚合,查询什么的…然后把他们变为java代码。只是java代码实现时候的逻辑可能会比较复杂。
  • 4.页面静态化微服务: 主要是把动态生成的html页面变为静态内容保存,以后用户的请求到来,直接访问静态页面,不再经过服务的渲染。可以大大提高页面响应速度和并发能力
    在项目里:是用在商品详情页的静态化
    这里用到的技术就是ThyMeleaf实现页面模板和静态化,提高页面响应速度和并发能力。并且SpringBoot里已经自动配置了模板引擎,只需要引ThyMeleaf依赖即可。
  • 5.短信微服务: 完成短信的发送,对接阿里云平台,通过RabbitMQ(消息队列) 实现异步的短信发送
    这个里面得注意:需要进行限流,对同一个手机号发送消息限制一分钟之后才可以再发送验证
    这里是在阿里云里面注册了账号开通了短信业务。
  • 6.用户微服务: 主要是实现用户的登录注册、用户信息管理等业务 用户注册、注册数据校验、查询用户信息、
  • 7.认证微服务(即授权中心): 对用户权限(及服务权限(未实现))进行认证 这里有几个点:需要注意
    1.登录授权功能:(判断用户是否存在,存在生成token,把token写入Cookie中保存)
    2.校验用户登录功能:(无token:未登录,有token:解析token,并刷新token(即重新生成token)再写入Cookie,因为Cookie是默认30分钟就消失的,如果用户仍旧在页面操作,那你需要重新设置token并写入Cookie)
    3.网关需要进行登录拦截:(有些路径应该放行,登录之后仍可访问)
    这里使用了JWT和RSA非对称加密,让token更具有安全性
    刁钻问题:
    cookie被禁用怎么办:给个提示,你的cookie被禁用了,请打开
    cookie被盗用怎么办:把用户ip加到PayLoad中,即进行身份识别,如果不对,返回不安全信息让你修改密码。
  • 8.购物车微服务: 实现购物车相关功能
    离线购物车:主要使用localstorage保存到客户端,几乎不与服务端交互
    在线购物车:使用Redis实现。利用redis实现可靠缓存服务即热点数据保存
    设计双层Map:Map<String,<String,Object>>把这个放到redis里面
    第一个key是用户id,第二个key是购物车id,值是购物车信息 购物车CURD
  • 9.订单微服务: 实现订单相关业务(创建订单,查询订单信息)
    创建订单需要
同时减库存,跨服务业务,需要注意事务处理,流程 	
 查询订单提交的商品信息 	
 计算订单总价(计算商品总价+邮费-优惠券) 	
 写入订单、订单详情、订单状态
 减库存,远程同步调用商品微服务,实现减库存(这种方法只是取巧)

对于减库存问题:我们需要解决分布式事务问题(2PC,TCC,MQ异步确保)