1. 什么是 Spring Boot
?
传统的SSM/SSH
框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率,而Spring Boot
可以轻松创建 基于Spring
的、可以独立运行的、生产级的应用程序。通过对 Spring 家族和一些第三方库提供一系列自动化配置的Starter
,来使得开发快速搭建一个基于Spring
的应用程序。
Spring Boot
让日益臃肿的Java
代码又重回简洁。在配合Spring Cloud
使用时,还可以发挥更大的威力。
2.Spring Boot
有哪些特点 ?
- 为
Spring
开发提供一个更快、更广泛的入门体验。 - 开箱即用,远离繁琐的配置。
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
- 绝对没有代码生成,也不需要
XML
配置。
3.Spring Boot 中的 starter 到底是什么 ?
首先,Starter
并非什么新的技术点,基本上还是基于Spring
已有功能来实现的。首先它提供了一个自动化配置类,一般命名为 XXXAutoConfiguration ,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是Spring
中原本就有的),然后 它还会提供一系列的默认配置,也允许开发者根据实际情况自定义相关配置,然后通过类型安全的属性注入将这些配置属性注入进来,新注入的属性会代替掉默认属性。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。
4. spring-boot-starter-parent
有什么用 ?
- Java版本(Java8)
- 源码的文件编码方式(UTF-8)
- 继承自
spring-boot-dependencies
,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。 - 执行打包操作的配置。
- 自动化的资源过滤。
- 自动化的插件配置。
- 识别不同的配置,如:
application-dev.properties
和application-dev.yml
5. 微服务中如何实现 session 共享 ?
Spring Session + Redis
通过注解就可以实现session
共享
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的
session
被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享session
,常见的方案就是Spring Session + Redis
来实现session
共享。将所有微服务的session
统一保存在Redis
上,当各个微服务对session
有相关的读写操作时,都去操作Redis
上的session
。这样就实现了session
共享,Spring Session
基于Spring
中的代理过滤器实现,使得session
的同步操作对开发人员而言是透明的,非常简便。session
共享大家可以参考:Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
6.什么是 Spring Data
?
Spring Data
是 Spring
的一个子项目。用于简化数据库访问,支持NoSQL
和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data
具有如下特点:
SpringData
项目支持 NoSQL
存储:
-
MongoDB
(文档数据库) -
Neo4j
(图形数据库) -
Redis
(键/值存储) -
Hbase
(列族数据库)
SpringData
项目所支持的关系数据存储技术:
JDBC
JPA
Spring Data Jpa
致力于减少数据访问层 (DAO
) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA
来帮你完成!Spring Data JPA
通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
7. Spring Boot
打成的 jar
和普通的 jar
有什么区别 ?
Spring Boot
项目最终打包成的 jar
是可执行 jar
,这种 jar
可以直接通过java -jar xxx.jar
命令来运行,这种 jar
不可以作为普通的 jar
被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot
的 jar
无法被其他项目依赖,主要还是他和普通 jar
的结构不同。普通的 jar
包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot
打包成的可执行 jar
解压后,在 \BOOT-INF\classes
目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml
文件中增加配置,将 Spring Boot
项目打包成两个 jar
,一个可执行,一个可引用。
8. bootstrap.properties
和 application.properties
有何区别 ?
单纯做 Spring Boot
开发,可能不太容易遇到 bootstrap.properties
配置文件,但是在结合 Spring Cloud
时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。
bootstrap.properties
在 application.properties
之前加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config
或者 Nacos
中会用到它。bootstrap.properties
被 Spring ApplicationContext
的父类加载,这个类先于加载 application.properties
的 ApplicatonContext
启动。
当然,前面叙述中的 properties 也可以修改为 yaml 。
9.五种分布式系统应对高并发、大流量的常规手段:
扩容
动静分离
缓存
缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。大型网站一般主要是“读”,缓存的使用很容易被想到。在大型“写”系统中,缓存也常常扮演者非常重要的角色。比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至消息中间件,你也可以认为是一种分布式的数据缓存。服务降级
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。根据服务方式:可以拒接服务,可以延迟服务,也有时候可以随机服务。根据服务范围:可以砍掉某个功能,也可以砍掉某些模块。总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽然有损但是总比没有好。限流
限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。