Java程序员面试总结(二):SpringBoot/SpringCloud
在Spring Boot中,Starter(或称为"启动器")是一种用于简化依赖管理和项目配置的概念。Starter是一组预先配置的依赖项(dependencies)和配置文件,它们被打包在一起,以便开发者可以轻松地引入它们,从而快速搭建和运行特定类型的应用程序。,其中表示特定类型的应用程序或技术。Spring Boot提供了多个官方的Starter,也有很多由社区贡献的Starter。用于构建W
1.SpringBoot启动流程
Spring Boot 启动过程是相对复杂的,但我将尽量以简明的方式概述主要步骤。Spring Boot 提供了一种简化的方式来构建和配置 Spring 应用程序。以下是 Spring Boot 启动的主要步骤:
-
执行
main
方法: Spring Boot 应用程序的入口点是一个包含main
方法的类。该方法是 Java 应用程序的入口,通过执行这个方法来启动 Spring Boot 应用。public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
-
创建 Spring 应用程序上下文:
SpringApplication.run
方法会创建一个 Spring 应用程序上下文(ApplicationContext)。应用程序上下文是 Spring 框架中用于管理 bean 的核心对象。 -
启动 Spring Boot 自动配置: Spring Boot 使用约定大于配置的原则,自动配置很多常见的场景,减少了手动配置的工作。在这个阶段,Spring Boot 自动配置会根据项目中的依赖、配置文件和其他条件来配置应用程序。
-
扫描并加载 Bean: Spring Boot 会自动扫描应用程序中的包,查找被
@Component
注解(包括@Service
、@Repository
、@Controller
等)标记的类,并将它们注册为 Spring bean。 -
应用程序事件发布: Spring Boot 会发布各种应用程序事件,允许开发者在应用程序的不同生命周期阶段执行自定义逻辑。例如,可以监听
ApplicationStartedEvent
事件来执行应用程序启动后的逻辑。 -
嵌入式 Web 服务器启动: 如果应用程序是一个 Web 应用,Spring Boot 会自动配置并启动嵌入式的 Web 服务器(如Tomcat、Jetty等),并将应用程序部署到这个服务器上。
-
执行
CommandLineRunner
和ApplicationRunner
: 如果有实现了CommandLineRunner
或ApplicationRunner
接口的 bean,Spring Boot 会在应用程序启动后执行它们的run
方法。这提供了一种在应用程序启动时执行一些自定义逻辑的方式。 -
应用程序启动完成: 当所有的配置和初始化都完成后,Spring Boot 会发出应用程序已启动的事件,并正式对外提供服务。
2.SpringBoot优点
Spring Boot 是基于 Spring 框架的一个开发框架,它在开发企业级 Java 应用程序时提供了一系列的优势和便利。以下是 Spring Boot 的一些主要优点:
-
简化配置: Spring Boot 遵循"约定优于配置"的原则,提供了很多默认配置,减少了大量的配置工作。开发者不再需要手动配置大量的 XML 或注解,可以更专注于业务逻辑的开发。
-
快速开发: Spring Boot 提供了很多快速开发的工具,如自动配置、快速部署等,可以极大地提高开发效率。项目搭建和配置非常简单,可以在短时间内创建一个可运行的应用程序。
-
内嵌式 Web 服务器: Spring Boot 集成了常见的内嵌式 Web 服务器(如Tomcat、Jetty、Undertow),开发者无需手动配置服务器,直接通过
java -jar
命令就能运行应用程序。 -
微服务支持: Spring Boot 对构建微服务架构提供了良好的支持。它可以轻松创建独立的、基于 RESTful 的微服务,并提供了 Spring Cloud 生态系统来简化分布式系统的开发。
-
自动配置: Spring Boot 提供了大量的自动配置,根据项目的依赖自动配置应用程序,避免了繁琐的手动配置。当然,也可以进行个性化的配置以满足特定需求。
-
开发体验优秀: Spring Boot 提供了强大的开发工具,如热部署、自动重启等,提高了开发体验。开发者可以更方便地调试和修改代码。
-
集成广泛: Spring Boot 与 Spring 生态系统完美集成,支持众多的第三方库和插件,如 Spring Data、Spring Security、Spring Batch 等,使开发更为便捷。
-
自动化管理: Spring Boot 集成了 Maven 或 Gradle 构建工具,可以很方便地进行依赖管理、版本管理等。同时,Spring Boot Actuator 提供了对应用程序的监控和管理功能。
-
社区活跃: 由于 Spring Boot 在 Java 开发中的广泛应用,社区活跃度很高,提供了大量的文档、教程和解决方案,有助于开发者更好地使用和理解 Spring Boot。
3.什么是starter
在Spring Boot中,Starter(或称为"启动器")是一种用于简化依赖管理和项目配置的概念。Starter是一组预先配置的依赖项(dependencies)和配置文件,它们被打包在一起,以便开发者可以轻松地引入它们,从而快速搭建和运行特定类型的应用程序。
Starter的命名通常遵循以下模式:spring-boot-starter-*
,其中*
表示特定类型的应用程序或技术。Spring Boot提供了多个官方的Starter,也有很多由社区贡献的Starter。
主要的Spring Boot Starter包括:
-
spring-boot-starter-web: 用于构建Web应用程序的Starter,包含了Spring MVC、Tomcat以及其他与Web相关的依赖项。
-
spring-boot-starter-data-jpa: 针对使用JPA(Java Persistence API)进行数据访问的Starter。
-
spring-boot-starter-data-rest: 用于创建RESTful API的Starter,通过Spring Data REST提供对JPA存储库的支持。
-
spring-boot-starter-security: 提供Spring Security的Starter,用于处理应用程序的安全性需求。
-
spring-boot-starter-test: 包含用于测试的各种依赖项,如JUnit、TestNG等。
使用Starter的优势在于它们封装了底层框架和库的配置细节,让开发者可以更专注于应用程序的业务逻辑而不必过多关心依赖项的版本和配置。通过简单地引入适当的Starter,开发者可以启动项目并开始开发,而不必手动配置大量的依赖项。
4.SpringBoot自动化配置
Spring Boot 的自动化配置是其设计中的一个关键特性,通过这个特性,Spring Boot能够根据应用程序的依赖关系和项目结构自动配置很多常见的配置。以下是关于Spring Boot自动化配置的一些关键点:
-
条件化配置(Conditional Configuration): Spring Boot 使用条件化注解(
@ConditionalOn...
)来指定配置在何种条件下生效。这样,只有当特定条件满足时,相关的配置才会生效。 -
自动扫描: Spring Boot 会自动扫描应用程序中的包,寻找带有特定注解(如
@Component
、@Service
等)的类,将它们注册为Spring bean。 -
默认值配置: Spring Boot 提供了许多默认配置,这些配置可用于大多数应用程序,从而减少了手动配置的需求。如果开发者不提供特定的配置,Spring Boot 将使用默认值。
-
外部配置: Spring Boot 允许使用外部配置文件(如
application.properties
或application.yml
)来配置应用程序。这样,开发者可以在不修改代码的情况下更改应用程序的配置。 -
自定义配置: 尽管Spring Boot提供了很多自动配置,但开发者仍然可以通过提供自定义配置来覆盖默认行为。这可以通过在应用程序中定义特定的bean来实现。
-
启动器(Starters): 启动器是预先打包的依赖项和配置的组合,可以方便地引入到项目中,从而简化了项目的构建和配置过程。
-
Spring Boot Initializer: Spring Boot提供了一个Web界面(Spring Initializer),可以用来初始化Spring Boot项目,选择需要的依赖项和配置选项。
-
自动配置的事件: Spring Boot 发布一系列事件,这使得应用程序能够在不同的生命周期阶段对自动配置进行定制。例如,可以监听
ApplicationReadyEvent
事件,在应用程序完全启动后执行自定义逻辑。
5.SpringBoot的核心注解
Spring Boot 是建立在 Spring 框架之上的,它继承了 Spring 框架的核心思想,并引入了一些用于简化开发的新特性。以下是一些 Spring Boot 中常用的核心注解:
-
@SpringBootApplication
: 该注解用于标识一个Spring Boot应用程序的主类。它包括@Configuration
、@EnableAutoConfiguration
和@ComponentScan
三个注解,用于 -
@Controller
: 该注解用于标识一个类是Spring MVC控制器,处理HTTP请求。 -
@Service
: 该注解用于标识一个类是Spring的服务层组件,通常用于放置业务逻辑。 -
@Repository
: 该注解用于标识一个类是Spring的数据访问层组件,通常用于放置数据库访问逻辑。 -
@Component
: 该注解是通用的组件注解,用于标识一个类是Spring容器管理的组件。 -
@Configuration
: 该注解用于标识一个类是配置类,通常用于配置Bean。 -
@RestController
: 该注解是@Controller
和@ResponseBody
的组合,用于标识一个类是RESTful风格的控制器。 -
@RequestMapping
: 该注解用于将HTTP请求映射到控制器的处理方法。
这些注解是 Spring Boot 应用程序中常用的核心注解,用于实现不同层次的组件和功能。根据应用的需求,你可能会使用更多其他的注解和组件。
6.SpringCloud模块有哪些
Spring Cloud 是一个基于 Spring Boot 的开发工具集,用于简化构建分布式系统的任务。它提供了一系列的组件和工具,用于解决分布式系统中的常见问题,例如服务发现、负载均衡、断路器、配置管理等。Spring Cloud 通过在微服务架构中引入这些组件,帮助开发者更容易地构建和管理分布式系统。
Spring Cloud 主要包含以下几个核心模块:
-
Spring Cloud Config: 用于集中管理和存储配置信息,支持不同环境和微服务的配置隔离。
-
Spring Cloud Netflix: 整合了 Netflix 公司开发的一系列组件,包括服务发现(Eureka)、断路器(Hystrix)、负载均衡(Ribbon)、API 网关(Zuul)等。
-
Spring Cloud OpenFeign: 一个声明式的HTTP客户端,简化了微服务之间的调用,支持负载均衡和断路器。
-
Spring Cloud Sleuth: 用于分布式系统的跟踪和监控,提供了跟踪标识和记录的功能。
-
Spring Cloud Bus: 通过消息代理实现微服务之间的通信,用于在集群中传播状态的变化。
-
Spring Cloud Security: 提供了在分布式系统中进行安全认证和授权的支持。
-
Spring Cloud Data Flow: 用于构建、部署和管理数据微服务的工具。
-
Spring Cloud Task: 提供了在分布式系统中执行简短任务的支持。
-
Spring Cloud Stream: 基于 Spring Boot 的轻量级事件驱动微服务框架,用于构建消息驱动的微服务。
-
Spring Cloud Gateway: 用于构建 API 网关的模块,提供路由、过滤、限流等功能。
7.Eureka和zookeeper 的区别
Eureka 和 Zookeeper 都是用于构建分布式系统中服务发现和注册的工具,但它们有一些关键的区别:
Eureka:
-
服务发现设计: Eureka 是 Netflix 提供的服务发现工具,主要用于在微服务架构中定位服务。它采用了客户端/服务器的架构,服务提供者通过向 Eureka 服务器注册自己的信息,服务消费者通过查询 Eureka 服务器获取服务提供者的信息。
-
CAP 理论: Eureka 属于 CP(一致性和分区容错性)系统,即在网络分区发生时,系统保持一致性,可能导致某些节点不可用。
-
适用场景: Eureka 更适用于云原生环境,特别是在 AWS 上,它天然地与 AWS 组合使用。
Zookeeper:
-
服务发现设计: Zookeeper 是一个分布式协调服务,可以用于服务发现、配置管理、同步和协调。在服务发现方面,Zookeeper 使用一个中心化的服务注册表,服务提供者将自己的信息写入 Zookeeper,服务消费者从 Zookeeper 获取服务提供者信息。
-
CAP 理论: Zookeeper 属于 CP 系统,强调一致性和分区容错性。在网络分区发生时,Zookeeper 保持数据一致性。
-
适用场景: Zookeeper 不仅用于服务发现,还广泛用于其他分布式系统的协调任务,如分布式锁、配置管理等。它在大型、复杂的系统中有更多的使用场景。
共同点:
-
分布式协调: Eureka 和 Zookeeper 都是分布式系统中的协调工具,用于解决服务发现、配置管理等问题。
-
开源: Eureka 和 Zookeeper 都是开源的工具,可以免费使用。
-
社区支持: 两者都有活跃的社区支持,用户可以获得及时的帮助和更新。
选择 Eureka 还是 Zookeeper 取决于具体的需求和场景。如果服务发现是主要需求,且在云原生环境中使用,Eureka 可能是更合适的选择。如果系统需要更多的协调服务,或者在复杂的分布式环境中使用,Zookeeper 则是一个更通用的选项。
8.SpringClound容错
在 Spring Cloud 中,容错是构建分布式系统时的一个重要考虑因素,主要用于处理分布式系统中服务之间的故障和异常。以下是 Spring Cloud 中常用的容错机制:
-
Hystrix: Hystrix 是 Netflix 提供的容错库,用于处理分布式系统中的延迟和故障。它通过隔离、熔断、降级等机制来提高系统的弹性。在 Spring Cloud 中,可以通过在服务上添加
@EnableHystrix
注解启用 Hystrix 支持,并使用@HystrixCommand
注解定义容错处理逻辑。 -
Resilience4j: Resilience4j 是一个轻量级的容错库,也可用于构建弹性系统。它提供了类似于 Hystrix 的功能,如熔断、重试、超时控制等。在 Spring Cloud 中,可以通过添加相应的依赖并配置来使用 Resilience4j。
-
Sentinel: Sentinel 是阿里巴巴提供的开源容错和流量控制库。它提供了实时的监控、熔断、降级等功能。在 Spring Cloud 中,可以通过添加 Sentinel 的支持,对服务进行容错和流量控制。
9.SpringClound负载均衡策略
Spring Cloud 提供了多种负载均衡策略,其中主要使用的是 Ribbon,它是一个基于 HTTP 和 TCP 客户端的负载均衡器。以下是 Ribbon 支持的一些负载均衡策略:
-
轮询策略(Round Robin): Ribbon 默认的负载均衡策略,依次将请求分发到每个可用的服务实例。
-
随机策略(Random): 随机选择一个可用的服务实例进行请求。
-
最小并发数策略(Best Available Rule): Ribbon 会选择并发请求数最小的服务实例。
-
权重策略(Weighted Response Time Rule): 根据服务实例的响应时间和权重来进行负载均衡。
-
根据区域策略(Zone Avoidance Rule): Ribbon 会尽量将请求发送到不同区域的服务实例,以降低延迟。
-
自定义策略: 开发者可以实现自定义的负载均衡策略,并在配置中指定使用该策略。
10.eureka自我保护机制
Eureka 的自我保护机制是为了防止网络分区(Network Partition)导致整个系统的瘫痪。在分布式系统中,可能由于网络问题导致部分 Eureka 服务器之间的通信中断,而这可能使得某些服务提供者的实例在 Eureka 服务器中被错误地认为不可用,从而被注销。
自我保护机制的作用是在 Eureka 服务器节点之间的通信出现问题时,保留对已注册服务实例的信息,即便无法获取心跳等信息。这样可以确保在网络问题解决后,服务实例不会因为长时间无法被 Eureka 服务器感知而被剔除。
主要特点和原理:
-
自我保护开关: Eureka 服务器上有一个自我保护的开关,默认是开启的。通过该开关,Eureka 在运行时会定期检查当前是否出现网络分区情况。如果检测到网络分区,自我保护机制会被激活。
-
保护阈值: 当 Eureka 服务器节点的注册信息更新频率降低到一定程度时,自我保护机制就会启动。这个阈值通过
eureka.server.renewalPercentThreshold
配置项设置,默认为 0.85。 -
自我保护过程: 一旦自我保护机制激活,Eureka 服务器将停止剔除长时间没有心跳的服务实例,以保留可能在网络分区期间无法正常通信的服务实例。
-
自我保护关闭: 当网络分区问题解决时,自我保护机制将自动关闭。Eureka 服务器将恢复对长时间没有心跳的服务实例的剔除。
虽然自我保护机制确保了服务实例的稳定性,但在正常网络环境下,服务实例无法及时剔除可能会导致注册表中存在一些已经下线的实例。因此,它应该被视为一种容错机制,而不是长期的解决方案。在生产环境中,建议根据实际情况调整 Eureka 服务器的配置,以便更好地适应网络环境。
11.SpringCloud如何实现服务的注册
pring Cloud 使用 Eureka 作为服务注册中心,实现服务的注册原理主要涉及 Eureka 客户端和 Eureka 服务器之间的交互。以下是服务注册的基本原理:
-
服务提供者向 Eureka 注册:
- 当一个服务提供者(例如一个微服务应用)启动时,它会向 Eureka 服务器发送一个注册请求,包含自己的服务实例信息。
- 服务实例信息包括服务的名称、主机名、IP 地址、端口号、健康状态、元数据等。
-
Eureka 服务器存储注册信息:
- Eureka 服务器接收到注册请求后,会将服务提供者的实例信息存储在注册表中。
- 注册表是 Eureka 服务器的核心组件,用于存储所有注册的服务实例信息。
-
Eureka 服务器定时检测健康状态:
- Eureka 服务器会定期向注册表中的服务实例发送心跳请求,以检测服务实例的健康状态。
- 如果一个服务实例在一定时间内没有发送心跳,Eureka 将认为该实例不可用,并从注册表中移除。
-
服务实例续约:
- 在服务提供者启动后,它会定时向 Eureka 服务器发送心跳续约请求,表明自己仍然存活。
- 这样可以防止服务实例因为网络抖动等原因被错误地移除。
-
服务发现:
- 服务消费者(其他微服务或客户端)在需要调用某个服务时,会向 Eureka 服务器发送服务发现请求。
- Eureka 服务器返回符合条件的服务实例信息给服务消费者。
-
负载均衡:
- 服务消费者在获取到服务实例信息后,可以使用负载均衡算法选择其中一个实例进行调用。
- Eureka 客户端内置了 Ribbon 负载均衡器,支持多种负载均衡策略。
12.SpringClound Gateway原理
Spring Cloud Gateway是Spring Cloud生态系统中的一个基于Spring Framework 5、Project Reactor和Spring Boot 2的API网关服务。它使用非阻塞的方式处理请求,具有高性能、灵活性和扩展性。以下是Spring Cloud Gateway的主要原理:
-
基于WebFlux: Spring Cloud Gateway使用WebFlux作为底层的反应式编程框架。WebFlux支持非阻塞I/O,适用于处理大量并发请求。
-
路由: Gateway的核心概念之一是路由。路由定义了请求的URI、断言(Predicate)和过滤器(Filter)。通过配置多个路由,可以将不同的请求映射到不同的服务。
-
断言(Predicate): 断言是用于匹配请求的条件。通过断言,可以定义哪些请求应该被路由到指定的服务。例如,基于路径的断言可以匹配请求的URI。
-
过滤器(Filter): 过滤器用于在请求被路由前或之后对请求进行修改。Spring Cloud Gateway的过滤器功能非常强大,可以用于添加请求头、修改请求体、记录日志等操作。
-
Gateway Handler: Gateway Handler是处理请求的实际组件,它包含路由、断言和过滤器。Gateway Handler执行请求的转发、修改和处理。
-
动态路由: Spring Cloud Gateway支持动态路由。通过配置中心或其他方式,可以在运行时动态地添加、删除或修改路由。
-
集成微服务发现: Spring Cloud Gateway可以与服务注册中心(例如Eureka、Consul)集成,从而动态地发现和路由到注册的微服务。
-
异步处理: 基于WebFlux的异步处理机制,使得Gateway能够高效地处理并发请求,提高系统的吞吐量。
-
全局过滤器: 全局过滤器可以应用于所有的路由,用于处理一些通用的逻辑,例如身份验证、日志记录等。
-
事件模型: Spring Cloud Gateway基于Reactor提供了一种事件模型。通过监听网关事件,可以实现对请求生命周期的全面控制。
总体而言,Spring Cloud Gateway的设计和实现是基于响应式编程的思想,旨在提供高性能、灵活和可扩展的API网关服务。通过合理配置路由、断言和过滤器,可以满足不同场景下的网关需求,例如微服务路由、身份验证、日志记录等。
更多推荐
所有评论(0)