文章目录
  1. 1. 功能属性
  2. 2. 主流程

spring cloud commons模块相比其他单独的服务治理模块,感觉更值得分析学习,这块的东西又是spring哲学的一种体现了;

Provide choice at every level. Spring lets you defer design decisions as late as possible. For example, you can switch persistence providers through configuration without changing your code. The same is true for many other infrastructure concerns and integration with third-party APIs

作为高度集中化接口,其他模块只要实现相关接口就可以了。找到主流程和暴露的接口,再看下spring的生命周期,spring cloud就没撒好分析了。

功能属性

spring cloud commons提供了两个基础组件:

  • Spring Cloud Context:主要提供启动上下文接口、刷新事件监听、环境、健康检查、日志相关类

  • Spring Cloud Commons:包含如下几个模块的接口:

服务注册:org.springframework.cloud.serviceregistry

服务发现:org.springframework.cloud.discovery

负载均衡:org.springframework.cloud.loadbalancer

断路器: org.springframework.cloud.circuitbreaker

主流程

由于spring cloud都是基于spring boot的,就像spring boot基于spring一样,作为高度集成的框架,必定会暴露一些扩展接口给用户,这里就需要先知道spring boot的启动流程,以web应用为例,如下图:
springboot-bootstrap

  • 配置中心

由于配置属性需要在容器刷新之前设置,所有参考org.springframework.boot.SpringApplication.prepareContext中的applyInitializers方法,spring cloud commons实现ApplicationContextInitializer该接口的就那么几个,可以推断出,入口即为PropertySourceBootstrapConfiguration.initialize(),如果想要扩展自己的配置中心,PropertySourceLocator即可,如果nacos的NacosPropertySourceLocator。关于RefreshScope动态配置刷新入口,spring cloud提供了RefreshAutoConfiguration配置,注册了RefreshEventListener,只要集成的配置中心组件触发了RefreshEvent就会执行RefreshEventListener#onApplicationEvent,如NacosContextRefresher.registerNacosListener添加了RefreshEvent事件,接着ContextRefresher.refresh()内部逻辑会触发RefreshScope.refreshAll把缓存里面的配置清理了,如果是添加了@RefreshScope注解的bean,AbstractBeanFactory.doGetBean获取bean的时候,走的Scope的get方法,由RefreshScope的父类GenericScope实现了重新获取bean的逻辑,动态配置更新如下图所示:
refresh

  • 服务注册

从注册包中org.springframework.cloud.client.serviceregistry可以看出,spring cloud提供了注册接口ServiceRegistry,由AbstractAutoServiceRegistration触发调用,参考如下时序图:
register
AutoServiceRegistrationAutoConfiguration自动校验了AutoServiceRegistration不能为空,所以第三方注册中心需要继承AbstractAutoServiceRegistration,该类管理了注册的生命周期,注册服务接口ServiceRegistry,注册实例接口Registration,都抽象定义出来了,还需要第三方实现,如NacosAutoServiceRegistration、NacosRegistration。如果需要引入服务注册,工程main函数增加EnableDiscoveryClient注解就可以自动引入AutoServiceRegistrationAutoConfiguration配置了。

  • 服务发现

DiscoveryClient是服务发现的入口接口,只要实现该类就可以了。已nacos为例,了解下主流程。从commons的spring.factories可以看到自动注册了CompositeDiscoveryClientAutoConfiguration,会遍历去轮询注册的服务,然后加载到本地缓存。主流程图如下:
discovery

  • 负载均衡

Spring Tips: Spring Cloud Loadbalancer,spring官方博客声明已经废弃Netflix的Ribbon了,因为spring作了兼容处理,使用commons里面的Loadbalancer需要配置spring.cloud.loadbalancer.enabled=false。已nacos为例,如上图所示,使用RestTemplate执行主流程。LoadBalancerAutoConfiguration自动装配的时候,如果注入的RestTemplate添加了注解LoadBalanced,LoadBalancerAutoConfiguration#loadBalancedRestTemplateInitializerDeprecated会遍历restTemplates,由LoadBalancerAutoConfiguration.LoadBalancerInterceptorConfig#restTemplateCustomizer方法添加LoadBalancerInterceptor拦截器,所有请求都会走该拦截器,最终由NacosDiscoveryClient获取服务实例。

  • 断路器

org.springframework.cloud.client.circuitbreaker提供了4个重要的接口:
CircuitBreakerFactory(ReactiveCircuitBreakerFactory):用于创建CircuitBreaker(Reactive-CircuitBreaker)熔断器;
CircuitBreaker(ReactiveCircuitBreaker):用户端熔断器接口,惯用语熔断或失败后执行fallback逻辑;
Customizer:自定义操作,给CircuitBreakerFactory配置默认的配置数据;
ConfigBuilder:构建配置相关的内容,比如,配置时间窗口、错误阈值。
已sentinel为例,通过SentinelCircuitBreakerAutoConfiguration自动装配CircuitBreakerFactory之后,就可以直接创建CircuitBreaker进行熔断货流量控制相关操作。

文章目录
  1. 1. 功能属性
  2. 2. 主流程