1. Spring、Spring MVC以及SpringBoot的区别
- Spring Spring的核心始终是
IOC
与AOP
,IOC
提供依赖注入的容器,AOP
解决面向切面的编程,在二者基础上实现其他的功能 - Spring MVC Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像
DispatcherServlet
,ModelAndView
等简单的概念,简化Web应用的开发 - SpringBoot SpringBoot通过自动配置类与启动项实现了自动装配,降低了项目搭建的复杂度
2. SpringBoot的优点
- 独立运行。其内嵌了各种servlet容器故只需要一个jar包便可以独立运行
- 简化配置。spring-boot-starter-web启动器自动依赖于其他组件,简化了maven的配置
- 自动配置。SpringBoot可以根据当前类路径下的类、jar包自动配置bean
- 无代码生成及xml配置。SpringBoot的配置借助于条件注解完成的
- 避免了大量的maven导入以及版本冲突
- 应用监测。SpringBoot提供了一系列端点可以监控服务及应用,进行健康检查
3. SpringBoot的启动过程
- SpringBoot启动时从类路径下的
META-INF/spring.factories
中获取EnableAutoConfiguration
的指定值 - 将值作为自动配置类导入容器,自动配置类随即生效,整个J2EE的解决方案与自动配置都在
springboot-autoconfigure
的jar包中 - 其会给容器中导入相当多的自动配置类(xxxAutoConfiguration)
4. Spring Factories的机制
SpringBoot的自动配置是基于Spring Factories机制实现的。Spring Factories机制是SpringBoot中的一种服务发现机制,SpringBoot会自动扫描所有jar包路径下的META-INF/spring.factories
文件,并读取其中的内容进行实例化,这也是SpringBoot Starter的基础
5. SpringBoot自动配置原理
注解@EnableAutoConfiguration
,@Configuration
,@ConditionalOnClass
就是自动配置的核心。其中@EnableAutoConfiguration
给容器导入META-INF/spring.factories
里定义的自动配置类,每一个自动配置类结合对应的xxxProperties.java
读取配置文件进行自动配置
6. SpringBoot的核心注解及其组成
核心注解为@SpringBootApplication
,其由三个注解组成:
@SpringBootConfiguration
:组合了@configuration
注解,实现了配置文件的功能@EnableAutoConfiguration
:打开自动配置功能@ComponentScan
:进行组件扫描
7. bootstrap.yml与application.yml的区别
二者都是SpringB的核心配置文件,其中:
- bootstrap.yml由父ApplicationContext加载,优于application加载,配置在应用程序上下文的引导街道生效,一般用于
SpringCloud Config
或者是nacos
,同时bootstrap中的属性不可被覆盖 - application.yml由ApplicationContext加载,用于SpringBoot项目的自动配置
8. SpringBoot 配置文件的加载顺序
- config/application.properties
- config/application.yml
- application.properties
- application.yml
- resources/config/application.properties
- resources/config/application.yml
- resources/application.properties
- resources/application.yml
9. SpringBoot读取配置文件的方式
- 使用
@value
注解 - 使用
@ConfigurationProperties
注解将值绑定到一个对象 - 通过
Environment
进行获取
10. 微服务的优缺点
- 优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模小。在开发中只需要专注于当前功能,便利集中,功能小而精。一个功能受损对其他功能影响不大,可以快速定位问题,不会与html和css等界面混合,搭配灵活。
- 缺点:随服务数量增加,管理复杂,部署复杂,服务器需求量大,服务通信和调用压力大,系统依赖性增强。
11. SpringCloud的概念
SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务注册与发现、配置中心、消息总线、负载均衡、断路器、数据监控等
12. SpringCloud的优点
单体架构的项目随业务的发展会越来越复杂,可能会出现代码结构混乱、开发效率低、排查解决问题成本高等问题,因而近年来微服务架构逐步取代了单体架构,而SpringCloud是目前最常用的微服务开发框架,已经在企业级开发中有了大量的应用
13. SpringCloud与SpringBoot的区别
- SpringBoot专注于快速方便的开发单个个体微服务
- SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整理并管理,为各个微服务之间提供配置管理、服务发现、断路器、路由、微代理、事件总线等集成服务
14. SpringCloud的组成组件
- Eureka/Nacos:服务注册与发现
- Zull/SpringCloud Gateway:服务网关
- Ribbon:客户端负载均衡
- Feign:声明性的Web服务客户端
- Hystrix:断路器
- SpringCloud Config/N按从事:分布式统一配置管理
15. Eureka和ZooKeeper的区别
- ZooKeeper中的节点服务挂掉会进行重新选举,在选举期间注册服务瘫痪;Eureka各个节点平等,只要有一台Eureka就可以保证服务可用
- ZooKeeper本质上是一个进程;Eureka本质是一个工程
- ZooKeeper保证的是CP;Eureka保证的是AP
16. Eureka工作原理
- EurekaServer(服务注册中心)对外暴露自己的地址
- 提供者启动后向Eureka注册自身信息
- 消费者向Eureka订阅服务,Eureka将对应服务的所有提供者地址列表发送给消费者并定期更新
- 心跳续约:提供者定期通过HTTP方式向Eureka刷新自身状态
17. Feign工作原理
- 主程序入口添加
@EnableFeignClients
注解开启对FeignClient
扫描加载处理。根据FeignClient
开发规范,定义接口并添加@FeignClientd
注解 - 当程序启动时进行包扫描,扫描所有带有
@FeignClients
注解的类,并将信息注入到Spring IOC
容器中,当定义的Feign
接口中的方法被调用时,通过JDK
的代理方式生成具体的RequestTemplate
- 生成代理时,Feign会为每个接口方法创造一个
RequestTemplate
对象,该对象封装HTTP请求需要的全部信息 RequestTemplate
生成Request,然后将Request交给Client处理,最后Client被封装到LoadBalanceClient
类,该类结合Ribbon负载均衡发起服务之间的调用
18. Hystrix防雪崩的方式
- 服务降级:在高并发的情况下,防止用户一直等待,使用服务降级方式进行处理(返回友好的提示给客户端,fallback回调方法)。
- 服务熔断:在高并发的情况下,如果达到一定的极限(可以自己设置阈值),如果流量超出了设置的阈值,然后拒绝访问,保护当前服务。当服务器达到最大的承受能力的之后,直接拒绝访问服务,然后调用降级方法,返回友好提示。
- 服务隔离:每个服务接口之间互不影响,服务隔离有2种实现方式,线程池方式、信号量。
- 线程池方式:相当于每个接口(服务)都有自己独立的线程池,不同的线程池之间互不影响,能够实现服务接口隔离。缺点:CPU内存开销较大。
- 信号量方式:底层使用原子计数器(atomic),针对于每个服务都设置自己的独立的限制阈值。比如设置每个服务接口最多同时访问的次数,如果超出缓存队列请求后,自己实现拒绝策略。
19. 服务雪崩
雪崩效应指的是大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃
20. 微服务之间的独立通信方式
- 同步通信:Dubbo通过RPC远程过程调用,SpringCloud通过REST接口json调用
- 异步通信:消息队列,如:RabbitMQ,ActiveM,Kafka等