Spring Cloud面试题2

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Spring Cloud面试题2

上面的Netty是啥?

Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。


深入了解:什么是netty--通俗易懂 - 简书


上面的RPC是啥?

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。


深入了解:什么是RPC? - 简书


上面的Rest风格是啥?

URL中只使用名词来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。


深入了解:什么是REST风格? 什么是RESTFUL?(一篇全读懂)_seniorShen的博客-CSDN博客_rest风格和restful风格


负载平衡的意义什么?

负载平衡的意义什么?

负载均衡的意义是是用来避免单一应用由于并发等原因,导致应用宕机从而让系统整体无法使用,使用负载均衡能够实现服务的高可用、高并发,还可以提高数据处理能力和增加吞吐量


什么是负载平衡?

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如现在有大量请求进来,如果没有负载均衡那就都由一个应用服务来处理这些请求,可能因为请求量太大导致服务崩溃,通过负载均衡就可以把这些请求分发给各个服务来进行处理,从而协同完成工作任务。


项目中的使用?

负载均衡很出色的就是nginx,在我们项目中,服务的接入层由nginx管理,用户请求经过nginx之后,根据相应的域名,转发到对应的服务器去,由于nginx只负责请求转发,没有业务逻辑处理,所以效率上非常高。


nginx的负载均衡策略

nginx支持的负载均衡策略有很多,我们在nginx.conf中配置upstream模块即可。


轮训,默认的就是这种方式,就是一个个来,每个服务器轮流处理一个请求

权重的方式,就是根据服务器的性能,配置较大的权重,nginx就会分配更多的请求

iphash的方式,nginx会根据请求的ip地址,经过那个hash运算得到一个hash值,然后分配相应的服务器

最少连接数,把请求转发给连接数较少的后端服务器


微服务中的体现

在微服务架构中,feign和zuul都集成了ribbon的的功能,它是负责在微服务之间相互调用的时候,帮我们实现负载均衡的功能,我们在将微服务注册到注册中心时,如果服务名称一致,就默认为一个集群,在进行远程调用或者路由转发的时候,都可以均衡的访问响应的服务器,ribbon的负载均衡机制有轮训和随机,默认是轮训,当然也可以自定义负载均衡的策略。


什么是 Hystrix?它如何实现容错?

提到Hystrix就不得不提一个东西叫“雪崩效应”


什么是“雪崩效应”?

服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象


上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了。这时候就出现了Hystrix,他的作用就是:避免了单个调用的微服务导致全局”雪崩”。


什么是Hystrix断路器?

Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟、异常,引起资源耗尽导致系统不可用的解决方案,在分布式系统,各个服务相互调用相互依赖,必然会有部分系统的调用会失败,这就很容易引起服务雪崩,而Hystrix 通过分离服务的调用点,阻止错误在各个服务的传播,并且提供了错误回调机制,这一系列的措施提高了系统的整体服务弹性。


Hystrix断路器就像我们家庭电路中的断容器,当家庭电压过大时就好自己烧断保险丝,而断路器就是一旦后端服务不可用,断路器会直接切断请求链,避免发送大量无效请求影晌系统吞吐量,并且断路器有自我检测并恢复的能力。


Hystrix断路器有三种状态

断路器有完全打开状态:一段时间内达到一定的次数无法调用 并且多次监测没有恢复的迹象断路器完全打开那么下次所有请求就不会请求到该服务

半开:短时间内有恢复迹象断路器会将部分请求发给该服务

关闭:当服务一直处于正常状态能正常调用


为什么需要Hystrix断路器功能

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用。为了保证其高可用,单个服务又必须集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用, 如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络请求涌入,会形成任务累积,导致服务瘫痪,甚至导致服务“雪崩”。为了解决这个问题,就出现断路器模型。


Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等, Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。


Hystrix断路器机制

当Hystrix Command请求后端服务失败数量超过一 定比例(默认50%),断路器会切换到完全打开状态(Open)。这时所有请求会直接失败而不会发送到后端服务。断路器保持在完全打开状态一段时间后(默认5秒),自动切换到半开状态(HALF-OPEN)。这时会判断下一次请求的返回情况,如果请求成功,断路器切到关闭状态 (CLOSED),否则重新切换到完全打开状态(OPEN)。

Fallback(回退机制的逻辑): Fallback相当于是降级操作。对于查询操作,我们可以实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存。


它如何实现容错?

Hystrix主要通过以下几点实现延迟和容错。

包裹请求:使用HystrixCommand包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用了设计模式中的“命令模式”。(这里的依赖是指的一个服务调用其他服务,那这个服务就依赖其他的服务)

跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix就会跳闸,停止请求该服务一段时间。

资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。

监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。

回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。

自我修复:断路器打开一段时间后,会自动进入“半开”状态。

骚戴理解:说白了就是当其中的某个服务出错了,那么如果还有大量的请求进来就会直接被拒绝,也就是不会调用这个出错了的服务,然后直接返回一个默认的错误值,告诉调用这个服务的服务这个服务出了问题,现在不可用,而不是让大量的请求一直在等待这个出错了的服务来处理这些请求,因为如果一直等待的话就很容易出现服务雪崩


