Java SpringBoot微服务面试题

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、同步通讯:

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程&#xff0c;主要包括准备环境、模型转换、编写代码和模型推理。 首先&#xff0c;确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK&#xff0c;它能对TensorFlow、PyTorch等框架训…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

Java毕业设计-基于springboot开发的漫画之家系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的漫画之家系统-毕业论…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

Python Web开发记录 Day4:JavaScript

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 四、JavaScript1、JavaScript-基础①JavaScript…

postman访问k8s api

第一种方式&#xff1a; kubectl -n kubesphere-system get sa kubesphere -oyaml apiVersion: v1 kind: ServiceAccount metadata:annotations:meta.helm.sh/release-name: ks-coremeta.helm.sh/release-namespace: kubesphere-systemcreationTimestamp: "2023-07-24T07…

Unity(第十部)时间函数和文件函数

时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…

alembic

alembic是sqlalchemy的作者开发的。 用来做OMR模型与数据库的迁移与映射。 第一个&#xff0c;alembic的所有命令都是以alembic开头 第二&#xff0c;alembic的迁移文件也是通过版本进行控制的。首先&#xff0c;通过pip install alembic进行安装。以下将解释alembic的用法 方…

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁&#x1f44a; 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff0c;我是寸铁&#xff01…

ARM系列 -- 虚拟化(四)

今天来看看虚拟中断。 在一个非虚拟化的系统中&#xff0c;操作系统可以直接访问GIC的寄存器&#xff0c;并且处理GIC的物理中断接口&#xff08;physical interrupt interface&#xff09;。 但是在一个虚拟化的系统中&#xff0c;不是这样。Guest OS并不知道它运行在虚拟系…

日更【系统架构设计师知识总结2】指令系统(结合真题)

【原创精华】结合老师的讲授、耗费三个小时的精华总结对正在备考的你一定有用&#xff01;&#xff01;自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助…

数据结构与算法(数组,栈,队列,链表,哈希表,搜索算法,排序算法,查找算法,策略算法,递归算法,二叉搜索树BST,动态规划算法)

文章目录 1 课程介绍1.1 前置知识1.2 为什么要学习算法1.3 大厂面试常见数据结构题目(基础)1.4 数据结构和算法的关系 2 数据结构2.1 数据结构概述2.1.1 数据结构是什么2.1.2 数据结构分类2.1.2.1 线性结构2.1.2.2 非线性结构2.1.2.3 小总结 2.1.3 数据结构范围 2.2 数组Array2…

前端sql条件拼接js工具

因为项目原因&#xff0c;需要前端写sql&#xff0c;所以弄了一套sql条件拼接的js工具 ​ /*常量 LT : " < ", LE : " < ", GT : " > ", GE : " > ", NE : " ! ", EQ : " ", LIKE : " like &qu…

【突发】MDPI再出事!23本期刊84篇论文存在“审稿人工厂”问题,4本被中科院预警!

毕业推荐 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 • 2个月19天录用&#xff0c;6天见刊&#xff0c;36天检索 SCIE&#xff08;CCF-C类&#xff09; • 算法类&#xff0c;2.0-3.0&#xff0c;JCR3区&#xff0c;中科院…

后台与接口测试demo 查数据

pom 里引入 mybatis 依赖 2.添加 entity 实体类 3.添加 Mapper 添加SQL语句、接口 SpringbootApplicants.Java 添加 RestController接口 标识 SpringbootApplication 是一个接口&#xff0c;可以通过 GetMapping(“/”) 查询所有数据。 GetMapping(“/”) 依赖于 RestCon…

SpringCloud微服务-Eureka注册中心

Eureka注册中心 文章目录 Eureka注册中心前言1、Eureka的作用2、搭建EurekaServer3、服务注册4、启动多个实例5、服务拉取 -实现负载均衡 前言 在服务调用时产生的问题&#xff1a; //2. 利用RestTemplate发起HTTP请求&#xff0c;查询user String url "http://localho…

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论&#xff0c;还没学过&#xff0c;先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点…

DVWA 靶场之 Command Injection(命令执行)middlehigh

对于 middle 难度的 我们直接先看源码 <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Set blacklist$substitutions array(&& > ,; > ,);// Remove any of the characters in the array (blacklist).$target str_rep…

通过一个栗子来看看创建和运行servlet

通过前面一篇文章的介绍&#xff08;搞着搞着对web project是不是有点迷糊&#xff1f;先关注几个问题-CSDN博客&#xff09;大家对于servlet作为中间层接收请求和反馈响应有了概念上的认知&#xff0c;接下来通过一个栗子来加深一下理解&#xff0c;还是基于前面的jsp项目&…