商城项目技术整理

商城项目技术整理

项目相关问题

  1. 为什么要使用分布式项目?有什么缺点?

    因为传统模式项目模块之间耦合度太高,其中一个升级其他都要升级,且开发困难,各个团队都要整整合在一起,而分布式项目把模块拆分,使用接口通信,降低模块之间的耦合度,对项目进行了拆分,各个团队负责不同的子项目,需要其余项目的功能时,只需要调用接口就可以。

    缺点:系统之间交互需要使用远程通信,接口开发增加工作量。服务越来越多,需要管理每个服务的地址,调用关系错综复杂,难以理清依赖关系。

项目使用的第三方组件

  1. vsftpd文件上传服务器
    商城项目技术整理

    • 为什么要用Vsftp文件服务器?

      因为在分布式项目下,项目可能是在多个不同的web服务器下运行,上传的图片如果只在一台服务器下,其他服务器就无法访问了,这样将造成资源的极大浪费。

      考虑到项目以后打包上传服务器,随着文件的增多,系统打包变慢,需要采用专门的文件服务器

  2. Redis

    • 为什么要使用Redis,有什么优点?

      这个问题在大并发,高负载的网站中必须考虑。Redis数据库中的所有数据都存储在内存中,由于内存的读写速度远快于硬盘,因此Redis在性能上比其他基于硬盘存储的数据库有非常明显的优势。

      并发:在大并发的情况下,所有的请求直接访问数据库,数据库出现连接异常。这个时候,就需要使用Redis做一个缓存操作,让请求先访问Redis缓存,而不直接访问数据库。

      优点:

      1、运行在内存,数据的加载速度快。

      2、数据虽然在内存中,但是提供了持久化操作,即可以将内存中的数据异步写入硬盘中,同时不影响继续提供服务

      3、降低了对关系型数据库的访问,保护了关系型数据库。

      4、支持丰富的数据类型,String、Hash、List、Set、Sortd set

      **缺点:**加入Redis可能影响系统架构,开发难度大

    • Redis支持什么数据类型?

      数据类型 特点
      String(字符串) 简单的Key-Value类型,Redis的String可以包含任何数据,比如图片或者***对象。
      Hash(哈希类型) 是一个String类型的Field和Value的映射表,Hash特别适合用于存储对象
      List(链表) 有序可重复的列表,使用 List 的数据结构,可以做简单的消息队列的功能。
      Set(集合) 无序不可重复的列表,可以做全局去重的功能
      Sorted set(有序 ) 多了一个权重参数 Score,集合中的元素能够按 Score 进行排列。可以做排行榜应用
    • 什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

      **Redis持久化:**持久化就是把内存中的数据写到磁盘中,防止服务宕机了内存数据丢失。

      **两种持久化方式:**RDB(默认)和AOF

      **RDB:**快照形式,通过save命令定期把内存中当前时刻的数据保存到磁盘

      ​ 使用场景:如果项目并发并不是严重,数据一致性要求不是很高,用RDB

      ​ 优点:可以定时将数据写入磁盘,速度快

      ​ 缺点:可能丢失数据

      **AOF:**Append Only File。把所有对Redis数据库写操作的命令,都记录到日志文件中。在Redis重启时,会把AOF文件中记录的所有写操作按顺序执行一遍,确保数据恢复到最新。

      ​ 使用场景:对数据一致性要求非常高,数据不能丢失,并且并发访问量比较大,用AOF

      ​ 优点:数据不会丢失,能保证数据的完整性

      ​ 缺点:所有命令都存到文件中,随着用户访问量的增大,文件变得越来越大,加载速度就会越来越慢

    • 为什么要搭建读写分离和主备切换环境?

      **读写分离:**一边读一边写,速度比较慢,可以让服务器只负责读和写,提高性能,如果只有一台,不能保证服务器不出问题,所有要搭建主从复用-读写分离的环境。

      **主备切换:**当主服务器挂掉后,可以在从服务器中选举新的主服务器,工作人员发现原来的主服务器挂掉后重启,有变成新的从服务器。

    • Redis如何保证缓存和数据一致性?

      **当更新的时候,先更新数据库,然后再删除缓存,读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。**乍一看,一致性问题貌似很好的得到了解决。但仔细一想,你会发现还是有问题:如果先更新了数据库,删除缓存的时候失败了怎么办?那么数据库中是新数据,缓存中 是老数据,数据出现不一致了。

      改进方案: 先删除缓存,后更新数据库。因为即使后面更新数据库失败了,缓存是空的,读的时候会从 数据库中重新拉,虽然都是旧数据,但数据是一致的。

      所以方案就变成了: 更新的时候,先删除缓存,然后再更新数据库。读的时候,先读缓存;如果没有的 话,就读数据库,同时将数据放入缓存,并返回响应。

      在高并发的场景下,会出现这样的情况:**数据发生了变更,先删除了缓存,然后去修改数据库。**此时还 没来得及修改,一个请求过来了,去读缓存,发现缓存空了,去读数据库,读到了准备修改前的旧数 据,并且把旧数据放到了缓存。随后,数据变更程序完成了数据库的修改。那么完了,这个时候发生数 据不一致了…

      一般缓存是这样的:

      ​ 1:读的顺序是先读缓存,后读数据库

      ​ 2:写的顺序是先写数据库,然后写缓存

      ​ 3:每次更新了相关的数据,都要把该缓存清理掉

      ​ 4:为了避免极端条件下造成的缓存与数据库之间的数据不一致,缓存需要设置一个失效时间。时间到了,缓存自动被清理,达到缓存和数据库数据的“最终一致性”

    • 项目中如何使用Redis的?

      1、前台需要对商品分类和商品列表展示的时候,由于数据量很大,且很多页面均可展示这些数据,所以使用了Redis缓存数据库

      2、单点登录时,将票据信息存入Redis,如果没有票据信息,则用户没有登录

      3、购物车功能

    • 如何应对缓存穿透、缓存击穿、缓存雪崩问题?

      缓存穿透:是指查询一个数据库一定不存在的数据。

      缓存击穿:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开一个洞。做电商项目时,把这货叫做“爆款”。

      缓存雪崩:是指缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

  3. Dubbo、Zookeeper

    • Dubbo是什么?

      Dubbo是阿里巴巴开发的基于Java的高性能RPC分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间耦合,现在已经成为Apache基金会孵化项目。

    • 为什么要使用Dubbo?

      当网站规模达到了一定的量级的时候,普通的MVC框架已经不能满足我们的需求,于是分布式的服务框架和流动式的架构就凸显出来了。
      商城项目技术整理

      单一应用架构

      垂直应用架构

      • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC) 是关键。
      • 缺点:垂直架构中相同逻辑代码需要不断的复制,不能复用。每个垂直模块都相当于一个独立的系统。

      分布式服务架构

      • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定 的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服 务框架(RPC) 是关键。
      • 缺点:服务越来越多,需要管理每个服务的地址,调用关系错综复杂,难以理清依赖关系,服务状态难以管理,无法根据服务情况动态管理。

      流动计算架构

      • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA) 是关键。
      • 缺点:服务间会有依赖关系,一旦某个环节出错会影响较大,服务关系复杂,运维、测试部署困难,不符合 DevOps 思想。

      微服务架构

      • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
      • 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
      • 面向服务:面向服务是说每个服务都要对外暴露服务接口 API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供 Rest 的接口即可。
      • 自治:自治是说服务间互相独立,互不干扰
    • Dubbo和Zookeeper有什么关系,你们项目Dubbo用的是什么协议(Dubbo)?

      简单来说打个比方:dubbo就是动物园的动物,zookeeper是动物园。如果游客想看动物的话那么就去动物园看。比如你要看老虎,那么动物园有你才能看到。换句话说我们把很多不同的dubbo(动物)放到zookeeper(动物园中)提供给我们游客进行观赏。这个过程中三个关键:场所、供给者、消费者。

      再说一个分布式的项目,server(消费)层与 service(供给)层被拆分了开来, 部署在不同的tomcat中, 我在server层需要调用 service层的接口,但是两个运行在不同tomcat下的服务无法直接互调接口,那么就可以通过zookeeper和dubbo实现。就好比把动物放到动物园,我们要看了直接去动物园就行。而不能直接去动物生活的地方去看,会有性命安全之忧(比如你去看老虎)。

      我们通过dubbo 建立service这个服务,并且到zookeeper上面注册,填写对应的zookeeper服务所在的IP及端口号。

    • 画以下Dubbo的流程,角色,Dubbo服务治理框架大致实现流程?

      Dubbo提供三个核心功能:基于接口的远程调用、容错和负载均衡,以及服务的自动注册与发现
      商城项目技术整理

      节点角色说明

      Provider:暴露服务的服务提供者

      Consume:调用远程服务的服务消费者

      Register:服务注册与发现的注册中心

      Monitor:统计服务的调用次数和调用时间的监控中心

      Container:服务运行的容器

      dubbo架构实现流程

      1. 服务容器负责启动,加载,运行服务提供者。
      2. 服务提供者在启动时,向注册中心注册自己提供的服务。
      3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
      4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
      5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
      6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
  4. ElasticSearch

    • 什么是ElasticSerarch、Lucene,为什么要用ES?

      **Lucene:**就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。

      **ES:**是一款基于Lucene的实时分布式搜索和分析引擎。Lucene是单机的模式,如果你的数据量超过了一台物理机的容量,你需要扩充,将数据拆分为2份放在不同的集群,这个就是典型的分布式计算了。

      为什么要用es?

      因为我们商城中的数据将来会非常多,如果采取原来的like模糊查询,不但查询不到想要的结果,而且商品查询会全表扫描,效率非常低下;而我们使用ES做一个全文索引,我们将经常查询的商品的某些字段,比如说商品名,描述、价格还有id这些字段我们放入我们索引库里,可以提高查询速度。

    • ES和MySQL的对比

      DataBase(数据库) Index(索引库)
      table(表) type(类型)
      row(行) document(文档)
      column(列) fieId(字段)
      1. 一个 ES 集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很 多文档(行),每个文档又包含了很多字段(列)。
      2. 传统数据库为特定列增加一个索引,例如 B-Tree 索引来加速检索。Elasticsearch 和 Lucene使用一种叫做**倒排索引(inverted index)**的数据结构来达到相同目的。
    • 什么是全文检索、倒排索引?

      **全文搜索:**是指计算机搜索程序通过扫描文章中的每个词,对每个词建立一个索引,指明该词再文中出现的次数和位置,当用户查询时,搜索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户。

      **倒排索引:**源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值,而是由属性值来确定记录的位置,因而称为倒排索引。

    • 为什么ES那么快?它的数据是存在内存中还是磁盘中?

      1.因为ES采用的是一种叫做倒排索引的数据结构来实现的,倒排索引就是通过value找key,根据输入的 关键词获取到它在当前文档中的文档频率,根据频率拿出倒排文档列表,不用像正排索引一样去和索引 库中每一个文档进行比对,所以大大提升了搜索速度。

      2.ES中的分片机制,ES将一组完整的数据分布于各个分片,从各个分片取出来拼成一个完整的数据返回 给用户,而不是只从一个分片当中取数据,就好比一个学生做十道题,和十个学生做十道题,肯定是后者速度快。

      它的数据存储在内存中,在ElasticSearch 2.4版本中,文档存储的介质分为内存和硬盘:内存速度快,但是容量有限;硬盘速度较慢,但是容量很大。同时,ElasticSearch进程自身的运行也需要内存空间,必须保ElasticSearch进程有充足的运行时内存。为了使ElasticSearch引擎达到最佳性能,必须合理分配有限的内存和硬盘资源。

  5. 单点登录SSO

    • 什么是单点登录?实现原理说一下?

      单点登录:简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

      实现原理:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据——ticket;用 户再访问别的应用的时候,就会将这个 ticket 带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket 送到认证系统进行校验,检查 ticket 的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统 2 和应用系统 3了。