没有合适的资源?快使用搜索试试~ 我知道了~
项目主要分了三个平台:商家平台、运营商平台、前台网站平台, 前台网站主要的功能主要就是注册与登陆,首页管理(导航栏,搜索框,广告,热门推荐),秒杀活动,详情页模块,评论模块等等。 项目当时开发是考虑到项目的访问量可能会比较大,所以考虑用的是springcloud微服务架构,微服务的话可以分解巨大单体式应用,开发效率高,各服务之间代码解耦合,每个服务只关注一个业务功能都能独立开发部署,一个服务宕机不会影响其他服务。我们还部署一个Nginx+zuul的集群,静态资源直接通过ngnix进行访问,动态请求通过zuul网关进行安全验证(也就是咱们说的动静分离)。然后通过zuul服务路由对于客户端的请求进行安全效验,与请求的分发去访问各个微服务,服务统一是注册到Nacos上,zuul服务路由在调用咱们的服务时,服务和服务之间相互调用时通过feign来进行调用,feign具有负载均衡和熔断的能力.可以让我们的访问压力分摊等.......................................................................................
资源推荐
资源详情
资源评论
旅游项目
架构图
自我介绍
面试官你好,很高兴来咱们公司面试.
我叫,老家是.从事这个 java 开发已经 4 年了。这几年的开发中,熟悉使用 hibernate、
spring,springmvc,mybatis 等主流框架,dubbo+zookeeper 分布式开发,熟练使用
redis、mongodb 等非关系型数据库。消息队列有 rocketMQ。springcloud 微服务架构,关
系数据库这方面,我们是用过 my sql,oracle,搜索引擎还包括 ES
一、项目介绍
我在之前做的是旅游的项目,这个项目采用的是 Springcloud 框架。
项目主要分了三个平台:商家平台、运营商平台、前台网站平台,
前台网站主要的功能主要就是注册与登陆,首页管理(导航栏,搜索框,广告,热门推荐),秒杀
活动,详情页模块,评论模块等等。
这就是我们项目的一个简单的介绍(微笑一下)接下来给您介绍一个项目的架构
二、项目架构
我们项目当时开发是考虑到项目的访问量可能会比较大,所以考虑用的是 springcloud 微
服务架构,微服务的话可以分解巨大单体式应用,开发效率高,各服务之间代码解耦合,每个
服务只关注一个业务功能都能独立开发部署,一个服务宕机不会影响其他服务。我们还部署
一个 Nginx+zuul 的集群,静态资源直接通过 ngnix 进行访问,动态请求通过 zuul 网关进
行安全验证(也就是咱们说的动静分离)。然后通过 zuul 服务路由对于客户端的请求进行
安全效验,与请求的分发去访问各个微服务,服务统一是注册到 Nacos 上,zuul 服务路由在
调用咱们的服务时,服务和服务之间相互调用时通过 feign 来进行调用,feign 具有负载均
衡和熔断的能力.可以让我们的访问压力分摊,当服务请求失败时还可以快速做出响应,防止
出现服务雪崩的现象。持久层我们采用的是 mybatis,因为 MyBatis 可以进行更为细致的
SQL 优化,可以减少查询字段。数据库我们采用的是 mysql 数据库,为了减少数据库的压
力,我们配置了两台 mysql 服务,并且配置了读写分离。网站的广告页导航栏和广告这些
查询比较多但更新比较少的模块,我们采用的是 redis 缓存以防止大量的请求对数据库造
成压力,同时也提高了查询效率。项目中我们还用了 rocketmq 的事物消息,来保证我们事
物的一致性。详情页我们使用了 freemarker,提高了我们程序访问的性能。搜索引擎的
话,我们采用的是 es,因为 es 的实时性比较好而且支持分布式。针对一些数据量比较大,
结构松散,查询频繁的数据,我们采用了 mongodb 进行存储。登录注册我们选用的是 shiro
安全框架,因为它使用简单,满足我们的认证预授权需求,对密码进行了加密,可以方便我们
的快速开发,
(问题:为什么没有使用 Eureka?了解 Eureka 吗?)
Eureka 是一个基于 REST 服务的,服务注册与发现的组件,遵守 CAP 原则中的 AP,各个节点是
平等关系,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服
务.只要有一台 Eureka 在,就能保证注册服务可用,不过查到的信息可能不是最新的,也就是
不保证强一致性.Eureka 还有个自我保护机制,就是当 EurekaServer 节点在短时间内丢失
了过多实例的连接时,节点就会进入自我保护模式,保护注册信息,即使过期也不删除注册数
据,故障恢复,自动退出自我保护机制.
(问题:Nacos 和其他注册中心的区别?)
支持雪崩保护、自动注销实例,提供监听支持,支持多数据中心、跨注册中心,可以集成
cloud、dubbo 等,功能更加强大。
Nacos 集群默认支持 CAP 原则中的 AP 原则,但是也可切换为 CP 原则。既然 nacos 既支持
CP 又支持 AP,如果不需要存储服务级别的信息并且服务实例是通过 nacos-client 注册
的,并能够保持心跳,那么就可以选择 AP 模式,AP 模式是为服务的可用性而降低了一致
性,因此 AP 模式下只支持注册临时实例。如果需要在服务级别编辑或者存储信息,那么我
们可以使用 CP 模式,CP 模式下支持数据的持久化,此时集群以 raft 模式来运行,该模式
下注册实例之前必须先注册服务,如果服务不存在就会返回错误信息。
(问题:Dubbo 和 SpringCloud 有哪些区别?)
Dubbo 和 SpringCloud 并不是完美的竞争关系,两者所解决的问题不一样:Dubbo 的定位始终
是一款 RPC 框架,而 SpringCloud 目的是微服务架构下的一站式解决方案.
服务调用方式不同,dubbo 是 RPC, SpringCloud 是 Rest Api
注册中心,dubbo 是 zookeeper,SpringCloud 是 Nacos,Eureka,也可以是 zookeeper
服务网关,dubbo 本身没有实现,只能通过第三方技术整合.SpringCloud 有 Zuul 路由网关,
作为路由服务器,进行消费者的请求分发,SpringCloud 支持断路器与 git 完美集成配置文
件支持版本控制,事物总线实现配置文件的更新与服务自动装配等一系列的微服务架构要素.
(为什么要使用 ngnix)
Nginx 是一个高性能的 HTTP 和反向代理服务器,负载均衡服务器,Nginx 可以比其他 Web 服
务器更快地响应请求,而且 Nginx 单机支持 10 万以上的并发连接,并且 Nginx 也可以做一个
首次限流,使用的是漏桶算法,会按照一定的速率来进行响应,强行限制请求的传输速
率.Nginx 主备对外提供一个 VIP 也就是虚拟的 ip,如果其中一台宕机了,使用 keeplive 进
行切换虚拟 ip.
保证我们项目的服务接口安全性使用 Zuul 网关对服务的路由代理,同一安全控制.限流保护
微服务使用令牌桶算法.
(问题:漏桶算法和令牌桶算法的区别)
区别在于漏桶算法能够强行限制数据的传输率,令牌桶算法能够在限制数据的平均传输速率
的同时还允许某种程度的突发情况,令牌桶还有一个好处方便改变速度,一旦需要提高速率,
按需要提高放入桶中令牌的速率.
对于服务之间的相互调用我们采用了 Open Feign 来实现的,Feign 是一个声明式的 Web 服
务客户端,Feign 集成了 Ribbon,具有负载能力,整合了 Hystrix,具有熔断能力.利用 Ribbon
维护了服务列表信息,并且通过轮询实现了客户端的负载均衡。
(问题:什么是 Ribbon?和 Feigin 区别是什么?)
Ribbon 是一个负载均衡客户端,可用很好的控制 http 和 tcp 的一些行为。
Feign 基于动态代理模式根具注解和通过 Ribbon 选择的机器,拼接请求 URL 地址,发起请求
Ribbon 和 Feigin 调用方式不同,ribbo 需要自己构建 http 请求,模拟 http 请求然后使用
RestTemplate 发送给其他服务,开发步骤繁琐.Feign 是在 ribbo 的基础上进行了一次改进,
基于动态代理模式,需要调用其他服务的方法定义成抽象方法,不需要自己构建 http 请求
(问题:什么是熔断?熔断器的作用是什么?)
我们先说一下什么是扇出和雪崩效应:多个微服务之间调用时,假设微服务 A 调用微服务 B
和微服务 C,微服务 B 和微服务 C 又调用其他微服务,这就是所谓的"扇出".如果扇出的链路
上某个微服务的调用响应时间过长或者不可用,那么微服务调用者就会阻塞线程,占用越来
越多的系统资源,进而崩溃,同理影响调用者的调用者,一步步崩溃,就是所谓的"雪崩效应".
服务熔断机制就是:应对雪崩效应的一种微服务链路保护机制.扇出链路的某个微服务不可
用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"
的响应信息.当检测到该节点微服务调用响应正常后恢复链路.在 SpringCloud 框架里熔断
机制通过 Hystrix 实现.
Hystrix 会搞很多个小的线程池,比如我们订单服务请求库存服务是一个线程池,请求仓储
服务是一个线程池,请求积分服务是一个线程池.每个线程池里的线程就仅用于请求那个服
务,当某个线程池线程到达阈值时就启动服务熔断,服务降级,如果其他请求继续访问就直接
返回 fallback 的默认值.
(问题:redis 为什么块?单线程不应该慢吗?)
Redis 是一个非常优秀的,高性能的 NoSQL 数据库,他之所以效率高,我认为主要是他纯内存
数据库,在内存中存取数据相当快,它存储的是 key-value 结构,这种哈希方式查找速度非常
快,Redis 虽然是单线程,但他采用了 Linux 系统的 epoll 技术,实现网络 IO 多路复用技术,
保证在多连接时系统的高吞吐量,提高了性能.Epoll 是目前最高效能降低在高并发少活跃
情况下 Cpu 的占用率方法,Epoll 最大的好处在于它不会随着监听文件句柄数目的增长而降
低效率,无须遍历整个被监听的描述符集,只要遍历那些被 IO 事件异步唤醒而加入 Redis 队
列的描述符集合就行了,正因为 Redis 是单线程的,它避免了不必要的上下文切换和竞争条
件,也不存在多进程或者多线程导致的切换消耗 CPU,不用去考虑各种锁的问题,不存在加锁
释放锁操作,没有因为可能出现死锁而导致的性能消耗.
(问题:Redis 持久化机制)
第一种是 RDB 快照模式,也是默认方式,它会把内存中所有的数据都保存到磁盘上.它会在三
种情况下保存,一是根据配置触发,二是客户端手动执行 save 命令,三是服务器正常退出时
也全部保存.RDB 缺点很明显,容易丢失数据,写入到数据大,不适合小内存机器.
第二种是 AOF 追加模式,它只记录最后执行了更新命令的数据.优点是丢失的数据少,最大丢
失一秒的数据,写入压力小,它追加最后一条.缺点是文件会越来越大,数据恢复也会越来越
慢,AOF 需要手动打开 Redis4.0 之后 AOF 和 RDB 可以结合使用
(问题:为什么 MongoDB 适合大数据的存储)
其实不只是非关系型数据库,关系型数据库同样可以存放大量数据,只不过数据达到某个量
时查询效率下降,那么针对于 MongoDB 数据是暂时存放到内存中,然后就是 MongoDB 使用的
是 javascript 语法,还有就是对于 MongoDB 是没有像咱们 Mysql 这种表关系存在的,那也就
是相当于每个数据都有一个单独的存储空间,通过一个索引指向下一个,所以搜索性能相对
来说会高一些
(问题:es 近实时)
es 和磁盘之间还有一层 FileSyatem Cache(文件系统缓存),正是由于这层缓存的存在才使
得 es 能够拥有更快搜索响应能力.
我们都知道一个索引是由若干个分片组成,而且每个分片内部由很多个 segment(段)组成,
随着每个 segment 的不断增长,我们索引一条数据后可能要经过分钟级别的延迟才能被搜索
到,为什么有这么大的延迟,这里面的瓶颈点主要在磁盘.
因为持久化一个段需要 fsync(文件同步)操作用来确保每个段能够被写入磁盘来真正的避
免数据丢失,但是文件同步操作比较耗时,所以它不能再每次修改或添加一条数据后就执行
一次,如果那样添加和搜索的延迟都会非常大.所以 ES 使用了一种更轻量级的处理方式来提
高速度,es 每次新增的数据会被收集到缓冲区,接着被重写成一个段,然后直接写入文件系
统缓存中,这个操作是非常快的.之后经过一定的间隔或外部触发后才会被持久化到磁盘上,
这个操作非常耗时,但只要文件被写入缓存后,这个文件就可以被查询到了,而不用等到真正
持久化到磁盘之后再查询,从而确保在短时间内就可以搜到.
(问题:es 倒排索引)
我们先说一下什么是正排索引再说什么是倒排索引
正排索引就是从头到尾把数据过一遍,查看哪些数据里面包含我们要查询的关键字,效率比
较低.
倒排索引就是和正排索引相反,他维护了一个字典表,key 就是我们要搜索的关键词,value
是包含这些关键词的数据 id,只要对比字典表就能知道哪几条数据有我们要查询的关键字,
然后拿到这些数据 id,一下就能找到我们要找的数据.
(问题:Mysql 和 Es 对比)
mysql 的索引只是存储字段的内容,其次 mysql 没有分词
而 es 存储的是分词以后的索引,记录每个词都在哪些文档中出现过.
如果是搜索关键字来精确匹配这种基本没啥影响但是如果是 mysql 的 like"%word%"mysql
全表查会特别慢,es 只需要查"word"这个词包含的文档 id 速度明显不在一个级别.
(问题:事物消息怎么解决分布式事务的?解决的那一部分?)
我们是利用 RocketMQ 的事物消息确保我们分布式项目中的事物最终一致性的,因为
RocketMQ 的设计中 brocker 与 producer 端的双向通信能力,使得 brocker 天生可以作为一
个事物协调者存在,可以确保本地事物执行与消息发送的原子性问题,而 RocketMQ 本身提供
的存储机制,为事物消息提供了持久化能力,RocketMQ 的高可用机制以及可靠消息设计,为
事务消息在系统发生异常时,依然能够保证事物的最终一致性达成.
解决的是本地事物与消息发送的原子性,要保证消息的发送方和消息的接收方事物一致但只
能保证发消息能一致,不能保证消费者完全能消费,所以手动接管 ACK 机制,把达到最大重试
次数的消息放到死信队列,运营人员进行对应的业务补偿,由于有了 ACK 机制所以有可能会
产生消息重复消费的问题,我们可以通过日志表(redis)记录已经处理成功的消息 ID,如果
剩余38页未读,继续阅读
资源评论
是Smoky呢
- 粉丝: 1305
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功