欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java SpringBoot 微服务面试问题

最编程 2024-03-03 14:01:44
...

Java SpringBoot微服务面试题

  • 前言
  • 1、什么是 SpringBoot?
  • 2、什么是起步依赖?
  • 3、什么是自动配置?
  • 4、什么是命令行界面?
  • 5、什么是Actuator监控器?
  • 6、SpringBoot 的核心注解有哪些?
  • 7、什么是YAML?
  • 8、Spring Boot 需要独立的容器运行吗?
  • 9、如何使用SpringBoot实现分页和排序?
  • 10、spring boot事件监听器有几种实现方式?
  • 11、SpringBoot事务如何管理?
  • 12、SpringBoot读取配置文件的方式?
  • 13、SpringBoot 支持哪些日志框架?
  • 14、SpringBoot的优势?
  • 15、SprinBoot容器启动流程是怎样的?
  • 16、Spring Boot是如何实现自动装配?
  • 17、Spring Boot是如何启动Tomcat的?
  • 18、如果让你实现一个SpringBoot-starter,你应该怎么做?
  • 19、您对微服务有何了解?
  • 20、微服务之间是如何通讯的?
  • 21、微服务架构有哪些优势?
  • 22、什么是 REST / RESTful 以及它的用途是什么?
  • 23、微服务拆分遵循原则的?
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、什么是 SpringBoot?

SpringBoot是Spring开源框架下的子项目,是Spring的一站式解决方案,它不用我们自己手动的去写一堆xml配置,SpringBoot提供了4个核心组件,分别是:
起步依赖、自动配置、命令行界面、Actuator监控。
在我看来,SpringBoot是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想。它的目的是简化企业应用程序的配置,它使得开发者只需要关心业务需求。

2、什么是起步依赖?

起步依赖,简单来说就是为了实现某个特定功能,而把它需要的依赖库聚合在一起。
如果开发项目中需要实现该功能,只需要加⼊该功能的起步依赖就行了,不需要考虑这些库的版本冲突 。
比如spring-boot-starter-web,starter-jdbc,starter- aop。

3、什么是自动配置?

简单来说就是自动把第三方组件的Bean配置到SpringIOC容器里面,不需要我们自己再去配置。在SpringBoot应用中,只需要在启动类加上@EnableAutoConfiguration注解,就可以实现自动配置。
底层原理大概是这样的:
当SpringBoot启动的时候,会创建一个SpringApplication类,然后调用SpringFactoriesLoader中的loadFactoryNames方法去加载META-INF/Spring.factories文件,返回一个配置类的列表;
然后再通过@EnableAutoConfiguration注解,它里面导入了一个AutoConfigurationImportSelector类,它重写了ImportSelector接口的selectImports方法,从而实现了把这些配置类的自动配置到IOC容器中。整个流程中还会初始化Spring上下文信息和启动应用监听等等。

4、什么是命令行界面?

命令行界面简称CLI,是用来运行spring命令的。
用于创建和测试springBoot应用程序的。

5、什么是Actuator监控器?

Actuator 是SpringBoot自带的监控组件,它实现了对应用程序运行情况的监控,比如健康状态、Bean加载情况、线程信息、日志信息等 。
Actuator内置了很多的端点,每个端点都可以启用和禁用。

6、SpringBoot 的核心注解有哪些?

Spring Boot 的核心注解是@SpringBootApplication,它是个组合注解,主要包含了以下 3个注解:

  • 1、@SpringBootConfiguration注解:包含了@Configuration注解,用在某一个类上,就表示这是一个Spring Boot的配置类,类里面包含@bean注解的方法都会初始化到IOC容器中。
  • 2、@EnableAutoConfiguration注解:打开自动配置的功能,我们也可以关闭某个自动配置的功能,比如关闭数据源自动配置功能;可以使用启动类上的exclude参数进行关闭。
    @SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
  • 3、@ComponentScan注解:扫描@Component、@Controller、@Service等注解的bean,默认会扫描启动类所在的同级包及其子包。

7、什么是YAML?

YAML是一种高可读性的数据序列化语言。它通常用于配置文件。
与XML文件相比,YAML文件就更加结构化,而且不容易混淆。
可以看出YAML具有分层配置数据的特点。

8、Spring Boot 需要独立的容器运行吗?

