1.东易买简介
1.1
东易买网上商城是一个综合性的 B2B2C 平台,类似京东商城、天猫商城。网站采用商家入驻的模式,商家入驻平台提交申请,有平台进行资质审核,审核通过后,商家拥有独立的管理后台录入商品信息。商品经过平台审核后即可发布。
东易买网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统
1.2网站前台
主要包括网站首页、商家首页、商品详细页、搜索页、会员中心、订单与支付相关页面、秒杀频道等
1.3运营商后台
是运营商的运营人员的管理后台。 主要包括商家审核、品牌管理、规格管理、模板管理、商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算等。
1.4商家管理后台
入驻的商家进行管理的后台,主要功能是对商品的管理以及订单查询统计、资金结算等功能。
1.2 系统架构(SOA架构)
SOA是Service-Oriented Architecture的首字母简称,它是一种支持面向服务的架构样式。从服务、基于服务开发和服务的结果来看,面向服务是一种思考方式。其实SOA架构更多应用于互联网项目开发。
why使用?
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已经无法应对,分布式服务架构一级流动计算架构势在必行,迫切需要一个治理系统确保系统在大的数据量下的稳定运行。
1.3 Dubbo框架
Dubbo是一个分布式服务框架,(提供高性能和透明化)RPC远程服务调用框架
关键字:服务调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfuxSIJq-1599985621140)
节点角色:
provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心。
Monitor:统计服务的调用次数和调用时间的监控中心
Container:服务运行容器
调用关系说明(Dubbo框架的执行流程):
0.服务容器负责启动,加载,运行服务提供者
1.服务提供者在启动时,向注册中心注册自己提供的服务
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
5.服务消费者和提供者,在内存中累计次数和调用时间,定时每分钟发送一次统计数据到监控中心
1.4 注册中心Zookeeper
注册中心负责的是服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力比较小。
1.5 前端框架AngularJS
核心特点:MVC、模块化、自动化双向数据绑定、依赖注入
1.5.1MVC模式
Angular为客户端的web应用带来了传统服务端的服务,例如独立于视图的控制。因此,后端减少了许多负担,产生了更轻的web应用
Model:数据,其实就是angular变量
View:数据的呈现
Controller:操作数据,就是function,数据的增删改查
1.5.2双向绑定
通过双向的数据绑定来适应动态内容,双向的数据绑定允许模型和视图之间的自动同步。所以Angular弱化了DOM的操作
1.5.3依赖注入
指某个对象依赖的其他对象无序手动创建。即此对象在创建时,其依赖的对象由框架自动创建并注入。
1.6 前端分层开发
1.6.1需求分析
js和html都放在一起的时候,这样代码的耦合性比较强,不利于后期代码的维护。所以前端代码中也引入了MVC的设计模式,将代码进行分离。提高了程序的可维护性
1.6.2自定义服务
在Angular中,服务是一个函数或者对象。其实我们也可以自己来定义服务,而服务会封装一些操作。我们在不同的控制器可以调用同一个服务,这样服务的代码可以被复用
1.7 SpringSecurity安全框架
Spring security 是一个能够为基于spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。可以直接在spring的xml文件中配置使用,与spring无缝衔接,完美配合使用。
所用依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
web.xml文件需要加载配置spring-security.xml
注意过滤器的名字必须固定为:springSecurityFilterChain
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
创建spring配置文件spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<!-- 配置 favicon.ico不进行安全拦截-->
<http pattern="/favicon.ico" security="none"/>
<!-- 页面拦截规则 -->
<http use-expressions="false">
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login/>
</http>
<!-- 认证管理器 -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="123456" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
注意:
/* 表示的是该目录下的资源,只包括本级目录不包括下级目录
/** 表示的是该目录以及该目录下所有级别子目录的资源
form-login 为开启表单登录
1.8 密码加密
1.8.1 BCrypt加密算法
加密算法:md5
用户表的密码通常使用MD5等不可逆算法加密后存储,为防止碰撞破解,一般会给密码加上一个字符串后再进行加密操作。BCrypt算法将salt(字符串)随机并混入最终加密的密码。
1.9 电商概念
1.9.1 电商概念SPU和SKU
**SPU(Standard Product Unit :标准产品单位)**是商品信息聚合的最小单位,十一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性
SKU=stock keeping unit(库存量单位):即库存进出计量的单位,可以是件、盒、托盘等单位
SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理存货单元
1.10 分布式文件服务器FastDFS
1.10.1 什么是FastDFS
1.FastDFS是用C语言编写的一款开源的分布式文件系统。
2.FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标
3.使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.10.2 Tracker server 和 Storage server
Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
Storage server作用是文件存储,客户端上传的文件最终存储在啊Storage服务器上,Storageserver没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器
注意:
服务端两个角色:
Tracker: 管理集群,tracker也可以实现集群。每个tracker节点地位平等。手机Storage集群的状态。
Storage:实际保存文件 Storage分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。
1.11 Redis
redis是一款开源的key_value数据库,运行在内存中,由ANSIC编写。企业开发通常采用redis来实现缓存。
1.11.1 Jedis
Jedis是Redis官方推出的一款面向java的客户端,提供了很多借口供java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端
1.11.2 Spring Data Redis
Spring Data -redis是spring大家族的一部分,提供了在spring应用中通过简答的配置访问redis服务,对redis底层开发包(Jedis,JRedis,and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
spring-data-redis针对jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口。
ValueOperation : 简单K-V操作
SetOperation :set类型数据操作
ZSetOperation:zset类型数据操作
HashOperations: 针对map类型的数据操作
ListOperations : 针对list类型的数据操作
1.12 搜索解决方案 Solr
Solr是一个外部的搜索服务器,是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。Solr可以和Hadoop一起使用。由于Hadoop处理大量的数据,Solr可以从大量的数据中找到所需要的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQl数据库一样,他是一种非关系数据存储和处理技术。
1.13 中文分析器 IK Analyzer
Ik Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。
1.14 Spring Data Solr
通过Spring Data Solr可以把Solr的应用继承到Spring中,其底层是对Solr的封装
1.15 网页静态化解决方案 Freemarker
1.15.1 为什么要使用网页静态化技术?
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。
1.15.2 什么是网页静态化?(定义)
网页静态化是指通过动态网站静态化将动态网站以静态化的方式展现出来
1.15.2 网页静态化的优点和好处?
1.静态页面相对于动态页面更容易被搜索引擎收录
2.访问静态页面不需要经过程序的处理,因此可以提高运行速度
3.减轻服务器的压力(多适用于不经常改变的页面)
4.比较有安全性(数据库或者网站出了问题,不会因为程序或者数据影响打不开页面)
5.加快页面的打开速度,第一次访问的时候,静态页面会在用户的浏览器缓存
1.15.3 为什么要使用网页静态化?
如果访问一个链接,服务器对应的模块会处理这个请求,转到对应的jsp页面,最后
生成我们想要的数据,缺点显而易见,因为每次请求服务器都需要服务器进行响应,如果有很多高并发请求,就会加重应用服务器的压力。很容易打爆服务器。所以应该采用用户访问这个模块,而且这个模块不同的用户访问呈现出来的页面一样,就可以把这个页面做成静态化页面的形式。这样就大大减小了服务器的压力
1.15.4 Freemaker常用指令?
1.assign指令:该指令用于在页面上定义一个变量
2.include指令:此指令用于模板文件的嵌套
3.if指令:此指令进行条件判断
4.list指令:声明一个list变量
1.15.5 Freemaker内建函数格式是什么?有哪些常见的内建函数?
内建函数:
语法格式:变量+?+函数名称
常见的内建函数:
1.获取集合大小
2.转换JSON字符串为对象
3.日期格式化
4.将数字转换为字符串
1.16 消息中间件(非常重要)AcitiveMQ
1.16.1 什么是消息中间件?
官方定义:是利用高效可靠的消息传递机制进行异步的数据传输,并基于数据通信进行分布式系统的集成。通过提供消息队列模型和消息传递机制,可以在分布式环境下扩展进程间的通信。
1.16.2 为什么要使用消息中间件?
由于在高并发的环境下,由于来不及同步处理,请求往往会发生堵塞,甚至最后由于请求过多会导致数据库的崩溃。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力
1.16.3 消息中间件可以做什么?
消息的生产者将消息存储在队列中,消息的消费者不一定马上使用,等到消费者要使用这个消息的时候,再去对应的队列中获取消息。这样可以很好的解决,大数据量数据传递或查询所占用的资源
1.16.4 消息中间件的优点?
1.解耦 2. 异步 3. 削峰
场景一:A系统发送数据BCD三个系统,通过接口调用发送。如果E系统也要这个数据呢?
该场景的引出问题?
如果一直采用接口调用的方式发送数据,
1.首先会给A系统带来比较大的压力,
2.还会导致A系统跟其他各种乱七八糟的系统严重耦合。
3.如果BCD系统挂掉或者重启,还会再次对A系统产生压力
使用MQ的好处:
如果使用MQ,A系统产生一条数据,发送到MQ里面去,那个系统需要数据自己去MQ里面消费。如果新的系统需要数据,直接从MQ里面消费即可,就取消对MQ的消费即可。这样下来,A系统就不需要去考虑要给谁发送数据。这样就把若干个系统与A系统的耦合,解耦为若干系统与消息中间件的耦合
场景二:A系统接收一个请求,需要在自己本地写库,还需要在BCD三个系统写库,一般互联网类的企业,对于用户直接进行的操作。一定要快速响应用户的请求。所以可以把需要的操作放到消息队列中,慢慢处理。比如:用户支付
使用MQ就可以减少用户的等待时间
场景三:削峰
每天的0:00到12:00,A系统没有太大的数据请求。结果每次一到12:00,并发请求就会增加大很大,但是系统是基于mysql的。大数据量的并发请求就会很容易把mysql打爆。但是高峰期一过,就没有太高的并发量
解决方案:
使用消息中间件,可以把一段时间内的高并发量的请求放到mq中,然后慢慢从mq中拉去请求,慢慢处理。当然这个只能解决当前不是特别重要的业务逻辑请求,需要等待。可能会积压几十万的请求,但是不会让系统崩溃掉。
1.16.5 除了ActiveMQ之外还有哪些消息中间件,他们的优缺点是什么?
消息中间件一般经常使用的为 ActiveMQ,RobbitMQ,RocketMQ,Kafka
1.在处理数据的性能上ActiveMQ和RobbitMQ的处理速度要比 RocketMQ和Kafka慢
2.在时效性上,RobbitMQ的延迟最低。其他三个都是控制在微妙级别
3.可用性,ActiveMQ和RabbitMQ基于主从架构实现高可用,而RocketMq和Kafka都是基于分布式架构,一个数据多个副本,少数机器宕机,不会丢失数据,容错性比较高
4.消息可靠性 RocketMQ和kafka的数据基本不会丢失数据。比ActiveMQ和RabbitMQ的可靠性强
5.功能支持 :ActiveMq领域的功能及其完善,RabbitMQ基于erlang开发,并发能力极强,功能极好,延时很低。RocketMq:功能较为完善,还是分布式的,扩展性好
Kafka:功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用
1.16.6 什么是JMS?消息正文格式有几种,分别是什么?
JMS是java平台上有关面向消息中间件的技术规范,他便于消息系统中的java应用程序进行消息交换。
正文格式:
TextMessage:一个字符串对象
MapMessage:一个键值对
ObjectMessage:一个序列化的对象
BytesMessage:一个字节的数据流
StreamMessage:原始值的数据流
1.17 单点登录
1.17.1 什么是单点登录?
单点登录,简称SSO(Single Single On),是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统的方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
SSO单点登录访问流程主要有以下步骤:
1.访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
2.定向认证:SSO客户端会重定向用户请求到SSO服务器
3.用户认证:用户身份认证
4.发送票据:SSO服务器会产生一个随机的Service Ticket
5.验收票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
6.传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
1.18 购物车解决方案
1.18.1 购物车实现简单描述
当用户未登录的情况下,将此购物车存入cookies,在用户登录的情况下,将购物车数据存入redis。如果用户登录时,cookies中存在购物车,需要将cookies的购物车合并到redis中存储。
1.18.2 商品详细页跨域请求
从商品详细页点击“加入购物车”按钮,将当前商品加入购物车,并跳转到购物车页面
1.18.3 JS跨域请求
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中的数据。只要协议、域名、端口有任何一个不同,都被当做是不同的域
1.19 跨域解决方案
CORS是一个W3C标准,全称是“跨域资源共享”。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10.
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
请求过程如下图:
1.19 SpringMVC跨域注解
Springmvc的版本在4.2或以上版本,可以使用注解实现跨域,我们只需要在需要跨域的方式上添加注解@CrossOrigin即可
ORS是一个W3C标准,全称是“跨域资源共享”。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10.
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
请求过程如下图:
[外链图片转存中…(img-WUfRVhdW-1599985621151)]
1.19 SpringMVC跨域注解
Springmvc的版本在4.2或以上版本,可以使用注解实现跨域,我们只需要在需要跨域的方式上添加注解@CrossOrigin即可