2022深圳-OPPO-Java高级面试真题分享

2022深圳-OPPO-Java高级面试真题分享

2022-04-07 14:17·可靠大头鱼

题目目录


1.说说你的工作经历?

2.项目主要负责哪几个模块?

3.画出你项目结构图

4.Eureka是如何进行服务注册?

a.每30s发送心跳检测重新进⾏租约,如果客户端不能多次更新租约,它将在90s内从服务器注册中心移除。

a.注册信息和更新会被复制到其他Eureka节点,来自任何区域的客户端可以查找到注册中⼼信息,每30s发生一次复制来定位他们的服务,并进行远程调用。

b.客户端还可以缓存⼀些服务实例信息,所以即使Eureka全挂掉,客户端也是可以定位到服务地址的。



5.如果服务宕机或者无访问了,我还去请求该服务,Eureka会怎么处理?会有什么现象?Eureka服务注册中心的失效剔除与自我保护机制:

6.谈谈Eureka的保护机制Eureka Server的自我保护机制会检查最近15分钟内所有EurekaClient正常心的占比,如果低于85%就会被触发。我们如果在Eureka Server的管理界面发现如下的红色内容,就说明已经触发了自我保护机制。EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMINGINSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THANTHRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIREDJUST TO BE SAFE.当触发自我保护机制后Eureka Server就会锁定服务列表,不让服务列表内的服务过期,不过这样我们在访问服务时,得到的服务很有可能是已经失效的实例,

如果是这样我们就会无法访问到期望的资源,会导致服务调用失败,所以这时我们就需要有对应的容错机制、熔断机制,我们在接下来的文章内会详细讲解这块知识点。我们的服务如果是采用的公网IP地址,出现自我保护机制的几率就会大大增加,所以这时更要我们部署多个相同InstanId的服务或者建立一套完整的熔断机制解决方案。

自我保护开关

如果在本地测试环境,建议关掉自我保护机制,这样方便我们进⾏测试,也更准备的保证了服务实例的有效性!!!关闭自我保护只需要修改application.yml配置文件参数
eureka.server.enable-self-preservation将值设置为false即可。

7.Ribbon的负载均衡是⾯向服务内部还是外部?

8.Ribbon如何实现负载均衡的?这篇讲的非常好:

9.如果没有Eureka,我能直接通过Ribbon进行服务请求吗?可以的,需要导⼊eureka-client-

10.Hystrix如何实现熔断?Hystrix在运行过程中会向每个commandKey对应的熔断器报告成功、失败、超时和拒绝的状态,熔断器维护计算统计的数据,根据这些统计的信息来确定熔断器是否打开。如果打开,后续的请求都会被截断。然后会隔一段时间默认是5s,尝试半开,放入一部分流量请求进来,相当于对依赖服务进行次健康检查,如果恢复,熔断器关闭,随后完全恢复调用。如下图:


11.当服务无法访问时,是直接熔断还是降级?先降级,后熔断。

12.怎么样才会出现熔断?熔断就跟保险丝一样,当一个服务请求并发特别大,服务器已经招架不住了,调⽤错误率飙升,当错误率达到⼀定阈值后,就将这个服务熔断了。熔断之后,后续的请求就不会再请求服务器了,以减缓服务器的压力。

13.在Springcloud中,消费者调⽤提供者的流程是如何的?请画图springcloud的工作原理


springcloud由以下几个核心组件构成:

Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka

Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

14.Redis的集群方式有哪些?主从、哨兵、redis-cluster:

15.如果你原来读取的Redis中的数据,它的数据的结构发生了变化,如何在不改变代码的情况下进行处理,使下游业务不受影响?

16.Redis的持久化方式有哪些?说说他们的具体实现、Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件):

i.RDB持久化方式会在一个特定的间隔保存那个时间点的一个数据快照。ii.AOF持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟Redis协议⼀致,以追加的方式进行保存。iii.Redis的持久化是可以禁用的,就是说你可以让数据的⽣命周期只存在于服务器的运行时间里。iv.两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据。

17.使用Redis的过程中有没有遇到什么问题?

1、缓存和数据库双写一致性问题解决方案前提是对数据有强一致性要求,不能放缓存;只能降低不一致发生的概率,无法完全避免;只能保证最终一致性。

1)采用正确的更新策略,先更新数据库,再删缓存

2)可能存在删除缓存失败的问题,提供一个补偿措施如利用消息队列。2、缓存雪崩解决方案(大并发项目,流量在几百万)-利用互斥锁:会使吞吐量下降-给缓存加失效时间:随机值,避免集体失效-双缓存3、缓存穿透解决方案(大并发项目,流量在几百万)-利用互斥锁-采用异步更新策略,无论Key是否取到值都直接返回-提供一个能迅速判断请求是否有效的拦截机制(布隆过滤器)4、缓存并发竞争解决方案-不要求顺序时,准备一个分布式锁,同时去抢锁,然后在set操作。-要求顺序时,在数据写入数据库时,需要保存一个时间戳。-利用队列,将set操作变成串行访问。

18.Redis的内存回收机制有哪些?

19.Redis的过期策略有哪些?简单介绍下不同策略

定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

2.惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

3.定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

20.说说Redis的淘汰策略?淘汰的算法可以修改或者自己重写吗?

默认:noeviction


21.你们的项目中消息中间件用的是什么?

详见"面试题库/消息中间件"

22.你们的Rabbit集群是怎么部署的?

23.Rabbit集群之间的数据是如何同步的?同步方式还是异步⽅式?

24.一个队列中的数据你们是存放在一台机子上还是多台机子上?为什么?

25.RabbitMQ内部结构是怎么样的?请画出RabbitMQ的架构图RabbitMQ是一个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合,基本模型如下。


最后:

正是黄金跳槽找工作面试季,最近有一些小伙伴粉丝让我帮忙找一些 面试题 资料。为帮助开发者们提升面试技能、有机会入职BATJ等大厂公司,于是我翻遍了收藏的 5T 资料后特别制作了这个专辑——这一次整体放出。


说明一下:所有的面试题目都不是一成不变的,特别是像一线大厂,下面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、spring面试题、spring cloud面试题、spring boot面试题、spring教程 笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册一共整理了1184页PDF文档。

需要的朋友  私我


#笔试题目##面经##面试流程##Java##学习路径##社招##笔记#
全部评论
兄弟们,点赞关注走一波!下期干货更精彩
点赞 回复 分享
发布于 2022-04-14 16:52

相关推荐

评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务