在2022年3月份,当时对Springcloud做了很简单的分析,在2023年看来当初那篇文章分析的太过表面,讲述的内容也不是很全面,因此在这里重新做一次回顾,新增修改一些文章内容。
Springcloud在Springboot的基础上新增了对分布式框架的支持,如下:
Springcloud需要依赖于Springboot,因此想要玩转Springcloud,前提是对Springboot很熟悉,否则很容易对功能边界模糊不清。
Springcloud的依赖管理包这次选用的是Greenwich.SR2,依赖如下:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Greenwich.SR3version>
<type>pomtype>
<scope>importscope>
dependency>
依赖中主要有Springcloud的通用包:
除了上面三个通用包外,还支持Springcloud其它体系的依赖:
spring-cloud-netflix
spring-cloud-stream
spring-cloud-task
spring-cloud-config
spring-cloud-function
spring-cloud-gateway
spring-cloud-consul
spring-cloud-sleuth
spring-cloud-vault
spring-cloud-zookeeper
spring-cloud-security
spring-cloud-cloudfoundry
spring-cloud-bus
spring-cloud-contract
spring-cloud-aws
spring-cloud-openfeign
spring-cloud-kubernetes
spring-cloud-gcp
这些就不一一介绍了,都是一些Springcloud官方支持的依赖包,如对应功能的starter、core等包。
在Springcloudspring-cloud-context
包中的spring.factories
文件中有ApplicationListener=BootstrapApplicationListener,Springcloud就是以这个类为入口开启了Springcloud的启动流程。如下图:
当Springboot完成创建Environment对象后会发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener便是监听该事件启动Springcloud的启动流程。
从上图也能看出来Springboot和Springcloud的核心启动流程基本一致,且Springcloud大量复用了Springboot放开的接口来实现支持微服务框架。在Springcloud中会存在两个ApplicationContext
,两者为父子关系,Springcloud的ApplicationContext为父,Springboot的ApplicationContext为子。
所以从整体上来看,Springcloud是以Springboot放开的ApplicationListener接口为起点,在Springboot的基础上再搭建了一个父ApplicationContext,以这样的结构去扩展Cloud相关框架,并不影响原Springboot的流程。
Springcloud在原来Springboot的基础上新增了BootstrapConfiguration
SPI机制接口,在BootstrapApplicationListener类中完成加载,并在Springcloud的ApplicationContext刷新流程中完成Import解析。
在spring.factories文件中配置如下:
# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
EnableAutoConfiguration
自动注入类:
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfiguration
ApplicationListener
程序监听器类:
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
org.springframework.cloud.bootstrap.LoggingSystemShutdownListener,\
org.springframework.cloud.context.restart.RestartListener
EnableAutoConfiguration
自动注入类:
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.client.CommonsClientAutoConfiguration,\
org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.hypermedia.CloudHypermediaAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerClientAutoConfiguration,\
org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancerAutoConfiguration,\
org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration,\
org.springframework.cloud.commons.httpclient.HttpClientConfiguration,\
org.springframework.cloud.commons.util.UtilAutoConfiguration,\
org.springframework.cloud.configuration.CompatibilityVerifierAutoConfiguration,\
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
可以看到相对于spring-cloud-context而言自动注入类的配置项是非常多的,而且从名字也可以看出来这是用来进行服务注册、发现及负载均衡相关的。大致作用:
上面十四个都是大概的描述了其中的功能,里面用到了很多的@Autowired注解,因此如果程序后续注入了相关的实现类都会被注入,这也是为何把这个包称为springcloud微服务注册发现的抽象层,因为后续只要有相关的实现接入,便可以自动装填运行,方式比较新颖。
EnvironmentPostProcessor
环境对象后处理器:
spring.factories文件中对于EnvironmentPostProcessor选项只有一个实现配置类:
FailureAnalyzer
启动错误分析类:
spring.factories对于FailureAnalyzer也只有一个实现配置类:
Springcloud由于是在原Springboot的基础上新建了一个父ApplicationContext,因此SPI机制上会进行重复读取,导致父子两个ApplicationContext都含有一模一样的SPI实现类,SPI实现类就会执行两次。
差异对比springboot依赖如下:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
dependencies>
差异对比springcloud依赖如下:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starterartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
dependencies>
项目只有一个controller,单纯的启动springboot和springcloud时间统计表(非严谨):
次数 | springboot | springcloud |
---|---|---|
1 | 1.139 seconds (JVM running for 1.615) | 1.695 seconds (JVM running for 2.188) |
2 | 1.145 seconds (JVM running for 1.63) | 1.714 seconds (JVM running for 2.221) |
3 | 1.42 seconds (JVM running for 1.942) | 1.76 seconds (JVM running for 2.255) |
4 | 1.135 seconds (JVM running for 1.623) | 1.74 seconds (JVM running for 2.24) |
5 | 1.133 seconds (JVM running for 1.626) | 1.694 seconds (JVM running for 2.308) |
6 | 1.164 seconds (JVM running for 1.658) | 1.708 seconds (JVM running for 2.218) |
7 | 1.214 seconds (JVM running for 1.723) | 1.715 seconds (JVM running for 2.212) |
8 | 1.164 seconds (JVM running for 1.658) | 1.743 seconds (JVM running for 2.259) |
9 | 1.142 seconds (JVM running for 1.636) | 1.756 seconds (JVM running for 2.261) |
10 | 1.126 seconds (JVM running for 1.595) | 1.701 seconds (JVM running for 2.194) |
去掉最高和最低值后平均启动速度如下:
springcloud启动时间较springboot时间平均多出0.567s,即567ms,再加上多引入了包,导致JVM启动时间会延长半秒左右,因此使用springcloud会导致整个项目启动时间延迟1s左右,但这个性能消耗完全是可以忽略不计的。