0
点赞
收藏
分享

微信扫一扫

微服务框架核心源码深度解析面试题_1

mm_tang 2022-05-03 阅读 88

1.Q 01

你曾阅读过 Spring Cloud 的源码吗?我们知道,Spring Cloud 是通过 Spring Boot 集成了很多第三方框架构成的。现在准备解析 Spring Cloud 中某子框架的源码,若还没有找到合适的入手位置,那么从哪里开始解析可能是一个不错的选择。请谈一下你的认识。

RA:
我自己曾阅读过 Spring Cloud 中的 Eureka、OpenFeign、Ribbon 等的源码。对于一个
未曾阅读过的子框架源码,我认为从自动配置类开始解析可能是一个不错的选择。

我们知道 Spring Cloud 是通过 Spring Boot 将其它第三方框架集成进来的。Spring Boot 最
大的特点就是自动配置,我们可以通过导入相关 Starter 来实现需求功能的自动配置、相关
核心业务类实例的创建等。也就是说,核心业务类都是集中在自动配置类中的。所以从这里
下手分析应该是个不错的选择。

那么从哪里可以找到这个自动配置类呢?从导入的 starter 依赖工程的 META-INF 目录中
的 spring.factory 文件中可以找到。该文件的内容为 key-value 对,查找 EnableAutoConfiguration的全限定性类名作为 key 的 value,这个 value 就是我们要找到的自动配置类。

2.Q 02

@EnableConfigurationProperties 注解对于 Starter 的定义很重要,请谈一上你对这个
注解的认识。

RA:
@EnableConfigurationProperties 注解在 Starter 定义时主要用于读取 application.yml 配
置文件中相关的属性,并封装到指定类型的实例中,以备 Starter 中的核心业务实例使用。

具体来说,它就是开启了对@ConfigurationProperties 注解的 Bean 的自动注册,注解到
Spring 容器中。这种 Bean 有两种注册方式:在配置类使用@Bean 方法注册,或直接使用该注解的 value 属性进行注册。若在配置类中使用@Bean 注册,则需要在配置类中定义一个@Bean 方法,该方法的返回值为“使用@ConfigurationProperties 注解标注”的类。若直接
使用该注解的 value 属性进行注册,则需要将这个“使用@ConfigurationProperties 注解标注”的类作为 value 属性值出现即可。

3.Q 03

Spring Boot 中定义了很多条件注解,这些注解一般用于对配置类的控制。在这些条
件注解中有一个@ConditionalOnMissingBean 注解,你了解过嘛?请谈一下你对它的认识。

RA:
@ConditionalOnMissingBean 注解是 Spring Boot 提供的众多条件注册中的一个。其表
示的意义是,当容器中没有指定名称或指定类型的 Bean 时,该条件为 true。不过,这里需
要强调一点的是,这里要查找的“容器”是可以指定的。通过 search 属性指定。其 search
的范围有三种:仅搜索当前配置类容器;搜索所有层次的父类容器,但不包含当前配置类容
器;搜索当前配置类容器及其所有层次的父类容器,这个是默认搜索范围。

在这里插入图片描述

4.Q 04

Spring Cloud 中默认情况下对于 Eureka Client 实例的创建中,@RefreshScope 注解是
比较重要的,请谈一下你对这个注解的认识。

RA:
@RefreshScope 注解是 Spring Cloud 中定义的一个注解。该注解用于配置类,可以添
加在配置类上,也可以添加在@Bean 方法上。其表示的意思是,该@Bean 方法会以多例的形式生成会自动刷新的 Bean 实例这种方式就等价于在 Spring的 xml 配置文件中指定<bean/>标签的 scope 属性值为 refresh。当然,若一个配置类上添加了该注解,则表示该配置类中的所有@Bean 方法创建的实例都是@RefreshScope 的。

在这里插入图片描述

5.Q 05

Spring Cloud 中默认情况下对于 Eureka Client 实例的创建是在 EurekaClient 的自动配
置类中通过@Bean方法完成的。但在源码中,这个@Bean方法上同时出现了@RefreshScope、@ConditionalOnMissionBean,与@Lazy注解,从这些注解的意义来分析,是否存在矛盾呢?它们联合使用又是什么意思呢?请谈一下你的看法。

在这里插入图片描述
RA:
@RefreshScope 注解是 Spring Cloud 中定义的一个注解。其表示的意思是,该@Bean 方
法会以多例的形式生成会自动刷新的 Bean 实例。

