当前位置: 首页 > 后端技术 > Java

三天彻底的SpringCloud面试八股随笔

时间:2023-04-01 19:48:17 Java

本文已收录在Github仓库,里面包括计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招等核心知识点分享,欢迎star~Github地址:https://github.com/Tyson0314/Java-learning1,什么是SpringCloud?SpringCloudStream应用程序启动器是一个基于SpringBoot的SpringIntegration应用程序,可提供与外部系统的集成。SpringcloudTask,一个短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。2、什么是微服务?微服务架构是一种架构模式或架构风格,提倡将单个应用程序划分为一组小的服务,每个服务运行在自己独立的进程中,服务之间相互协调交互。合作为用户提供极致价值。服务使用轻量级通信机制(通常是基于HTTP的RESTfulAPI)相互通信。每个服务都围绕特定业务构建,可以独立构建在生产环境或类生产环境中。此外,应避免统一集中的服务管理机制。对于具体的服务,需要根据业务上下文选择合适的语言和工具来构建。可以使用一个非常轻量级的集中管理来协调这些服务,服务可以用不同的语言编写或者使用不同的数据存储。通俗地说:微服务是一个独立的服务应用,职责单一。在intellijidea工具中,有用maven开发的独立模块,具体是用springboot开发的小模块,处理单一的专业业务逻辑,一个模块只做一件事。微服务强调服务的规模,专注于某个点,具体解决某个问题/实现相应的服务应用,在思想上可以看做是一个模块。3.SpringCloud有什么优势在使用SpringBoot开发分布式微服务时,我们会面临以下与分布式系统的复杂性相关的问题——这种开销包括网络问题、延迟开销、带宽问题、安全问题。服务发现-服务发现工具管理集群中的进程和服务如何相互查找和对话。它涉及一个服务目录,在该目录中注册服务,然后能够找到并连接到该目录中的服务。冗余-分布式系统中的冗余问题。负载平衡——负载平衡改善了工作负载在多个计算资源(例如计算机、计算机集群、网络链接、中央处理器或磁盘驱动器)之间的分布。性能问题由于各种操作开销导致的性能问题。部署复杂性-DevOps技能的要求。4、微服务之间如何独立通信?同步通信:dobbo通过RPC远程过程调用,springcloud通过REST接口json调用等异步:消息队列,如:RabbitMq、ActiveM、Kafka等消息队列。5.什么是服务断路器?什么是服务降级?熔断机制是一种应对雪崩效应的微服务链路保护机制。当某个微服务不可用或者响应时间过长时,会导致服务降级,进而导致节点微服务的调用中断,快速返回“错误”响应信息。当检测到节点微服务调用响应正常时,恢复调用链路。在SpringCloud框架中,熔断机制是由Hystrix实现的。Hystrix会监控微服务之间的调用状态。当失败调用达到一定阈值时,默认为5秒内调用20次。如果失败,熔断机制将被激活。服务降级一般从整体负载考虑。也就是说,当一个服务坏了,服务器将不再被调用。这时候客户端可以准备一个本地回退回调,返回一个默认值。这样一来,虽然等级下降了,但好歹还能用,总比直接挂机好。Hystrix相关注释@EnableHystrix:开启熔断器@HystrixCommand(fallbackMethod="XXX"),声明一个失败回滚处理函数XXX,当注解的方法执行超时(默认1000毫秒)时,将执行回退函数并返回一条错误信息。6.请告诉我Eureka和zookeeper的区别?Zookeeper保证CP,Eureka保证AP。A:高可用C:一致性P:分区容错1、从注册中心查询服务列表,我们可以容忍注册中心返回几分钟前的信息,但不能容忍直接宕机不可用。也就是说,服务注册功能对高可用的要求比较高,但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩下的节点会重新选举leader。问题是选leader的时间太长,30到120s,而且选拔期间zk集群不可用,会导致选拔期间注册服务瘫痪。在云部署环境下,zk集群极有可能因为网络问题失去master节点。虽然可以恢复服务,但是不能容忍选择时间过长导致的注册长期不可用。2.Eureka保证可用性。Eureka的每个节点都是平等的。个别节点故障不会影响正常节点的工作,其余节点仍可提供注册和查询服务。但是,当一个Eureka客户端注册失败或者发现与某个Eureka的连接失败时,它会自动切换到其他节点。只要一个Eureka还在,就可以保证注册服务可用,但查到的信息不一定是最新的。此外,Eureka还具有自我保护机制。如果超过85%的节点在15分钟内没有正常心跳,那么Eureka认为客户端和注册中心之间出现了网络故障。这时,会出现以下几种情况:①.Eureka不会从注册列表中删除因为长时间未收到心跳而应该过期的服务。②.Eureka仍然可以接受新服务的注册和查询请求,但不会同步到其他节点(即保证当前节点仍然可用)③。当网络稳定后,会将当前实例的新注册信息同步到其他节点。所以Eureka可以很好的处理部分节点因为网络故障而失去联系的情况,不会像Zookeeper7那样瘫痪整个微服务。SpringBoot和SpringCloud的区别?SpringBoot专注于快速、轻松地开发单个微服务。SpringCloud是一个关注全局的微服务协同治理框架。集成和管理SpringBoot开发的个体微服务,提供配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式对话等集成服务。SpringBoot可以是没有SpringCloud独立开发,但是SpringCloud离不开SpringBoot,是依赖关系。SpringBoot专注于快速方便地开发单个微服务个体。SpringCloud专注于全局服务治理框架。8、负载均衡是什么意思?在计算中,负载平衡改善了工作负载在多个计算资源(例如计算机、计算机集群、网络链接、中央处理器或磁盘驱动器)之间的分布。负载平衡旨在优化资源使用、最大化吞吐量、最小化响应时间并避免使任何单个资源过载。使用多个组件进行负载平衡而不是单个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专门的软件或硬件,例如多层交换机或域名系统服务器进程。9.什么是Hystrix?它是如何实现容错的?Hystrix是一个延迟和容错库,旨在隔离远程系统、服务和第三方库的访问点,停止级联故障,并在故障不可避免时在复杂的分布式系统中实现弹性。通常对于使用微服务架构开发的系统,会涉及到很多微服务。这些微服务相互协作。想想微服务:假设如果上图中的微服务9失败,那么我们将使用传统方法传播异常。但这仍然会使整个系统崩溃。随着微服务数量的增加,这个问题变得更加复杂。微服务的数量可以高达1000。这就是hystrix的用武之地。我们将在这种情况下使用Hystrix的Fallback方法功能。我们有两个服务employee-consumerconsumingservicesexposedbyemployee-consumer。简化图如下所示现在假设由于某种原因,employee-producer暴露的服务抛出异常。在这种情况下,我们使用Hystrix定义了一个回退方法。此回退方法应具有与公开服务相同的返回类型。如果暴露的服务发生异常,回退方法将返回一些值。10、什么是Hystrix断路器?我们需要它吗出于某种原因,员工-消费者公开服务会引发异常。在这种情况下使用Hystrix,我们定义了一个回退方法。如果暴露的服务发生异常,回退方法返回一些默认值。如果firstPagemethod()中的异常继续出现,Hystrix电路将中断,workerconsumer将一起跳过firstsPage方法,直接调用fallback方法。断路器的目的是给第一页方法,或者第一页方法可能调用的其他方法时间,并导致异常恢复。可能发生的情况是,导致异常的问题在负载较小的情况下有更好的恢复机会。11.说说RPC的实现原理。首先需要有一个处理网络连接通信的模块,负责连接的建立、管理和消息的传递。其次,需要一个codec模块,因为网络通信是传输的字节码,我们使用的对象需要进行序列化和反序列化。剩下的就是客户端和服务器部分。服务端暴露要开放的服务接口,客户端调用服务接口的代理实现。这个代理实现负责收集数据,编码并传输到服务器,然后等待返回结果。12.什么是eureka自我保护机制?当EurekaServer节点在短时间内丢失过多实例连接时(如网络故障或客户端频繁启停),节点将进入自我保护模式保护注册信息,不再删除.注册数据,故障恢复后自动退出自我保护模式。13.什么是色带?Ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为。feign默认集成了ribbon。14.NetflixFeign是什么?它的优点是什么?Feign是一个受Retrofit、JAXRS-2.0和WebSocket启发的java客户端绑定程序。Feign的首要目标是将约束分母的复杂性统一到httpapi而不管它们的稳定性。特点:Feign使用基于接口的注解。Feign集成ribbon,具备负载均衡能力,集成Hystrix,具备融合添加pom依赖的能力。在启动类中添加@EnableFeignClients,定义一个接口@FeignClient(name="xxx"),指定调用哪个服务15.Ribbon和Feign有什么区别?1、启动类注解不同,Ribbon是@RibbonClient,feign是@EnableFeignClients;2、服务指定的位置不同,Ribbon是在@RibbonClient注解上声明的,而Feign是在定义抽象方法的接口中使用@FeignClient声明的;3、调用方式不同。Ribbon需要自己构造http请求来模拟http请求。16、SpringCloud的核心组件有哪些?Eureka:服务已注册以供发现。Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址并发起请求。Ribbon:为了实现负载均衡,选择多台机器中的一台服务。Hystrix:提供线程池,不同的服务使用不同的线程池,实现不同服务调用的隔离,避免服务雪崩问题。Zuul:网关管理,Zuul网关将请求转发给相应的服务。17、说说SpringBoot和SpringCloud的关系SpringBoot是Spring推出的基于Maven的解决方案,解决传统框架配置文件的冗余和复杂的组装组件。其目的是快速构建单个微服务,而SpringCloud专注于解决微服务之间的各种协调和配置、服务之间的通信、熔断、负载均衡等技术维度不尽相同,而SpringCloud依赖于SpringBoot,而SpringBoot不依赖SpringCloud,甚至可以和Dubbo集成优秀集成开发总结SpringBoot专注于快速便捷地开发单个微服务SpringCloud是一个关注全局,集成管理的微服务协同治理框架各种微服务,并提供微服务之间的配置管理、服务发现、断路器、路由、事件总线等集成服务SpringBoot不依赖SpringCloud,SpringCloud依赖SpringBoot,属于SpringBoot的依赖关系专注于快速便捷地开发单个微服务,SpringCloud专注于全局服务治理框架18、微服务如何独立通信?远程过程调用(RemoteProcedureInvocation)就是我们常说的服务注册和发现,通过远程过程调用直接访问其他服务。优点:简单,通用,因为没有中间件代理,系统更简单缺点:只支持请求/响应模式,不支持其他,比如通知,请求/异步响应,发布/订阅,发布/异步响应,降低可用性,因为在请求期间客户端和服务器都必须可用。消息传递使用异步消息传递进行服务间通信。服务通过消息管道进行通信以交换消息。优点:客户端和服务端解耦,更松耦合,提高可用性,因为消息中间件缓存消息直到消费者可以消费,支持通知、请求/异步响应、发布/订阅、发布/订阅响应等多种通信机制异步地。缺点:消息传递中间件具有额外的复杂性。19、SpringCloud是如何实现服务注册的?发布服务时,指定对应的服务名称,将服务注册到注册中心(Eureka、Zookeeper)。在注册中心添加@EnableEurekaServer,服务使用@EnableDiscoveryClient,然后使用ribbon或者feign直接调用服务的发现。20.什么是服务断路器?在复杂的分布式系统中,微服务之间的相互调用可能会因为各种原因导致服务阻塞。在高并发场景下,服务阻塞就是线程阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃。由于服务之间的调用关系是同步的,所以会对整个微服务系统造成服务雪崩。造成雪崩效应的系统资源越多,就越需要进行业务熔断和业务降级处理。所谓服务熔断,是指服务出现故障或异常,类似于显示界的“熔断器”。当触发异常情况时,直接熔断整个服务,而不是等到服务超时。服务熔断器相当于我们交换机的熔断器。一旦发生服务雪崩,整个服务就会被熔断。通过维护自己的线程池,当线程达到阈值时,服务就会降级。如果其他请求继续访问,则直接返回fallback默认值21。你了解Eureka自我保护机制吗?当EurekaServer节点短时间内丢失过多实例连接时(如网络故障或客户端频繁启停),节点将进入自我保护模式,保护注册信息,不再删除注册数据,并在故障恢复时自动退出自我保护模式。22.你熟悉SpringCloudBus吗?springcloudbus将分布式节点与轻量级消息代理连接起来,可用于广播配置文件更改或直接服务通信,也可用于监控。如果配置文件被修改,所有客户端都会通过发送请求重新读取配置文件。23、SpringCloud断路器的作用是什么?当一个服务因为网络或自身原因调用另一个服务时,调用者会等待被调用者的响应。当更多的服务请求这些资源时,更多的请求等待,就会产生级联效应(雪崩效应)。一段时间内不能调用一定次数,多次监控无恢复迹象。此时断路器完全打开,下次请求不会再请求该服务。半开:短时间内有恢复迹象。断路器会向服务发送一些请求,正常调用时断路器会关闭。关闭:当服务一直处于正常状态时,可以正常调用。24.你知道SpringCloudConfig吗?在分布式系统中,由于服务数量庞大,为了便于服务配置文件的统一管理和实时更新,需要一个分布式配置中心组件。在SpringCloud中,有一个分布式配置中心组件SpringCloudConfig,它支持配置服务在配置服务的内存中(也就是本地),也支持放置在远程Git仓库中。在SpringCloudConfig组件中,有两个角色,一个是configserver,一个是configclient。使用方法:添加pom依赖配置文件,添加相关配置启动类,添加注解@EnableConfigServer25,谈谈你对SpringCloudGateway的理解SpringCloudGateway是SpringCloud官方推出的第二代网关框架,替代了Zuul网关。网关作为一个流,在微服务系统中扮演着非常重要的角色。网关的常用功能包括路由转发、权限验证、限流控制等。RouteLocatorBuilderbean用于创建路由。除了创建路由之外,RouteLocatorBuilder还允许您添加各种谓词和过滤器。谓词断言的意思,顾名思义,就是根据特定的请求规则,由特定的路由进行处理。Filters是各种过滤器,用来对请求进行各种判断和修改。最后给大家分享一个Github仓库,里面有大斌编译的300多本经典计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构还有算法,机器学习,编程生活等等,可以star一下,下次找书的时候可以直接在上面搜索,仓库持续更新中~Github地址:https://github.com/Tyson0314/java-books