面经 - Java 中级进阶面试题

Posted Lux_Sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面经 - Java 中级进阶面试题相关的知识,希望对你有一定的参考价值。

1、什么是 Spring Boot?

解析:SpringBoot是Spring开源组织下的子项目,是Spring组件一站式处理方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

2、为什么要用 Spring Boot

解析:SpringBoot优点非常多,如:

  • 独立运行
  • 简化配置
  • 自动配置
  • 无代码生成和XML配置
  • 应用监控
  • 上手容易.....
  • SpringBoot集这么多优点于一身,还有理由不使用它呢?

3、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

解析:

  • SpringBoot的核心配置文件是application和bootstrap配置文件
  • application配置文件这个容易了解,主要用于SpringBoot项目的自动化配置
  • bootstrap配置文件有以下几个应用场景
  • 使用SpringCloudConfig配置中心时,这时需要在bootstrap配置文件中增加连接到配置中心的配置属性来加载外部配置中心的配置信息
  • 少量固定的不能被覆盖的属性
  • 少量加密/解密的场景

4、Spring Boot 的配置文件有哪几种格式?它们有什么区别?

解析:.properties和.yml,它们的区别主要是书写格式不同

1).properties

2).yml

另外,.yml格式不支持@PropertySource注解导入配置

5、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

解析:启动类上面的注解是@SpringBootApplication,它也是SpringBoot的核心注解,主要组合包含了以下 3 个注解:

  • @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。
  • @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})。
  • @ComponentScan:Spring组件扫描。

6、开启 Spring Boot 特性有哪几种方式?

解析:

(1)继承spring-boot-starter-parent项目

(2)导入spring-boot-dependencies项目依赖

7、Spring Boot 需要独立的容器运行吗?

 解析:可以不需要,内置了 Tomcat / Jetty 等容器。

8、运行 Spring Boot 有哪几种方式?

解析:

(1)打包用命令或者者放到容器中运行

(2)用Maven/Gradle插件运行

(3)直接执行main方法运行

9、SpringBoot 常用的 starter 有哪些?

解析:

  • spring-boot-starter-web 嵌入 tomcat 和 web 开发需要 servlet 与 jsp 支持
  • spring-boot-starter-data-jpa 数据库支持
  • spring-boot-starter-data-redisredis 数据库支持
  • spring-boot-starter-data-solr solr 支持
  • mybatis-spring-boot-starter 第三方的 mybatis 集成 starter

10、Spring Boot 自动配置原理是什么?

解析:注解@EnableAutoConfiguration,@Configuration,@ConditionalOnClass就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下能否有这个类去自动配置。

11、你如何了解 Spring Boot 中的 Starters?

解析:Starters可以了解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其余技术,而不需要四处找示例代码和依赖包。

如你想使用SpringJPA访问数据库,只需加入spring-boot-starter-data-jpa启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

12、如何在 Spring Boot 启动的时候运行少量特定的代码?

解析:可以实现接口ApplicationRunner或者者CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。

13、Spring Boot 有哪几种读取配置的方式?

解析:Spring Boot 可以通过 @PropertySource、@Value、@Environment、@ConfigurationProperties 来绑定变量。

14、Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

解析:SpringBoot支持JavaUtilLogging、Log4j2、Lockback作为日志框架,假如你使用Starters启动器,SpringBoot将使用Logback作为默认日志框架。

15、SpringBoot 实现热部署有哪几种方式?

解析:主要有两种方式:Spring Loaded、Spring-boot-devtools。

16、你如何了解 Spring Boot 配置加载顺序?

解析:在 Spring Boot 里面,可以使用以下几种方式来加载配置。

1)properties文件

2YAML文件

3)系统环境变量

4)命令行参数等等

17、SpringBoot可以兼容老Spring项目吗,如何做?

解析:可以兼容,使用@ImportResource注解导入老Spring项目配置文件。

18、保护 Spring Boot 应用有哪些方法?

解析:

  1. 在生产中使用HTTPS
  2. 使用Snyk检查你的依赖关系
  3. 更新到最新版本
  4. 启用CSRF保护
  5. 使用内容安全策略防止XSS攻击...

19、Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?

解析:

  • 配置变更
  • JDK 版本更新
  • 第三方类库更新
  • 响应式 Spring 编程支持
  • HTTP/2 支持
  • 配置属性绑定
  • 更多改进与增强

20、什么是Spring Proles

解析:SpringProfiles允许用户根据配置文件(dev,test,prod等)来注册bean。

因此,当应用程序在开发中运行时,只有某些bean可以加载,而在PRODUCTION中,某些其他bean可以加载。

假设我们的要求是Swagger文档仅适用于QA环境,并且禁用所有其他文档。这可以使用配置文件来完成。SpringBoot使得使用配置文件非常简单。

21、什么是Spring Batch?

解析:SpringBootBatch提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。

它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。

简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。

22、什么是FreeMarker模板?

