分布式-面试题

1.电商行业特点

  1. 分布式
    垂直拆分:根据功能模块进行拆分;
    水平拆分:根据业务层级进行拆分。
  2. 高并发
    用户单位时间内访问服务器数量,是电商行业中面临的主要问题。
  3. 集群
    抗击高并发的有效手段,同时集群内部实现高可用。
  4. 海量数据处理
    随着公司数据的不断积累,自身的数据量很庞大。

2.分布式项目

2.1 设计思想

为了实现架构之间的松耦合,将项目根据分布式的思想进行拆分。

  1. 项目的垂直拆分
    根据功能模块的不同将项目进行拆分。
  2. 项目的水平拆分
    在大型项目中,由于开发的人数众多,项目复杂度高。为了保证项目开发的耦合性低,实现项目的水平拆分。
    将一个大型项目根据层级模块进行拆分:Controller项目/Service项目/Mapper项目,项目创建时采用聚合项目的方式进行管理。

2.2 如何管理jar包

问题描述:往常进行开发都是将所有的业务都包含在一个项目中,这样我们项目所需要的所有jar包都在一个项目下进行管理。但是如果是多个项目共同开发,怎么管理jar包?

将项目中用到的公共的jar包抽取为一个单独的项目xx-parent,其他的项目只需要继承xx-parent项目,就可获取对应的jar包依赖。从而实现了jar包的统一管理。

2.3 如何管理工具类

问题描述:大型项目中经常会用到一些工具类,如果每个项目都单独引入工具类会造成代码维护的不方便,怎样对工具类进行管理?

可以将工具类抽取为单独的项目xx-common,如果开发时需要用到工具类,只需要将工具类像引用maven的依赖包一样,添加工具类的jar包文件依赖即可。

3.Nginx是什么?它的作用

Nginx (engine x) 是一个轻量级的、高性能的HTTP和反向代理服务器。
其特点是占有内存少,并发能力强。
主要用来反向代理和实现负载均衡。

4.谈一下反向代理和负载均衡

4.1反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

  • 反向代理服务器位于目标服务器与用户之间.
  • 对于用户而言,反向代理服务器就是目标服务器.
  • 用户访问时根本不清楚真实的服务器资源是谁,保护了真实服务器资源信息.
  • 反向代理服务器一般是服务器端代理,保护真实服务器信息.
    在这里插入图片描述
    过程:Nginx首先需要监听特定的域名,当用户根据域名进行资源访问时,首先会访问nginx,之后nginx代替请求者根据内部的配置文件,实现虚拟地址与本地磁盘地址之间的映射关系,实现反向代理,将请求转化为特定的请求路径进行资源访问;当Nginx获取资源后将数据返回给用户完成请求,正确响应。

4.2正向代理

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

  • 代理服务器位于用户与服务器之间
  • 用户发起请求时,清楚的知道自己访问的真实服务器是谁.
  • 代理服务器将用户的请求转交给服务器获取数据.
  • 正向代理是客户端代理,保护了用户的信息.

一般用户网络通信的使用:路由器
在这里插入图片描述

4.3负载均衡

在分布式条件下,为了提高用户请求的响应能力,准备多台服务器.一起抗击高并发.需要用户通过同一个网址访问不同服务器的技术称之为负载均衡机制.
访问量高时,可以让服务器尽量分摊压力.

  • 负载均衡策略:轮询 权重 IPHash
    在这里插入图片描述

5.数据库数据如何备份(数据备份策略)

1.冷备份:定期将数据库中的文件进行转储,定期进行数据备份.

2.热备份:搭建数据库主从结构,当主库数据发生改变时,从库根据主库的二进制日志文件进行备份.可以保证数据的实时备份.

  • 原理:数据库主库将更新的数据信息写入到二进制日志文件中;从库通过IO线程去读取该文件,之后将数据写入到中继日志中;从库中的Sql线程会读取中继日志中的信息,将该信息写入从数据库中,实现数据的同步。并且为了降低组件之间的耦合性,采用异步的方式处理。

3.双机热备:数据库互为主从,数据库代理服务器对主库进行心跳检测,实现数据的高可用,为了防止主库宕机后发生雪崩现象

  • 数据库高可用:当其中有一台数据库宕机之后,用户依然可以正确的访问数据库不受任何影响,(实现了故障迁移).主要数据库能够正常的工作,则重新启动数据库之后则可以实现自动的数据的同步.

8.什么是Mycat

一个数据库中间件,实现读写分离,分库分表和数据库故障迁移.

9.Redis

9.1 什么是Redis,运行在哪里

Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)等。

Redis基于C语言开发,运行在内存中,运行速度很快。