可以不需要,内置了 Tomcat/ Jetty 等容器。

9、如何使用SpringBoot实现分页和排序?

使用SpringBoot实现分页非常简单。使用Spring Data-JPA可以实现分页。

  • 1、添加起步依赖spring-boot-starter-data-jpa
  • 2、启动类添加@EnableJpaAuditing注解
  • 3、实体类添加@EntityListeners(AuditingEntityListener.class)监听注解
  • 4、repository 数据访问层继承JpaRepository类
    public interface UserRepository extends JpaRepository<User, Long> {}
  • 5、接口实现,注入依赖
    @Resource
    private UserRepository userRepository;。

10、spring boot事件监听器有几种实现方式?

  • 1、通过@EventListener注解实现事件监听;
  • 2、将监听器装载入spring容器;
  • 3、在application.properties中配置监听器;
  • 4、手动向ApplicationContext中添加监听器。

11、SpringBoot事务如何管理?

如果项目引入了starter-jdbc起步依赖,在单数据源的情况下不需要我们自己去管理事务,
Spring Boot 会默认使用DataSourceTransactionManager 来管理事务,我们只要在程序的service层加上 @Transactional 注解即可使用。
但是在多数据源的情况下,那么我们要为每个数据源创建一个事务管理器,这里默认使用jdbc的事务管理器,之后在service层加上 @Transactional注解,需要指定value属性为对应的事务管理器名称。
如果是分布式事务管理:

  • 第1种是使用jta-atomikos实现:
    第1步:添加起步依赖spring-boot-starter-jta-atomikos
    第2步:配置多数据库连接信息 application.yml
    第3步:创建配置类,创建多数据源
    第4步:注入jdbcTemplate.execute方法测试
  • 第2种是使用阿里开源的Seata框架。

12、SpringBoot读取配置文件的方式?

  • 方式1:使用注解@Value读取属性配置,用在方法上:@Value(“${server.port}”)
  • 方式2:使用注解@ConfigurationProperties读取属性配置,用着类上,使用此种方式,必须要有成员变量的getter、setter方法。
  • 方式3:使用注解 @PropertySource 和 @Value 来读取属性配置
  • 方式4:使用注解 @PropertySource 和 @ConfigurationProperties 来读取属性配置
  • 方式5:使用环境变量 Environment 读取属性配置。

13、SpringBoot 支持哪些日志框架?

SpringBoot 支持 Java 自带的Logging, Log4j2, Logback 作为日志框架,
SpringBoot 默认使用 Logback 作为日志框架,
但不管是哪种日志框架,都支持将日志信息输出到控制台或者本地文件中

14、SpringBoot的优势?

  • 1.简化配置,可以快速构建项目;
  • 2.内置tomcat服务器,项目可独立运行;
  • 3.约定大于配置,实现自动装配;
  • 4.集成了常用的第三方库的配置。

15、SprinBoot容器启动流程是怎样的?

第一部分:创建SpringApplication对象

  • 1.创建springbootApplication对象
  • 2.获取当前应用的启动类型,默认是servlet;
    1).none:不基于web容器启动
    2).servlet:基于web容器启动
    3).reactive:响应式启动(spring5新特性)
  • 3.读取META-INFO下的spring.factories文件,获取对应的初始化器和监听器装配到集合中(List集合);
  • 4.设置程序运行的主类(main方法所在的类)
    第二部分:调用SpringApplication对象的run方法
  • 5.调用run方法启动,并记录项目启动时间(System.nanoTime()方法);
  • 6.获取并启用监听器(通过循环调用listeners.starting()方法)
  • 7.准备环境变量,将配置文件读取到容器中(支持yml,yaml,xml,properties)
  • 8.打印banner信息,可以自定义(在resources目录下添加一个banner.txt的文件)
  • 9.创建应用程序的上下文(调用createApplicationContext()方法)
  • 10.刷新上下文(refreshContext()方法),实现自动装配和启动tomcat
  • 11.实例化一个异常报告器(只会捕获启动过程中抛出的异常)
  • .通过回调机制告诉springboot容器已经启动成功啦。