解析:FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构进行动态网页生成。使用 Freemarker的主要优点是表示层和业务层的完全分离。

程序员可以处理应用程序代码,而设计人员可以处理html页面设计。最后使用freemarker可以将这些 结合起来,给出最终的输出页面。

23、什么是JavaCong

解析:SpringJavaConfig是Spring社区的产品,它提供了配置SpringIoC容器的纯Java方法。因此它有助于避免使用XML配置。

使用JavaConfig的优点在于:

面向对象的配置。由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。

减少或消除XML配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在XML和Java之间来回切换。

JavaConfig为开发人员提供了一种纯Java方法来配置与XML配置概念相似的Spring容器。

从技术角度来讲,只使用JavaConfig配置类来配置容器是可行的,但实际上很多人认为将JavaConfig与XML混合匹配是理想的。

类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于Java5.0对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。

24、启动类注解?

解析:@SpringBootConfiguration:SpringBoot的配置类;标注在某个类上,表示这是一个SpringBoot的配置类;@Configuration:配置类上来标注这个注解

配置类-----配置文件;配置类也是容器中的一个组件;@Component@EnableAutoConfiguration:开启自动配置功能

以前我们需要配置的东西,SpringBoot帮我们自动配置;@EnableAutoConfiguration告SpringBoot开启自动配置功能;这样自动配置才能生效

SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。

25、配置文件的加载顺序?

解析:Spring Boot为了能够更合理的重写各属性的值,提供了下面17种配置管理方式(数字越小优先级越高)

  1. 当$HOME/.config/spring-boot目录下的devtools是启用状态时,会使用Devtools全局设置配置
  2. 单元测试中的@TestPropertySource的注解
  3. 单元测试中的properties属性. 测试注解@SpringBootTest以及应用启用的其他测试注解.
  4. 命令行中传入的参数
  5. SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容
  6. ServletConfig初始化的参数
  7. ServletContext初始化的参数
  8. java:comp/env中的JNDI属性
  9. Java的系统属性 (System.getProperties())
  10. 操作系统的环境变量
  11. 通过random.*配置的随机属性
  12. 位于当前应用jar包之外,指定了不同{profile}环境的application-{profile}.properties/yml配置文件
  13. 位于当前应用jar包之内,指定了不同{profile}环境的application-{profile}.properties/yml配置文件
  14. 位于当前应用jar包之外的application-{profile}.properties/yml配置文件
  15. 位于当前应用jar包之内的application-{profile}.properties/yml配置文件
  16. 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性
  17. 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容

26、自动配置原理?

解析:

(1)SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

(2)@EnableAutoConfiguration作用:将类路径下META-INF/spring.factories里面配置的所有
EnableAutoConfiguration的值加入到了容器中;每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置

(3)每一个自动配置类进行自动配置功能;根据当前不同的条件判断,决定这个配置类是否生效?一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的

(4)所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类怎么用好自动配置,精髓:

i)SpringBoot启动会加载大量的自动配置类

ii)我们看我们需要的功能有没有SpringBoot默认写好的自动配置类

iii)我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)

iv)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值

27、什么是 Spring Cloud

解析:SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。

28、Spring Cloud 断路器的作用是什么?

解析:在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

29、Spring Cloud 的核心组件有哪些?

解析:Eureka:服务注册于发现。Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求。Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。

Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

Zuul:网关管理,由Zuul网关转发请求给对应的服务。

30、SpringCloud 和 Dubbo?

解析:SpringCloud和Dubbo都是现在主流的微服务架构

SpringCloud是Apache旗下的Spring体系下的微服务解决方案

Dubbo是阿里系的分布式服务治理框架

从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本身只是实现了服务治理,而SpringCloud现在以及有21个子项目以后还会更多

所以其实很多人都会说Dubbo和SpringCloud是不公平的

但是由于RPC以及注册中心元数据等原因,在技术选型的时候我们只能二者选其一,所以我们常常为用他俩来对比

服务的调用方式Dubbo使用的是RPC远程调用,而SpringCloud使用的是RestAPI,其实更符合微服务官方的定义

服务的注册中心来看,Dubbo使用了第三方的ZooKeeper作为其底层的注册中心,实现服务的注册和发现,SpringCloud使用SpringCloudNetflixEureka实现注册中心,当然SpringCloud也可以使用ZooKeeper实现,但一般我们不会这样做

服务网关,Dubbo并没有本身的实现,只能通过其他第三方技术的整合,而SpringCloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,SpringCloud还支持断路器,与git完美集成分布式配置文件支持版本控制,事务总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素

从技术选型上讲

目前国内的分布式系统选型主要还是Dubbo毕竟国产,而且国内工程师的技术熟练程度高,并且Dubbo在其他维度上的缺陷可以由其他第三方框架进行集成进行弥补

