Spring

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

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

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

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

Spring Cloud中Eureka Client在启动时需要从Eureka Server中下载注册表到本地进行缓存,以备进行负载均衡调用。请谈一下你对这个启动时下载注册表过程的认识。

Spring Cloud中Eureka Client在启动时需要从Eureka Server中下载注册表到本地进行缓存。这次下载属于全量下载,即要将Server端所有注册信息Applicaitons全部下载到本地并缓存。当然,若指定可以从远程Region获取,其也会通过其所连接的这个Server,将远程Region中的注册信息也全部获取到。这个过程称为获取客户端注册表。
获取“客户端注册表”最终执行的操作是,通过Jersey框架提交了一个GET请求,然后获取到的Applications实例结果。
若获取失败,其会从本地备用注册表中获取并缓存。

Eureka Client从Eureka Server中获取注册表分为两种情况,全量获取与增量获取。什么是全量获取,什么是增量获取?

Eureka Client从Eureka Server中获取注册表分为两种情况,一种是将Server中所有注册信息全部下载到当前客户端本地并进行缓存,这种称为全量获取;一种是仅获取在Server中发生变更的注册信息到本地,然后根据变更修改本地缓存中的注册信息,这种称为增量获取。当Client在启动时第一次下载就属于全量获取,而后期每30秒从Server下载一次的定时下载属于增量下载。无论是哪种情况,Client都是通过Jersey框架向Server发送了一个GET请求。只不过是,不同的获取方式,提交请求时携带的参数是不同的。

Eureka Client向Eureka Server提交的register()注册请求的情况有三种:
1) 在Client实例初始化时直接提交register()注册请求
2) 定时发送心跳时,服务端返回404,此时Client会发出registrer()注册请求
3) 定时更新Client续约信息给Server时,只要Client续约信息发生变更,其提交的就是register()注册请求

Eureka Client使用了一种限流策略,是什么策略?

Spring Cloud中Eureka Client的续约配置信息默认情况下是允许动态变更的。为了限制变更的频率,Eureka Client使用了令牌桶算法。
该算法实现中维护着一个队列,首先所有元素需要进入到队列中,当队列满时,未进入到队列的元素将丢弃。进入到队列中的元素是否可以被处理,需要看其是否能够从令牌桶中拿到令牌。一个元素从令牌桶中拿到一个令牌,那么令牌桶中的令牌数量就会减一。若元素生成速率较快,则其从令牌桶中获取到令牌的速率就会较大。一旦令牌桶中没有了令牌,则队列很快就会变满,那么再来的元素将被丢弃。

Spring Cloud中OpenFeign的FeignContext中维护着一个重要集合configurations,其是一个线程安全的map。其key-value分为两类:
1) 第一类只有一个,key是字符串“default + 当前启动类的全限定性类名”,而value为@EnableFeignClients中configuration的值;
2) 第二类可以有多个,key为当前@FeignClient的name属性名,即微服务名称,value则为每个@FeignClient的configuration的属性值。这一类key-value对会有很多,有多少的@FeignClient就会有多少的这类key-value。

Spring Cloud中OpenFeign中创建的Feign Client是一个JDK的Proxy动态代理对象,所以若要解析Feign方法的调用,可以找到JDK的Proxy生成时的InvocationHandler实例的invoke()方法,该方法是Feign方法执行后系统立即调用的方法。

原文地址:https://www.cnblogs.com/Alwaysbecoding/p/13566175.html