Spring Boot/Spring Cloud题库

Spring Cloud 面试题


Spring Cloud与dubbo的主要区别

  1. spring cloud有注册中心eureka,而dubbo没有用的书第三方的zookeeper。
  2. Dubbo使用RPC通讯协议,提供序列化方式如下:
序列化方式 备注
Dubbo dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
RMI RMI协议采用JDK标准的Java.rmi.*实现,采用阻塞式短连接和 JDK 标准序列化方式
Hessian Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现
HTTP 采用Spring的Http Invoker实现
Webserver 基于CXF的frontend-simple和transports-http实现
  1. Spring Cloud使用HTTP协议的Rest API @fengin调用。
  2. Dubbo(基于Dubbo的开源扩展)中增加对Rest支持的有原因之一。
  3. Spring Cloud组件运行:
    1. 所有请求都统一通过API网关(Zuul)来访问内部服务。
    2. 网关接收到请求后,从注册中心(Eureka)获取可用服务。
    3. 由Ribbon进行负载均衡后,分发到后端的具体实例。
    4. 微服务之间通过Feign进行通信处理业务。
  4. Dubbo需要自己开发一套API网关,而SpringCloud则可以通过Zuul配置即可完成网关定制。SpringCloud组件完整。

Spring Boot

1、什么是Spring Boot?

Spring Boot是为Spring服务的,是用来简化新Spring应用的初始搭建以及开发过程的。

2、为什么要用Spring Boot?

1、配置简单
2、独立运行
3、自动装配
4、无代码生成和xml配置
5、提供应用监控
6、易上手
7、提高开发效率

3、Spring Boot核心的两个配置文件:
.yml或.properties 备注
Bootstrap bootstrap由父ApplicationContext加载的,比application优先加载,且bootstrap里面的属性不能被覆盖
Application 用于Spring Boot项目的自动化配置
4、Spring Boot配置文件有哪几种类型?它们有什么区别?

配置文件有.properties格式和.yml格式,他们主要的区别是书法风格不同。

.properties配置如下:

Spring.RabbitMq.port=5672

.yml配置如下:

spring: 
  RabbitMq: 
    port:5672
//.yml格式不支持@PropertySource注解导入
5、Spring Boot有哪些方式可以实现热部署?

1、使用devtools启动热部署,添加devtools库,在配置文件中把Spring.devtools.restart.enabled设置为true
2、使用Intellij IDEA编译器,勾选上自动编译和手动重新编译。

6、.jpa和Hibernate有什么区别?

Jpa全称Java Persistence API,是Java持久化接口规范,hibernate属于jpa的具体实现。

Spring Cloud

1、什么是Spring Cloud?

Spring Cloud是一些列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化勒分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

2、Spring Cloud断路器的作用是什么?

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务呗长时间占用不释放,避免勒故障在分布式系统中蔓延。

3、Spring Cloud的核心组件有哪些?
组件名称 描述
Eureka 服务注册与发现
Feign 基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求。
Ribbon 实现负载均衡,从一个服务的多台机器中选择一台
Hystrix 提供线程池,不同的服务走不同的线程池,实现勒不同服务调用的隔离,避免勒服务雪崩的问题
Zuul 网关管理,走Zuul网关转发请求给对应的服务
4、分布式事务

在微服务架构下,能不使用分布式事务就尽量不要使用,如果一定要使用的话,目前主流的方案有三种:

  1. 二阶段提交2PC,强一致性

通过提交分阶段和记日记的形式,记录下事务提交所处的阶段状态,在组件宕机重启后,可通过日记回复事务提交的阶段状态,并在这个阶段节点重试。

  1. 消息机制,最终一致性

借助消息队列,在处理业务逻辑的地方,发送消息,业务逻辑处理成功后,提交消息,确保消息是发送成功的。之后消息队列投递来进行处理,如果成功,则结束,如果没有成功,则重试,知道成功。不过仅仅适用业务逻辑中,第一阶段成功,第二阶段必须成功的场景。

  1. TCC补偿模式,最终一致性

服务器A的事务如果执行顺利,那么事务A就先行提交,如果事务B也执行顺利,则事务B也提交,整个事务就算完成。但是如果事务B执行失败,事务B本身回滚,这时事务A已经被提交,所以需要执行一个补偿操作,将已经提交的事务A执行的操作反操作,恢复到未执行事务A前的状态。

5、Spring Boot和Spring Cloud的关系

Spring Boot是快速开发工具,专注于应用个体;Spring Cloud基于Spring Boot开发,因此继承了Spring Boot的特性,其更专注于服务治理。

6、REST和RPC的区别?
  • REST风格的系统交互更方便,RPC调用服务提供方和调用方之间依赖太强。
  • REST调用系统性能较低,RPC调用效率比REST高。
  • REST的灵活性可以跨系统跨语言调用,RPC只能在同语言内调用。
  • REST可以和Swagger等工具整合,自动输出接口API文档。
7、Eureka自我保护机制

当Eureka Server检测到大规模服务异常时,会自动进入自我保护机制:

  • Eureka不在从注册列表中移除因为长时间没收到心跳而应该过期的服务。
  • Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点依然可用)。
  • 当网络稳定时,当前实例新的注册信息会被同步到其他节点中。
8、Ribbon和Feign的区别?

Ribbon是一个基于HTTP和TCP客户端的负载均衡器。它可以在客户端配置ribbinServerList(服务器列表),然后轮询请求以实现负载均衡。Feign是在Ribbon的基础上进行了一次封装,是一个使用起来更加方便的HTTP客户端,让调用者更像是调用一个本地方法一样调用远程服务。

其中OpenFeign是在Netflix Feign的基础上扩展了对Spring MVC的注解支持,在新版本的Spring Cloud中已经没有了对Feign的依赖集成。

9、服务熔断和服务降级

熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应事件太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystrix或Resilience4j来实现。

服务降级,当某个服务熔断之后,客户端将不再调用此请求,此时客户端返回一个本地的fallback回调,返回一个缺省值。这样做,虽然会出现局部的错误,但可以避免因额外i一个服务挂机,而影响到整个架构的稳定性。

10、服务网关的作用
  • 简化客户端调用复杂度,统一处理外部请求。
  • 数据裁剪以及聚合,根据不同的接口需求,对数据加工后对外。
  • 多渠道支持,针对不同的客户端提供不同的网关支持。
  • 遗留系统的微服务化改造,可以作为新老系统的中转组件。
  • 统一处理调用过程中的安全、权限问题。

Spring Cloud中的网关有:Zuul和Spring Cloud Gateway,最新版本中推荐使用后者。

11、Spring Cloud Bus的作用

Spring Cloud Bus通过清凉信息代理链接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring Cloud Bus的一个核心思想是通过分布式的启动器对Spring Boot应用进行扩展,也可以用来建立一个对各应用之间的通信频道。

12、链路跟踪Sleuth

当我们项目中引入Spring Cloud Sleuth后,为此链路请求夺回添加一串追踪信息,格式是

[server-name,main-traceid,sub-spanid,boolean]:
信息 备注
server-name 服务节点名称
main-traceid 一条链路唯一的ID,为TraceID
sub-spanid 链路中唯一换的ID,为SpanID
boolean 是否将信息输出到Zipkin等服务收集和展示

Sleuth的实现是基于HTTP的,为了在数据的收集过程中不能影响到正常业务,Sleuth会在每个请求的Header上添加跟踪需求的重要信息。这样在数据收集时,只需要将Header上的相关信息发送给对应的图像工具即可,图像工具根据上传的数据,按照Span对应的逻辑进行分析、展示。

你可能感兴趣的:(面试题,笔记,spring,java)