而SpringCloud目前是国外比较流行,当然我觉得国内的市场也会慢慢的偏向SpringCloud,就连刘军作为Dubbo重启的负责人也发表过观点,Dubbo的发展方向是积极适应SpringCloud生态,并不是起冲突

Rest和RPC对比

其实如果仔细阅读过微服务提出者马丁福勒的论文的话可以发现其定义的服务间通信机制就是HttpRest

RPC最主要的缺陷就是服务提供方和调用方式之间依赖太强,我们需要为每一个微服务进行接口的定义,并通过持续继承发布,需要严格的版本控制才不会出现服务提供和调用之间因为版本不同而产生的冲突

而REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合,只是通过一个约定进行规范,但也有可能出现文档和接口不一致而导致的服务集成问题,但可以通过swagger工具整合,是代码和文档一体化解决,所以REST在分布式环境下比RPC更加灵活

这也是为什么当当网的DubboX在对Dubbo的增强中增加了对REST的支持的原因

文档质量和社区活跃度

SpringCloud社区活跃度远高于Dubbo,毕竟由于梁飞团队的原因导致Dubbo停止更新迭代五年,而中小型公司无法承担技术开发的成本导致Dubbo社区严重低落,而SpringCloud异军突起,迅速占领了微服务的市场,背靠Spring混的风生水起

Dubbo经过多年的积累文档相当成熟,对于微服务的架构体系各个公司也有稳定的现状

31、SpringBoot 和 SpringCloud?

解析:SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务

而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载均衡等

技术维度并相同,并且SpringCloud是依赖于SpringBoot的,而SpringBoot并不是依赖与SpringCloud,甚至还可以和Dubbo进行优秀的整合开发

总结

SpringBoot专注于快速方便的开发单个个体的微服务

SpringCloud是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间提供,配置管理,服务发现,断路器,路由,事件总线等集成服务

SpringBoot不依赖于SpringCloud,SpringCloud依赖于SpringBoot,属于依赖关系

SpringBoot专注于快速,方便的开发单个的微服务个体,SpringCloud关注全局的服务治理框架

32、EurekaZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?

解析:

1、ZooKeeper保证的是CP,Eureka保证的是AP

ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的

Eureka各个节点是平等关系,只要有一台Eureka就可以保证服务可用,而查询到的数据并不是最新的

自我保护机制会导致

Eureka不再从注册列表移除因长时间没收到心跳而应该过期的服务

Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用)

当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性)

Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper一样使得整个注册系统瘫痪

2、ZooKeeper有Leader和Follower角色,Eureka各个节点平等

3、ZooKeeper采用过半数存活原则,Eureka采用自我保护机制解决分区问题

4、Eureka本质上是一个工程,而ZooKeeper只是一个进程

33、微服务之间是如何独立通讯的?

解析:

1、远程过程调用(RemoteProcedureInvocation)

也就是我们常说的服务的注册与发现

直接通过远程过程调用来访问别的service。

优点:简单,常见,因为没有中间件代理,系统更简单

缺点:只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应降低了可用性,因为客户端和服务端在请求过程中必须都是可用的

2、消息

使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。

优点

把客户端和服务端解耦,更松耦合

提高可用性,因为消息中间件缓存了消息,直到消费者可以消费

支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应

缺点

消息中间件有额外的复杂

34、什么是服务熔断?什么是服务降级?

解析:在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩。

为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效应就需要进行服务熔断和服务降级处理。

所谓的服务熔断指的是某个服务故障或异常一起类似显示世界中的“保险丝"当某个异常条件被触发就直接熔断整个服务,而不是一直等到此服务超时。

服务熔断就是相当于我们电闸的保险丝,一旦发生服务雪崩的,就会熔断整个服务,通过维护一个自己的线程池,当线程达到阈值的时候就启动服务降级,如果其他请求继续访问就直接返回fallback的默认值。

35、微服务的优缺点分别是什么?说下你在项目开发中碰到的坑?

解析:

优点

每一个服务足够内聚,代码容易理解

开发效率提高,一个服务只做一件事

微服务能够被小团队单独开发

微服务是松耦合的,是有功能意义的服务

可以用不同的语言开发,面向接口编程

易于与第三方集成

微服务只是业务逻辑的代码,不会和HTML,CSS或者其他界面组合

开发中,两种开发模式:前后端分离,全栈工程师

可以灵活搭配,连接公共库/连接独立库

缺点

分布式系统的负责性

多服务运维难度,随着服务的增加,运维的压力也在增大

系统部署依赖

服务间通信成本

数据一致性

系统集成测试

性能监控

以上是关于面经 - Java 中级进阶面试题的主要内容,如果未能解决你的问题,请参考以下文章

2020最新中级web前端面试题库(含详细答案,15k级别)你会几道呢?

干货丨 进阶中级Java程序员知识点汇总

一文详解:中信银行java笔试题库

一文详解:中信银行java笔试题库

一文详解:中信银行java笔试题库

修真院2019JAVA中级工程师进阶课程