SpringCloud 面试题 真正的 offer 偏方 Java 基础 Java 高级
一、参考资料
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=139\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
二、笔记总结
01、Seata 的理解
- 在微服务架构中由于数据库和应用服务的拆分,传统的数据库事务无法解决多个数据库间的事务管理,所以就引出了分布式事务的概念。
- 分布式事务的本质是要解决多个节点的事务一致性问题,业内常见的解决方案有两种。
- 强一致性,所有事务要么全部成功,要么全部失败,全局事务管理者需要知道每一个事务的状态,然后再去决定提交或回滚。
- 最终一致性,多个节点允许出现数据不一致的情况,但是最终某个时间点一定会达成数据一致。
- 基于 CAP 定理,我们可以知道,强一致性会对性能产生影响。
- 分布式事务的强一致性,可以基于 XA 协议的二阶段提交实现,弱一致性可以基于 TCC 事务模型实现。
- 市面上有很多基于这些理论模型实现的框架,Seata 就是其中一种。
- Seata 是阿里开源的分布式事务解决方案,提交了高性能简单易用的分布式事务服务。
- Seata 中封装了四种分布式事务模型
- AT 模式
- TCC 模式
- Saga 模式
- XA 模式
- 不同的业务场景可以使用 Seata 不同的模式,解决分布式事务问题。Seata 是一个一站式分布式事务解决方案。
02、Dubbo 的服务请求失败怎么处理
- Dubbo 是一个 RPC 框架,为我们的应用提供了远程通信的能力,涵盖了服务注册、动态路由、容错、服务降级、负载均衡等能力。
- Dubbo 服务请求失败的场景,默认提供了重试的容错机制,也就是说如果基于 Dubbo 进行服务间通信出现异常,服务消费者会对服务提供者发起重试,确保这一次请求是成功的,默认情况下重试两次。
- 除此之外,Dubbo 还提供了更多的容错策略,快速失败策略、失败安全策略、失败自动恢复策略、并行调用多个服务策略、广播调用策略。
03、Redis 和 MySQL 如何保证数据一致性
- 一般情况下,Redis 用来实现应用和 MySQL 之间的缓存层,主要目的是减少数据库的 IO。
- 当应用程序读取某个数据时,先尝试去 Redis 里面加载,如果命中了就直接返回,没有命中就去数据库里面查询,查询到数据后再把数据缓存到 Redis 里面。
- 这样一个架构里面会出现一个问题,就是一份数据保存在 Redis 和 MySQL 里面,当数据变化时需要同时更新 Redis 和 MySQL,由于不能满足事务的 ACID 特性,这时候就会出现数据一致性问题。
- 先更新数据库再更新缓存
- 先更新数据库再更新缓存,如果缓存更新失败,就会导致数据不一致。
- 先删除缓存再更新数据库
- 先删除缓存再更新数据库,理想情况下是应用下次访问时,发现 Redis 是空的,那么就会从数据库加载并保存到 Redis 中。
- 如果业务场景,不能接受数据的短期不一致,那么就不要使用 Redis 缓存。
04、你对 SpringCloud 的理解
- SpringCloud 是 Spring 官方推出的一套微服务解决方案,准确来说 SpringCloud 是对微服务架构中的各种技术场景定义的一套标准规范。
- SpringCloud 集成了
- Netflix 公司的开源套件,Zuul 网关、Eureka 服务注册发现、Ribbon 负载均衡、Hystrix 服务熔断。
- Spring 官方自研的微服务组件,Gateway 网关、LoadBalancer 负载均衡。
- Alibaba 开发的开源组件,Dubbo 实现 RPC 远程通信、Nacos 服务注册发现以及动态配置中心、Sentinel 服务降级限流。
- SpringCloud 的出现降低了微服务架构的开发难度,我们只需要在 SpringBoot 项目的基础上引入 starter 依赖集成相关组件就能轻松解决各种问题。
05、RPC 协议和 HTTP 协议有什么区别
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=143\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
06、Dubbo 的服务请求失败怎么处理
- 同 02
07、说一下你对 SPI 机制的理解
- SPI 是一种服务发现机制,在 SPI 的机制中,服务提供者为某个接口实现具体的类,而在运行的时候通过 SPI 机制查找对应的实现类,并加载使用。
- 比较典型的例子是 java.jdbc.Driver 这个数据库驱动接口,在 Java 中只提供了接口,具体的实现类由各个数据库厂商的驱动包提供,程序在运行时会根据当前导入的驱动包来完成对应数据库的连接。
08、什么是服务网格
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=146\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
09、Dubbo 是如何动态感知服务下线的
- Dubbo 默认采用 Zookeeper 实现服务的注册发现,多个 Dubbo 服务间的通信地址使用 Zookeeper 维护。
- Zookeeper 会通过心跳检测机制判断 Dubbo 服务提供端的运行状态,来决定是否从地址列表剔除这个服务。
- 当 Dubbo 服务端出现故障导致 Zookeeper 剔除这个地址时,Dubbo 服务的消费端需要感知到地址变化,从而避免后续请求发送到故障节点。
- Zookeeper 里面的 watch 机制实现了 Dubbo 服务下线的动态感知能力,有服务地址变化,Zookeeper 会通知 Dubbo 服务的消费端,Dubbo 服务的消费端收到通知后会更新本地缓存的服务地址。
10、简单说一下你对序列化和反序列化的理解
- 序列化的核心目的是为了网络通信间的对象传输问题,也就是说把当前 JVM 的对象跨网络传输到另一个 JVM 进程中进行恢复。
- 序列化就是把内存中的对象转化为字节流,以便实现存储和传输。
- 反序列化就是根据从网络上获取到的字节流重新构建一个新的对象。
- 很多时候我们会先把对象转化为通用的解析格式,比如 josn xml,然后再转为数据流进行网络传输。
11、什么是 SPI,它有什么用
- 同 07
12、Eureka server 数据同步原理能说下吗
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=150\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
13、说说你对一致性 Hash 算法的理解
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=151\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
14、请说一下你对分布式和微服务的理解
- 分布式一种通过网络进行通信并且为了完成共同任务的计算机节点组成的系统。
- 在集中式系统中要想提升程序的处理性能,只能不断的去提升 CPU 和内存,但是硬件的提升本身是有瓶颈的,所以当企业对于计算能力要求越来越高时,集群的架构已经无法满足需求了。
- 所在在这样的背景下就产生了分布式运算,也就是说把一个计算任务分配给多个计算机节点进行运算,但是这种计算方式对于客户端来说感觉不到,就像访问单个计算机一样。
- 在分布式系统里面软件架构也要做出相应的调整,也就说需要把原本的单体应用进行采访,部署到多个计算机节点上去进行分布式计算,然后每个服务之间使用远程通信协议实现计算结果的交互,最后对结果进行汇总返回给客户端。
- 微服务架构本身就是一种分布式架构,微服务架构强调的是部署在各个计算机节点上的服务粒度。
15、Nacos 配置更新的工作流程
- Nacos 采用长轮训的方式想 Nacos server 端去发起配置更新查询功能。
- 所谓长轮询就是说客户端发起一次更新请求到服务器端,当服务器端的配置没有任何变更的时候,直到服务端有配置变更或连接超时后返回。
- Nacos 客户端会把本地的配置和服务端的配置进行比较,一旦发现有差异就表示有更新,需要把服务器的配置拉到本地。
16、谈谈常用的分布式 ID 设计方案
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=154\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
17、HTTP 协议和 RPC 协议有什么区别
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=155\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
18、如何解决 TCC 中悬挂问题
【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=156\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528
19、请说一下你对服务降级的理解
- 服务降级其实就是去降低服务的能力等级
- 在高并发流量下因为系统资源有限,导致系统无法为高并发流量提供一个稳定可靠的支撑,所以我们可以把一些非核心服务在一些大流量情况下临时下掉或者提供一些默认的处理结果,把这计算资源腾出来以后给到核心服务去使用,从而在高并发流量下保证核心服务的稳定运行。
20、服务注册中心应该是 AP 还是 CP
- 我认为注册中心应该是一个 AP 模型
- 注册中心只是一个地址维护的平台,它如果出现故障,不能影响服务间的正常通信,第二注册中心的地址感知本身就存在延迟,所以设计 CP 模型意义不大。
21、说说你对 CAP 的理解
- CAP 模型是说在一个分布式系统里面不可能同时满足三个点
- 一致性,访问分布式系统的每个节点都可以获取最新的数据。
- 可用性,每一次请求都可以获得一个有效的访问,但是不保证数据是最新的。
- 分区容错性,是对通信耗时的要求。
- 在 CAP 模型中,只能满足 CP 或 AP 模型,不能满足 CA,因为网络通信本身的不确定性无法避免。
22、说一下分布式事务的理解和解决方案
- 分布式事务是指存在多个跨库事务的事务一致性问题
- 基于 XA 协议实现的强一致性事务方案,比如 Seata 中的 XA 事务模型。如果要保证事务的强一致性,就必然会带来性能上的影响,从而影响可用性。
- 基于 BASE 理论的弱一致性事务解决方案,比如 TCC 事务模型,以及基于可靠性消息的最终数据一致性,还有 Seata 的 saga 事务模型等等。最终一致性事务损失了数据的强一致性,然后通过异步补偿的方式去达到数据的最终一致性,因此性能上比强一致性事务好很多,所以它适合并发量高的场景。
23、说一下你对微服务的理解
- 微服务是一种架构风格,我们可以把应用程序划分为一组小型的,松散耦合的服务。
- 每个服务运行在自己的进程中,并通过轻量级通信机制进行通信。
- 每个服务都可以独立部署,独立扩展,独立更新,提高了应用程序的可伸缩性、可维护性、可测试性。
- 微服务是属于分布式架构下针对应用的设计风格,所以会面临分布式架构下服务治理的复杂问题,Spring 官方提供了一套 SpringCloud 解决方案,帮助我们快速实现微服务技术方案逻辑。