9.2 Redis中的数据持久化策略

Redis的数据都保存在内存中,如果断电或者宕机,会导致数据的丢失.为了防止数据丢失,Redis内部有持久化机制.

如果使用时允许丢失部分数据(少量的),则使用RDB模式,效率高,也是redis默认的策略;如果不允许丢失数据,则采用AOF模式,安全性高,但是效率较低;也可以2种方式都选, 搭建主从结构 , 主机选用RDB模式, 从机选用AOF模式。

RDB模式
  • redis中默认的持久化策略.
  • 定期持久化,保存的是Redis中的内存数据快照,持久化文件占用空间较小.
  • 可能导致内存数据丢失
AOF模式
  • 默认条件下是关闭状态,如果需要开启则需要修改配置文件.
  • 可以实现数据的实时持久化操作,AOF模式记录的是用户的操作过程.
  • 只要开启了AOF模式,则持久化方式以AOF模式为主.

9.3 redis为什么要分片

准备多台redis,共同为用户提供缓存服务。在保证效率的前提下,实现了内存的扩容.

数据存储机制:
在这里插入图片描述

9.4 一致性Hash算法

9.4.1 缓存雪崩现象

一共有四台服务器S1-S4,将用户请求拼接key通过hash%N获取指定服务器并将请求转发至该服务器;倘若S3因磁盘故障而宕机,此时N=3,如果作为缓存使用,S3上所有的key都丢失了,原本存放在其他服务器如S2上的key=aaa使用新的N计算被转发给另外的服务器如S1,由于S1中找不到aaa的数据,这样aaa也丢失…牵一发而动全身,在缓存场景中会造成缓存击穿,如果量很大就会造成缓存雪崩。

9.4.2 原理

目的:解决数据如何在分布式环境下进行存储!!!
hash取值区间: 8位16进制数 共有 2^32种可能性

  • 哈希环分片
    一致性哈希算法将N设置为2^32,形成了一个哈希环。在将数据key进行hash计算后就落在此环上;将服务器结点也作为一种key分发到哈希环上,如下图。
    在这里插入图片描述
    一致性哈希算法使用顺时针方法实现结点对哈希环shard的归属。但是由于服务器结点的数量相比2^32会非常少,服务节点分布不均,造成机器负载失衡。就将服务器结点根据某种规则来虚拟出更多结点,把这些虚拟节点就相当于服务器的分身。

9.4.3 特性

  • 目的:解决数据如何在分布式环境下进行存储
  • 特性:
    1.均衡性:指hash的结果应平均分配到各个节点,从算法上解决了负载均衡问题 。 利用虚拟节点实现数据平衡 (平衡数据不能做到绝对平均,只能是相对的)。
    2.单调性:指在新增或者删减节点时,实现数据的动态迁移。
    3.分散性:指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 。
    4.负载:是分散性另一种表现形式.表现为一个位置有多个key。

9.4.4 一致性hash的重点

  • 大量固定数量的小数据块的分片
    将普通哈希取模的N固定,确保相同的key进行计算后是相同的位置。
  • 小分片的服务器归属问题
    通过虚拟节点的引入,将以前服务器宕机后造成数据大量迁移的情况降低为少量数据的移动。

9.4.5 Redis的一致性哈希实现

Redis cluster 拥有固定的16384个slot,slot是虚拟的且被分布到各个master中,当key 映射到某个master 负责slot时,就由对应的master为key 提供服务。

每个Master节点都维护着一个位序列bitmap为16384/8字节,也就是Master使用bitmap的原理来表征slot的下标,Master 节点通过 bit 来标识哪些槽自己是否拥有,比如对于编号为1的槽,Master只要判断序列的第二位是不是为1即可。这样就建立了分片和服务结点的所属关系。
在这里插入图片描述

9.5 哨兵机制怎么实现的,实现了什么功能

  • 哨兵机制:
    Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
    监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
    提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
    自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
  • 功能:实现redis高可用
  • 机制:心跳检测
    在这里插入图片描述

9.6 哨兵和分片的优缺点

  • 优点:
    1.分片可以使redis动态内存扩容.
    2.分片可以将数据均匀的分配到不同的节点中,使数据分散保存.
    3.哨兵可以实现redis高可用.
  • 缺点:
    1.分片如果有一个节点出现宕机则整个分片都不能正常使用.
    2.哨兵如果发生宕机现象,则影响整个redis服务.
  • 升级:
    1.使用多台redis实现内存空间的动态扩容.
    2.实现在redis内存实现高可用(不再使用哨兵机制)使用组件(ruby)
    搭建集群,实现分片和高可用的全部功能.

10 跨域问题

10.1 同源策略

