一、Spring Boot 基础概念
-
什么是 Spring Boot?它的核心特性有哪些?
答案:Spring Boot 是一个用于快速构建独立、生产级 Spring 应用程序的框架。核心特性包括自动配置(Auto - Configuration),能根据项目依赖自动配置 Spring 及第三方库;起步依赖(Starter Dependencies),通过简单的依赖坐标整合所需的库;Actuator,提供生产级应用监控和管理功能。
-
Spring Boot 的核心注解有哪些?
答案:@SpringBootApplication,它是一个组合注解,包含@Configuration(标识配置类)、@EnableAutoConfiguration(开启自动配置)、@ComponentScan(扫描组件);@RestController,是@Controller和@ResponseBody的组合,用于创建 RESTful 服务;@Autowired,用于自动装配 Bean。
-
Spring Boot 如何实现自动配置?
答案:Spring Boot 通过@EnableAutoConfiguration注解开启自动配置。在类路径下的META - INF/spring.factories文件中,定义了自动配置类与条件注解的映射关系。启动时,Spring Boot 根据项目引入的依赖和当前环境条件,判断哪些自动配置类生效,从而完成自动配置。
-
Spring Boot 的启动流程是怎样的?
答案:首先,加载SpringApplication类并初始化;然后,根据配置确定应用类型(如 Web 应用或非 Web 应用);接着,加载并解析@SpringBootApplication注解,进行自动配置;最后,启动嵌入式 Web 服务器(如果是 Web 应用),将应用上下文刷新并启动。
-
Spring Boot 的起步依赖是什么?有什么作用?
答案:起步依赖是一组预先定义好的 Maven 或 Gradle 依赖集合。例如spring - boot - starter - web,它包含了开发 Web 应用所需的 Spring MVC、Tomcat 等依赖。作用是简化依赖管理,开发者只需引入相应的起步依赖,无需手动添加大量相关依赖。
二、Spring Boot 核心组件
-
Spring Boot 中的配置文件有哪些类型?有什么区别?
答案:常见类型有application.properties和application.yml。application.properties采用键值对形式;application.yml使用 YAML 格式,更简洁、层次分明。二者都用于配置应用参数,application.yml在复杂配置时更具优势。
-
如何在 Spring Boot 中实现多环境配置?
答案:可以通过application-{profile}.properties/yml的方式,如application - dev.properties(开发环境)、application - prod.properties(生产环境)。在application.properties/yml中通过spring.profiles.active属性指定当前激活的环境配置。
-
Spring Boot 中的 Actuator 有什么作用?常用的端点有哪些?
答案:Actuator 用于监控和管理 Spring Boot 应用。常用端点如/health,用于检查应用健康状况;/info,显示应用自定义信息;/metrics,展示应用各项指标数据;/env,查看应用环境变量和配置属性。
-
Spring Boot 的日志配置如何实现?
答案:Spring Boot 默认使用 Logback 作为日志框架。可以在application.properties/yml中配置日志级别、输出格式等。例如,logging.level.root=INFO设置根日志级别为 INFO;logging.file.name=app.log指定日志文件名称。
-
Spring Boot 中如何实现文件上传?
答案:在 Controller 方法中,使用MultipartFile参数接收上传文件。例如:
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
// 文件上传逻辑
return "上传成功";
}
同时,需在配置文件中设置文件上传大小限制,如spring.servlet.multipart.max - file - size=10MB 。
三、Spring Cloud 基础概念
-
什么是 Spring Cloud?
答案:Spring Cloud 是一系列框架的集合,基于 Spring Boot 提供了一套微服务解决方案。它涵盖了服务注册与发现、配置管理、服务调用、断路器、负载均衡等功能,用于快速构建分布式系统。
-
Spring Cloud 与 Spring Boot 的关系是什么?
答案:Spring Boot 是基础,提供快速构建独立应用的能力;Spring Cloud 基于 Spring Boot,在其基础上提供了微服务开发所需的各种组件和功能,用于构建分布式系统。
-
微服务架构的优缺点是什么?
答案:优点包括服务独立部署、可扩展性强、技术选型灵活、团队协作效率高;缺点有分布式系统复杂性增加、服务间通信成本高、数据一致性难以保证、运维难度增大。
-
Spring Cloud 的核心组件有哪些?
答案:包括 Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Feign(声明式服务调用)、Hystrix(断路器)、Zuul(网关)、Config Server(配置中心)等。
-
服务注册与发现的作用是什么?
答案:服务注册与发现用于管理微服务实例的注册和查找。服务启动时将自身信息注册到注册中心,其他服务通过注册中心获取可用服务实例信息,实现服务间的动态调用,避免硬编码服务地址。
四、Spring Cloud 核心组件
-
Eureka 的工作原理是什么?
答案:Eureka 包含服务端(Eureka Server)和客户端(Eureka Client)。服务端用于接收服务注册和管理服务实例信息;客户端将自身服务信息注册到服务端,并定期发送心跳进行续约。服务端若长时间未收到心跳,会将该服务实例从注册列表中移除。
-
Ribbon 的负载均衡策略有哪些?
答案:常见策略有轮询(RoundRobinRule)、随机(RandomRule)、根据响应时间加权(WeightedResponseTimeRule)、重试(RetryRule)等。可以通过配置或代码指定负载均衡策略。
-
Feign 的作用是什么?它与 Ribbon、Hystrix 的关系是什么?
答案:Feign 是声明式服务调用客户端,通过定义接口和注解即可调用远程服务。Feign 默认集成了 Ribbon,用于实现客户端负载均衡;同时也支持集成 Hystrix,用于实现服务熔断降级。
-
Hystrix 的断路器有哪几种状态?
答案:断路器有三种状态,分别是关闭(Closed)、打开(Open)、半打开(Half - Open)。关闭状态下,请求正常调用;打开状态下,请求直接快速失败,不调用实际服务;半打开状态下,允许部分请求尝试调用服务,若调用成功,断路器切换到关闭状态。
-
Zuul 网关的主要功能是什么?
答案:Zuul 网关的主要功能包括请求路由(将客户端请求转发到后端微服务)、请求过滤(对请求进行身份验证、日志记录、限流等处理)、负载均衡(配合 Ribbon 实现)、服务聚合(将多个服务的结果进行整合返回)。
五、Spring Boot 与 Spring Cloud 综合应用
-
在 Spring Boot 应用中如何集成 Spring Cloud 组件?
答案:首先,在项目的pom.xml(Maven 项目)或build.gradle(Gradle 项目)中添加相应的 Spring Cloud 依赖;然后,根据组件要求进行配置,如配置 Eureka Server 地址、启用 Feign 等;最后,在代码中使用相关注解和 API 进行开发。
-
如何在 Spring Cloud 中实现服务的熔断降级?
答案:使用 Hystrix 组件。在服务调用端添加@EnableHystrix注解启用 Hystrix;在需要熔断降级的方法上添加@HystrixCommand(fallbackMethod = "fallbackMethodName")注解,指定降级方法。当服务调用失败时,会执行降级方法返回备用结果。
-
Spring Cloud Config Server 如何实现配置的动态刷新?
答案:在客户端添加spring - cloud - starter - bus - refresh依赖;在配置文件中配置消息总线(如 RabbitMQ 或 Kafka);在 Config Server 端和客户端启用刷新端点。修改配置后,通过发送 POST 请求到客户端的/actuator/refresh端点,实现配置的动态刷新。
-
如何解决 Spring Cloud 微服务中的分布式事务问题?
答案:常见解决方案有两阶段提交(2PC)、TCC(Try - Confirm - Cancel)、本地消息表、消息最终一致性等。两阶段提交通过协调者和参与者保证事务一致性,但性能较低;TCC 通过自定义补偿逻辑实现柔性事务;本地消息表和消息最终一致性借助消息队列实现事务的最终一致性。
-
Spring Cloud Gateway 与 Zuul 有什么区别?
答案:Spring Cloud Gateway 基于 Spring 5.0、WebFlux(响应式编程模型)构建,性能更高,支持异步非阻塞 I/O;而 Zuul 基于 Servlet 2.5、Tomcat 容器。Spring Cloud Gateway 功能更强大,支持动态路由、谓词和过滤器,扩展性更好;Zuul 功能相对固定。
六、其他相关问题
-
Spring Boot 如何进行单元测试?
答案:使用spring - boot - starter - test依赖,其中包含 JUnit 5 等测试框架。通过@SpringBootTest注解加载 Spring Boot 应用上下文,使用@Test注解编写测试方法。例如:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void testServiceMethod() {
// 测试逻辑
}
}
-
Spring Cloud 中如何进行服务监控?
答案:可以使用 Spring Boot Actuator 暴露服务监控端点,结合 Prometheus 和 Grafana 实现监控数据的收集和展示。Prometheus 用于抓取 Actuator 端点数据,Grafana 用于可视化展示监控指标。
-
Spring Boot 的 Web 应用如何处理跨域请求?
答案:可以通过添加@CrossOrigin注解到 Controller 类或方法上,允许特定源的跨域请求;也可以在配置类中实现WebMvcConfigurer接口,重写addCorsMappings方法进行全局跨域配置。
-
Spring Cloud 微服务如何实现服务的优雅停机?
答案:使用 Spring Boot 提供的优雅停机功能,通过配置server.shutdown = graceful。在微服务关闭前,会等待所有正在处理的请求完成,然后释放资源,同时在服务注册中心将自身状态设为下线。
-
Spring Boot 中如何实现数据库连接池配置?
答案:Spring Boot 默认使用 HikariCP 作为数据库连接池。可以在application.properties/yml中配置连接池相关参数,如spring.datasource.url(数据库 URL)、spring.datasource.username(用户名)、spring.datasource.password(密码)、spring.datasource.hikari.maximum - pool - size(最大连接数)等。