16、Spring Boot是如何实现自动装配?

  • 1.⾸先SpringBoot启动类有一个@SpringBootApplication复合注解;
  • 2.它包含了一个@EnableAutoConfiguration复合注解;
  • 3.它又包含了一个@Import注解,导入了一个AutoConfigurationlmportSelector类;
  • 4.通过该类的selectImports()方法去读取需要被自动装配的组件下的spring.factories文件;
  • 5.然后将符合条件(通过@ConditionalOnXXX)的类限定名集合返回给IOC容器,并将这些组件注册为bean。

17、Spring Boot是如何启动Tomcat的?

  • 1.⾸先SpringBoot在启动时会先创建⼀个Spring容器;
  • 2.在创建Spring容器过程中,会利⽤@ConditionalOnClass注解来判断当前classpath中是否存在Tomcat依赖,如果存在则会⽣成⼀个启动Tomcat的Bean
  • 3.Spring容器创建完之后,就会获取启动Tomcat的Bean,然后创建Tomcat对象,并绑定端⼝等,然后启动Tomcat。

18、如果让你实现一个SpringBoot-starter,你应该怎么做?

  • 1.创建一个start项目,名称叫XXX-spring-boot-starter,引入spring-boot-starter依赖;
  • 2.创建一个XXXProperties类,引入@ConfigurationProperties注解表明这是一个配置文件,并指定prefix属性:
    在这里插入图片描述
  • 3.创建一个XXXAutoConfiguration自动配置类,引用定义好的配置文件;在自动配置类中编写我们的实现类:
    在这里插入图片描述
    让starter生效,starter集成应用有两种方式:
    1).被动生效 :通过SpringBoot的SPI的机制来去加载我们的starter:
    我们需要在META-INF下新建一个spring.factories文件,key为org.springframework.boot.autoconfigure.EnableAutoConfiguration,value是我们创建的自动配置类的全限定名:
    在这里插入图片描述
    2).主动生效:需要主动声明启用该starter才生效:
    通过自定义一个@Enable注解,然后通过@Import注解把自动配置类引入进来,使用的时候需要在启动类上面开启这个注解:
    在这里插入图片描述
  • 4.打包:通过mvn install命令构建就可以了(如果需要部署到公司的仓库:maven deploy)
  • 5.新建一个新的SpringBoot项目,引入我们刚写的starter:
    在这里插入图片描述
  • 6.然后在配置文件(application.yml)中配置XXXProperties 的属性信息就可以啦:
    在这里插入图片描述

19、您对微服务有何了解?

微服务架构核心就是将传统的一站式应用,按照业务拆分成一个一个的服务,每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境。

20、微服务之间是如何通讯的?

  • 1、同步通讯:
    dobbo通过 RPC 远程过程调用;Springcloud通过 REST 接口,json调用等。
  • 2、异步通讯:使用消息队列,如:RocketMq、Kafka 等。

21、微服务架构有哪些优势?

  • 1、独立开发:所有微服务都可以根据各自的功能轻松开发
  • 2、独立部署:能够被独立地部署到生产环境
  • 3、故障隔离:即使应用程序的一项服务不起作用,系统仍可继续运行
  • 4、混合技术堆栈:可以使用不同的语言和技术来构建同一应用程序的不同服务

22、什么是 REST / RESTful 以及它的用途是什么?

REST是一种设计API接口的风格,但不是标准,具有高可读性,高可用性。
如果一个架构符合REST的接口风格,我们就称它为RESTful架构,
传统的接口设计,就是过程式的,每个特定的动作有特定的接口。
RESTful接口设计,路径一般就是操作的实体对象复数,有GET(查询)/POST(添加)/PUT(修改)/DELETE(删除)等接口。

23、微服务拆分遵循原则的?

  • 1.水平拆分
    横向拆分,即按照不同的业务功能,拆分成不同的微服务,如天气数据采集、数据存储、天气查询等服务,形成独立的业务领域微服务集群;
  • 2.垂直拆分
    纵向拆分,即把一个业务功能里的不同模块或组件进行拆分。例如,把公共组件拆分成独立的基础设施,下沉到底层,形成相对独立的基础设施层;
  • 3.使用DDD
    一个微服务,应该能反映出某个业务的领域模型。使用DDD,不但可以减少微服务环境中通用语言的复杂性,而且可以帮助团队搞清楚领域的边界,理清上下文边界* 1、同步通讯:

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

推荐阅读