@ConditionalOnMissionBean 注解表示的意思是,只有当容器中没有@Bean 要创建的实
例时才会创建新的实例,即这里创建的@Bean 实例是单例的。

@Lazy 注解表示延迟实例化。即在当前配置类被实例化时并不会调用这里的@Bean 方
法去创建实例,而是在代码执行过程中,真正需要这个@Bean 方法的实例时才会创建。
这三个注解的联用不存在矛盾,其要表达的意思是,这个@Bean 会以延迟实例化的形
式创建一个单例的对象,而该对象具有自动刷新功能。

6.Q 06

Spring Cloud 中大量地使用了条件注解,其中@ConditionalOnRefreshScope 注解对于
Eureka Client 的创建非常重要。请谈一下你对这个注解的认识。

RA:

在这里插入图片描述

该注解不同于 Spring Boot 中的一般性注解的是,其是一个复合条件注解,其复合的条件有三个:

  • RefreshScope
  • 在容器中要具有 RefreshAutoConfiguration 类的实例
  • 指定的 eureka.client.refresh.enable 属性值为 true。不过,其缺省值就是 true。

只有当这个复合注解中的三个条件均成立时,@ConditionalOnRefreshScope 注解才满足
条件。此时才有可能会调用创建 Eureka Client 的@Bean 方法。所以,该注解对于 Eureka Client的创建非常重要。

7.Q 07

另一个注解@ConditionalOnMissingRefreshScope

RA:
这个或的关系是通过让一个复合条件类继承自一个能够表示或关系的复合条件父类
AnyNestedCondition 实现的。这样的话,这个复合条件类中定义的多个内部条件类中,只要一个匹配上,那么这个复合条件类就算匹配上了。

在这里插入图片描述

8.Q 08

Spring Cloud 中 Eureka Client 的源码中有一个非常重要的类 Applications,其被称为
客户端注册表。请谈一下你对它的认识。

RA:
Applications 类实例中封装了来自于 Eureka Server 的所有注册信息,通常称其为“客 户端注册表”。只所以要强调“客户端”是因为,服务端的注册表不是这样表示的,是一个
Map。

该类中封装着一个非常重要的 Map 集合,key 为微服务名称,而 Value 则为 Application
实例。Application类中封装了一个 Set 集合,集合元素为“可以提供该微服务的所有主机的 InstanceInfo”。也就是说,Applications 中封装着所有微服务的所有提供者信息

9.Q 09

Eureka 源码中 InstanceInfo 类中具有两个最终修改时间戳,这两个时间戳对于 Eureka
的 Server 端与 Client 端源码的理解都比较重要。这两个时间戳你了解过吗?若了解过,请谈一下你对它们的认识。

RA:
InstanceInfo 实例中封装着一个 Eureka Client 的所有信息,其就可以代表了一个 Eureka
Client。其封装的两个最终修改时间戳分别为 lastDirtyTimestamp/ lastUpdatedTimestamp。

  • lastDirtyTimestamp:记录 intance 在 Client 被修改的时间。该修改会被传递到 Server 端。
  • lastUpdatedTimestamp:记录 intance 状态在 Server 端被修改的时间。

10.Q 10

Eureka 源码中 InstanceInfo 类中具有两个状态属性,是哪两个

RA:
status 与 overriddenStatus

  • status 就是当前 Client 的工作状态。只有在 Server 端注册表中该 Client 的状态为 UP 时,其才会被其它服务发现,才可对外提供提供服务。
  • overriddenStatus 是在 Client 提交注册请求与 renew 续约请求时用于计算当前 Client 在Server 端的 Status 状态的。

11.Q 11

Spring Cloud 中 Eureka Client 与 Eureka Server 的通信,及 Eureka Server 间的通信是
如何实现的?请简单介绍一下。

RA:

Spring Cloud 中 Eureka Client 与 Eureka Server 的通信,及 Eureka Server 间的通信,均
采用的是 Jersey 框架。

Jersey 框架是一个开源的 RESTful 框架,实现了 JAX-RS 规范。该框架的作用与 SpringMVC是相同的,其也是用户提交 URI 后,在处理器中进行路由匹配,路由到指定的后台业务。这个路由功能同样也是通过处理器完成的,只不过这里的处理器不叫Controller,而叫Resource

举报

相关推荐

0 条评论