浏览器在发起AJAX请求时,必须遵守同源策略(协议://域名:端口都和当前页面相同)的规定.否则数据无法正常解析。
若有一项不同,则表示跨域访问.浏览器不予解析返回值结果。.

10.2 什么是跨域?

当浏览器解析ajax时,ajax发起请求的地址如果与当前页面所在的地址违反同源策略时,则称之为跨域(请求)。

10.3 怎么解决跨域问题?

JSONP

JSONP是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用

  • 原理
    1)利用javascript中src属性实现跨域;
    2)客户端定义回调函数 callback=hello;
    3)服务端程序将返回值结果封装为特定的JSON格式 callback(JSON) 执行回调函数。
CORS

当下的主流的浏览器天生都支持跨域,通过添加请求头信息,将源地址进行标识,之后发往后端服务器.

跨域请求由浏览器和服务器共同完成,.要求双方都必须同意跨域才行. 但是默认的条件下服务器端是不允许跨域的.所以必须经过配置才行.

11.HttpClient

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)
总结:HttpClient是java为了远程请求开发的http请求工具包.

12.SSO

在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。

12.1 你的单点登录是怎么调用的(实现原理)

在这里插入图片描述
实现步骤:

  • 当用户登陆时,通过nginx访问JT-WEB中任意的服务器之后输入用户名和密码后开始执行单点登录操作
  • JT-WEB服务器将用户请求传递给JT-SSO 单点登录服务器 进行数据校验
  • JT-SSO获取用户的登陆信息后查询数据库,校验用户名和密码是否正确.如果是正确的,将用户信息转化为JSON串,之后动态生成UUID,保存到Redis中。注意超时时间(7天超时)
  • 无论登录是否成功,都应该返回TICKET信息(可以为null)
  • 用户通过浏览器提供的COOKIE保存返回的秘钥信息.方便下次访问.
  • 当用户执行业务操作时,动态的获取TICKET信息,之后校验.校验通过则放行请求,否则拦截重定向到用户登录页面.

12.2 如何实现的单点登录SSO

问题:因为后台的服务器采用的是集群的部署方式,肯定有多台服务器.如果将用户的登陆信息保存到服务器端,因为多个服务器之间不能共享session.所以相互之间不同实现Session共享.导致用户频繁登陆.
初级:使用Nginx提供的IP_Hash
高级:
1.当用户登陆操作时,首选访问单点登录服务器.进行登录操作.
2.如果登录正确.则生成用户的秘钥token.将用户信息转化为JSON串和token一起保存到redis缓存中.
3.将token信息返回给客户端.将数据保存到客户端浏览器中的cookie中.
4.当用户进行其他操作需要用到用户信息时,首先检测Cookie中是否有token,第二步检测redis中的数据是否为null.如果一切正确,则允许跳转到指定页面中.如果其中有一项有误,则表示用户登陆异常.让用户重新登陆.
在这里插入图片描述

13.Dubbo框架

13.1 你怎么理解SOA(面向服务)

面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
在这里插入图片描述

13.2 什么是dubbo框架

一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:

  • 1.面向接口的远程方法调用,
  • 2.智能容错和负载均衡
  • 3.服务自动注册和发现。

13.3 Dubbo框架组件说明

在这里插入图片描述

  • 消费者:负责接收用户的请求信息的页面
  • 提供者:主要负责实现业务接口.
  • 注册中心:注册中心基于心跳检测机制.可以非常灵活的检查服务是否可用.及服务自动的注册和发现功能.
  • 监控:监控整合dubbo框架内部的状态信息.

13.4 注册中心的工作原理

在这里插入图片描述
步骤:
1.当服务提供者启动时,将自己的IP地址/端口号/服务数据一起注册到注册中心中.
2.当注册中心接收提供者的数据信息之后,会维护服务列表数据.
3.当消费者启动时,会连接注册中心.
4.获取服务列表数据.之后在本地保存记录.
5.当用户需要业务操作时,消费者会根据服务列表数据,之后找到正确的IP:PORT直接利用RPC机制进行远程访问.
6.注册中心都有心跳检测机制.当发现服务器宕机/或者新增服务时.则会在第一时间更新自己的服务列表数据,并且全网广播通知所有的消费者.

13.5 Dubbo 负载均衡策略

  • hash一致性算法
    根据客户端IP地址绑定服务器. 以后该客户端访问的服务器是固定的.
  • 最小访问量
    挑选当前服务器访问压力最小的服务器进行访问
  • 随机算法
    该算法是默认的配置.
  • 轮询算法
    根据配置依次轮询访问.

猜你喜欢

转载自blog.csdn.net/showLo1120/article/details/107609453