什么是 Netflix Feign?它的优点是什么?

什么是 Netflix Feign?

考虑到Spring Cloud的服务治理组件也是基于HTTP的,因此特别需要一款简化服务调用的组件。Feign的出现就是为了解决这个问题,我们可以借助Feign的代理机制,像调用一个接口方法一样发起远程HTTP调用来进行服务之间的通信。简单来说就是用来实现各个微服务直接的通信的,说白了就是各个微服务之间的调用要通过Feign来实现

它的优点是什么?

  • feign采用的是基于接口的注解
  • feign整合了ribbon,具有负载均衡的能力
  • 整合了Hystrix,具有熔断的能力

什么是 Spring Cloud Bus?我们需要它吗?

什么是 Spring Cloud Bus?


用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置。它承担了批量通知和推送配置变更的工作,而且我们可以通过扩展Bus的事件,实现“消息广播”的应用场景。


我们需要它吗?

Spring Cloud Bus 提供了跨多个实例刷新配置的功能。只要我们修改了某个模块的配置,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新。


简单来说就是可以动态的刷新配置内容,只要修改了某个配置文件,其他的所依赖它的配置文件就都会动态刷新


了解分布式系统吗?说说你的理解

1、什么是分布式?


在讲什么是分布式之前应该知道什么是微服务?微服务就是将一个大的服务拆分成几十个甚至上百个微小的服务,每个服务都可以独立运行。分布式不是一种技术,分布式是一种方案,分布式就是在微服务的基础上,可以允许把这些拆分的微服务放到不同的电脑上去运行,分布在不同的地方的电脑上运行都可以,微服务是分布式系统的一种具体落地方案。


2、优点

系统可用性提升

传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式下的服务体系,单台机器有故障,不致于造成整个服务不可用。


系统并发能力提升

请求通过 Nginx 负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加机器,无论是数据库或者服务,都可以做到随时水平扩展。


比如双 11 活动,平时订单少 50 台机器就够了,到了 11 订单量剧增,服务器增加到 100 台,每台机器之间相互独立,互不影响。


系统容错能力提升

同一组服务分别部署在北京上海杭州,杭州的机房突发断电或者火灾,杭州机房的流量会被自动分发到北京和上海的机房,不影响用户使用。


低延迟

参考上一个图,北京的用户请求自动分发到北京,上海的用户请求被分发到上海,服务器会根据用户的 IP 选择距离自己最近的机房,降低网络延迟。


3、缺点

分布式服务依赖网络

服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败。


维护成本高

传统单体式服务只需要维护一个站点就可以。


分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。


一致性,可用性,分区容错性无法同时满足

这个是最主要的,这三种特性就是平时说的 CAP 定理,在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。


CAP 定理

CAP 理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A: Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的2个。


1686453943429.png

假设有一个系统如下:


整个系统由两个节点配合组成,之间通过网络通信,当节点 A 进行更新数据库操作的时候,需要同时更新节点 B 的数据库(这是一个原子的操作)。


上面这个系统怎么满足 CAP 呢?C:当节点A更新的时候,节点B也要更新,A:必须保证两个节点都是可用的,P:当节点 A,B 出现了网络分区,必须保证对外可用。


可见,根本完成不了,只要出现了网络分区,A 就无法满足,因为节点 A 根本连接不上节点 B。如果强行满足 C 原子性,就必须停止服务运行,从而放弃可用性 C。


所以,最多满足两个条件:


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
8月前
|
缓存 负载均衡 Java
2025春招 SpringCloud 面试题汇总
大家好,我是V哥。SpringCloud是面试中的重点,涵盖基础概念、组件细节、高级特性及性能优化等内容。为帮助大家更好地准备2025年的Spring Cloud面试,我整理了一系列常见面试题及答案,涉及服务注册与发现(Eureka)、配置管理(Spring Cloud Config)、负载均衡(Ribbon)、断路器(Hystrix)、微服务网关(Spring Cloud Gateway)等关键知识点。此外,还包括分布式事务管理、链路追踪(Sleuth+Zipkin)、安全性(OAuth2)以及性能优化和实践经验。希望这些内容能助你一臂之力,顺利通过面试。欢迎关注威哥爱编程,全栈之路就你行。
2196 24
|
4月前
|
设计模式 算法 架构师
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
|
9月前
|
前端开发 安全 Java
2025春招,Spring 面试题汇总
本文详细整理了2025年春招必备的Spring面试题,分为基础和高级两大部分,帮助求职者全面掌握Spring相关知识点,结合实际项目经验,提升面试成功率。内容涉及Spring框架、AOP、事务管理、数据库集成、Spring Boot、Spring Security、微服务架构等,助力你在春招中脱颖而出。
1481 0
|
11月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
273 2
|
10月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
10月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
152 6
|
10月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
219 2
|
10月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
166 5
|
10月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
185 5
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
815 37