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、同步通讯:
总结
都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!