(一)Spring-Cloud源码分析之核心流程关系及springcloud与springboot包区别(新)

news/2024/4/25 0:25:43/文章来源:https://blog.csdn.net/Peelarmy/article/details/129182408

文章目录

  • 1. 前言
  • 2. springcloud简介
  • 3. Springcloud包简介
  • 4. Springcloud和Springboot流程关系
  • 5. Springcloud启动流程新增的功能和接口
    • 5.1 新增接口
    • 5.2 新增功能类
      • 5.2.1 spring-cloud-context包
      • 5.2.2 spring-cloud-commons包
  • 6. Springcloud实现机制带来的问题
  • 7. Springcloud和Springboot简单的性能差异对比

1. 前言

在2022年3月份,当时对Springcloud做了很简单的分析,在2023年看来当初那篇文章分析的太过表面,讲述的内容也不是很全面,因此在这里重新做一次回顾,新增修改一些文章内容。

2. springcloud简介

Springcloud在Springboot的基础上新增了对分布式框架的支持,如下:

  • 服务发现注册:Eureka、Zookeeper的starter包;
  • 配置中心:Springcloud Config,平替为流行的Nacos和Apollo;
  • 熔断降级和限流:官方的Hystrix和阿里的Sentinel;
  • 负载均衡:Ribbon+Feign组合;
  • 服务网关:Springcloud Gateway或Zuul

Springcloud需要依赖于Springboot,因此想要玩转Springcloud,前提是对Springboot很熟悉,否则很容易对功能边界模糊不清。

3. Springcloud包简介

Springcloud的依赖管理包这次选用的是Greenwich.SR2,依赖如下:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR3</version><type>pom</type><scope>import</scope>
</dependency>

依赖中主要有Springcloud的通用包:

  • spring-cloud-commons:制定微服务中的服务注册、发现、负载均衡和熔断器等功能的抽象层代码;
  • spring-cloud-context:引入spring-cloud的上下文及接入springboot的一系列插件,用以支持bootstrap文件的读取、上下文刷新等机制的引入;
  • spring-cloud-loadbalancer:负载均衡相关功能。

除了上面三个通用包外,还支持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等包。

4. Springcloud和Springboot流程关系

在Springcloudspring-cloud-context包中的spring.factories文件中有ApplicationListener=BootstrapApplicationListener,Springcloud就是以这个类为入口开启了Springcloud的启动流程。如下图:

Springcloud和Springboot流程关系图

当Springboot完成创建Environment对象后会发布ApplicationEnvironmentPreparedEvent事件,BootstrapApplicationListener便是监听该事件启动Springcloud的启动流程。

从上图也能看出来Springboot和Springcloud的核心启动流程基本一致,且Springcloud大量复用了Springboot放开的接口来实现支持微服务框架。在Springcloud中会存在两个ApplicationContext,两者为父子关系,Springcloud的ApplicationContext为父,Springboot的ApplicationContext为子。

所以从整体上来看,Springcloud是以Springboot放开的ApplicationListener接口为起点,在Springboot的基础上再搭建了一个父ApplicationContext,以这样的结构去扩展Cloud相关框架,并不影响原Springboot的流程。

5. Springcloud启动流程新增的功能和接口

5.1 新增接口

Springcloud在原来Springboot的基础上新增了BootstrapConfigurationSPI机制接口,在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
  1. PropertySourceBootstrapConfiguration:用于配置使用PropertySourceLocator接口的实现类,其作用便是根据Environment对象生成PropertySource对象,并最终保存在bootstrapProperties属性对象中;
  2. EncryptionBootstrapConfiguration:用于配置对Environment对象中的属性进行加解密;
  3. ConfigurationPropertiesRebinderAutoConfiguration:自动注入类,在前面的EnableAutoConfiguration配置项中已经有了,这里重新配置了一下,个人猜测的目的是用于重新绑定spring-cloud上下文,毕竟EnableAutoConfiguration中的配置是针对springboot上下文的;
  4. PropertyPlaceholderAutoConfiguration:引入PropertySourcesPlaceholderConfigurer类,保证springcloud上下文可以使用通配符去替换值。

5.2 新增功能类

5.2.1 spring-cloud-context包

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
  1. ConfigurationPropertiesRebinderAutoConfiguration:用于自动装填springcloud的重绑定类,用于在springcloud上下文刷新时重新绑定各个bean对象和属性;
  2. LifecycleMvcEndpointAutoConfiguration:用于自动注入EnvironmentManager类;
  3. RefreshAutoConfiguration:自动注入springcloud上下文刷新类,springcloud的RefreshScope和RefreshEventListener等刷新组建便是在这里面被注入的;
  4. RefreshEndpointAutoConfiguration:用于注入刷新Endpoint切点的自动刷新注入类;
  5. WritableEnvironmentEndpointAutoConfiguration:用于自动注入WritableEnvironmentEndpoint类。

ApplicationListener程序监听器类:

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
org.springframework.cloud.bootstrap.LoggingSystemShutdownListener,\
org.springframework.cloud.context.restart.RestartListener
  1. BootstrapApplicationListener:用于引入springcloud上下文和springcloud自定义配置类,同时也负责生成springcloud上下文对象,并将其设置为springboot的父上下文,也可以通过属性配置这个类不进行加载;
  2. LoggingSystemShutdownListener:负责清空前面设置过的Log日志信息,以避免后续的日志加载收到前面日志配置的影响;
  3. RestartListener:保存spring的上下文,以便后续在有必要的时候重启上下文。

5.2.2 spring-cloud-commons包

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而言自动注入类的配置项是非常多的,而且从名字也可以看出来这是用来进行服务注册、发现及负载均衡相关的。大致作用:

  1. CommonsClientAutoConfiguration:用来自动注册通用的客户端组件,如健康检查及Endpoint切点的组件对象;
  2. CompositeDiscoveryClientAutoConfiguration:注册用来保存多种DiscoveryClient对象类型的对象CompositeDiscoveryClient;
  3. NoopDiscoveryClientAutoConfiguration:注册一个实现了DiscoveryClient接口,用来代表基础机器信息NoopDiscoveryClient类型对象;
  4. SimpleDiscoveryClientAutoConfiguration:注册SimpleDiscoveryProperties对象及相关的其它对象,在前面注册过的NoopDiscoveryClient基础上新增SimpleDiscoveryClient类型的对象;
  5. CloudHypermediaAutoConfiguration:注册用来管理和刷新远程资源的相关对象;
  6. AsyncLoadBalancerAutoConfiguration:注册Ribbon相关的异步负载均衡相关配置类;
  7. LoadBalancerAutoConfiguration:注册Ribbon相关的同步负载均衡和重试机制相关配置类;
  8. ReactorLoadBalancerClientAutoConfiguration:用来注册@LoadBalanced注解及ReactiveLoadBalancer等负载均衡类;
  9. ReactiveLoadBalancerAutoConfiguration:为Reactor自动注入类的辅助类;
  10. ServiceRegistryAutoConfiguration:自动注入服务注册切点相关类;
  11. HttpClientConfiguration:自动注入http相关的实现类,支持okhttp和apache;
  12. UtilAutoConfiguration:注册提供通用方法的类,如InetUtilsProperties和InetUtils;
  13. CompatibilityVerifierAutoConfiguration:自动注入系统的校验类,如校验springboot版本和springcloud版本是否兼容的SpringBootVersionVerifier,以及可以保存其它校验类的可组合式CompositeCompatibilityVerifier;
  14. AutoServiceRegistrationAutoConfiguration:自动发现服务注入类,用来校验自动注入相关功能是否正常执行,如果没有则抛异常。

上面十四个都是大概的描述了其中的功能,里面用到了很多的@Autowired注解,因此如果程序后续注入了相关的实现类都会被注入,这也是为何把这个包称为springcloud微服务注册发现的抽象层,因为后续只要有相关的实现接入,便可以自动装填运行,方式比较新颖。

EnvironmentPostProcessor环境对象后处理器:

spring.factories文件中对于EnvironmentPostProcessor选项只有一个实现配置类:

  • HostInfoEnvironmentPostProcessor:用来在环境对象中生成springCloudClientHostInfo属性信息,这里面包括了本机器的IP地址和主机名称信息,用来提供机器的身份证明。

FailureAnalyzer启动错误分析类:

spring.factories对于FailureAnalyzer也只有一个实现配置类:

  • CompatibilityNotMetFailureAnalyzer:用来组织程序发生错误时的输出内容。

6. Springcloud实现机制带来的问题

Springcloud由于是在原Springboot的基础上新建了一个父ApplicationContext,因此SPI机制上会进行重复读取,导致父子两个ApplicationContext都含有一模一样的SPI实现类,SPI实现类就会执行两次。

7. Springcloud和Springboot简单的性能差异对比

文章目录

  • 1. 前言
  • 2. springcloud简介
  • 3. Springcloud包简介
  • 4. Springcloud和Springboot流程关系
  • 5. Springcloud启动流程新增的功能和接口
    • 5.1 新增接口
    • 5.2 新增功能类
      • 5.2.1 spring-cloud-context包
      • 5.2.2 spring-cloud-commons包
  • 6. Springcloud实现机制带来的问题
  • 7. Springcloud和Springboot简单的性能差异对比

springboot依赖如下:

<parent><!-- springboot的核心包 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version>
</parent><dependencies><!-- springboot的web启动包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies>

springcloud依赖如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version>
</parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter</artifactId><version>2.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency>
</dependencies>

项目只有一个controller,单纯的启动springboot和springcloud时间统计表(非严谨):

次数springbootspringcloud
11.139 seconds (JVM running for 1.615)1.695 seconds (JVM running for 2.188)
21.145 seconds (JVM running for 1.63)1.714 seconds (JVM running for 2.221)
31.42 seconds (JVM running for 1.942)1.76 seconds (JVM running for 2.255)
41.135 seconds (JVM running for 1.623)1.74 seconds (JVM running for 2.24)
51.133 seconds (JVM running for 1.626)1.694 seconds (JVM running for 2.308)
61.164 seconds (JVM running for 1.658)1.708 seconds (JVM running for 2.218)
71.214 seconds (JVM running for 1.723)1.715 seconds (JVM running for 2.212)
81.164 seconds (JVM running for 1.658)1.743 seconds (JVM running for 2.259)
91.142 seconds (JVM running for 1.636)1.756 seconds (JVM running for 2.261)
101.126 seconds (JVM running for 1.595)1.701 seconds (JVM running for 2.194)

去掉最高和最低值后平均启动速度如下:

  • springboot:平均启动时间为1.1545s
  • springcloud:平均启动时间为1.7215

springcloud启动时间较springboot时间平均多出0.567s,即567ms,再加上多引入了包,导致JVM启动时间会延长半秒左右,因此使用springcloud会导致整个项目启动时间延迟1s左右,但这个性能消耗完全是可以忽略不计的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73132.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出C++ ——手撕红黑树

文章目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树的插入操作五、红黑树的验证五、红黑树的删除六、红黑树与AVL树的比较七、红黑树的应用八、红黑树模拟实现一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存…

Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载

Typecho 简介Typecho 是一个简单、强大的轻量级开源博客平台&#xff0c;用于建立个人独立博客。它具有高效的性能&#xff0c;支持多种文件格式&#xff0c;并具有对设备的响应式适配功能。Typecho 相对于其他 CMS 还有一些特殊优势&#xff1a;包括可扩展性、不同数据库之间的…

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;实现二级回复的入库操作 1.1 两个子组件&#xff08;comment-item和comment-frame&#xff09;与父组件reply之间的属性传值 comment-item&#xff1a; props: {item: {type: Object,default () {return {}}}},comment-frame&#xff1a; props: {commentObj: {…

儿童饰品发夹发卡出口美国办理什么认证?

亚马逊美国站上传新产品&#xff0c;很多时候都是需要类目审核的&#xff0c;后台给出要求提供认证&#xff0c;产品类目不同&#xff0c;所需要提供的认证证书是不一样&#xff0c;儿童产品需要提交的是CPC认证&#xff0c;玩具&#xff0c;母婴用品&#xff0c;儿童书包&…

PDF文件怎么转图片格式?转换有技巧

PDF文件有时为了更美观或者更直观的展现出效果&#xff0c;我们会把它转成图片格式&#xff0c;这样不论是归档总结还是存储起来都会更为高效。有没有合适的转换方法呢&#xff1f;这就来给你们罗列几种我个人用过体验还算不错的方式&#xff0c;大家可以拿来参考一下哈。1.用电…

Apifox = Postman + Swagger + Mock + JMeter

目录 可视化API设计 高效 & 零学习成本 可复用的“数据模型” 遵循 OpenAPI(Swagger) 规范 可导入 Swagger 等 20 数据格式 具体使用尝鲜 多项目管理 支持多环境切换 支持IDEA、浏览器、桌面应用 Idea插件 公共API hub库 如题&#xff1a;一款非常好用的API管理测…

Wi-Fi 7技术揭秘

引言 2022年4月7日&#xff0c;紫光股份旗下新华三集团全球首发企业级智原生Wi-Fi 7 AP新品 WA7638和WA7338。仅在同年的6月15日&#xff0c;在东京举行的第29届日本网络通信展览会&#xff08;Interop Tokyo 2022&#xff0c;简称Interop展&#xff09;中&#xff0c;WA7638就…

D1s RDC2022纪念版开发板开箱评测及点屏教程

作者new_bee 本文转自&#xff1a;https://bbs.aw-ol.com/topic/3005/ 目录 芯片介绍开发板介绍RT-Smart用户态系统编译使用感想引用 1. 芯片介绍 RISC-V架构由于其精简和开源的特性&#xff0c;得到业界的认可&#xff0c;近几年可谓相当热门。操作系统方面有RT-Thread&am…

Firebase常用功能和官方Demo简介

一、Firebase简介Firebase刚开始是一家实时后端数据库创业公司&#xff0c;它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来&#xff0c;用户可以在更方便地使用Firebase的同时&#xff0c;结合Google的云服务。现在的Firebase算是谷歌旗下的…

模拟信号4-20mA /0-5V/0-75mV/0-100mV转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a;● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出● 采用12位AD转换器&#xff0c;测量精度优于0.1%● 通过RS-485/232接口可以程控校准模块精度● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC● 可靠性高&#xff0c;编程…

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(二)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路

1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…

CentOS 8利用Apache安装部署下载服务器

1&#xff1a;部署的目的是做一个类似下面开源镜像网站&#xff0c;把一些软件或者资料上传到服务器上面&#xff0c;减少用户在互联网上下载资料&#xff0c;提高效率&#xff0c;减少病毒。 2&#xff1a;使用下面的命令配置本机的IP地址主机名等信息。后期使用IP地址进行访问…

11技术太卷我学APEX-数据加载

11技术太卷我学APEX-数据加载 0 所谓的数据加载 就是导入数据到数据库表中&#xff0c;本示例就采用Excel导入数据到《技术太卷我学APEX》的apex_learn表。表结构大概是这样的 CREATE TABLE "APEX_LEARN" ( "P_ID" NUMBER(17,0) NOT NULL ENABLE, &quo…

【Elasticsearch】安装配置与使用

一、下载与安装Elasticsearch下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch#ga-release前端管理界面&#xff1a;https://github.com/mobz/elasticsearch-head这两个文件都是解压即可。二、配置与启动1.elasticsearch6以上的版本已经内置jdk&#xf…

2023年Java进阶架构师的必备思维导图,让你少走弯路!

架构师是什么&#xff1f;要做什么&#xff1f; 架构师 &#xff1a;是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。架构师不是一个人&#xff0c;他需要建立高效的体系&#xff0c;带领团队去攻城略地&#xff0c;在规定的时间内…

一文速学-Adaboost模型算法原理以及实现+Python项目实战

目录 前言 一、Adaboost算法概述 二、Adaboost模型原理 类推 计算原理 特点 适应较小量数据集&#xff0c;训练时间长 三、Python实例运用 AdaBoostClassifier分类 参数 实例实现分类 导入数据集 划分数据集 训练模型 评估算法 模型效果 前言 集成学习的方法在全…

[NOIP2002 普及组] 过河卒

题目描述&#xff1a; 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…

干测试5年,经常被开发看不起,现在总算证明了自己····

测试不止是点点点 我感觉我是一个比较有发言权的人吧&#xff0c;我在测试行业摸爬滚打5年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家…

利用global mapper导出等高线 在sketch up制作三维模型

为了做一个地形模型&#xff0c;绞尽脑汁实验了所有能查到的教程&#xff0c;在免费的基础上总体尝试失败&#xff0c;一是需要花钱的插件例如bitmap to mesh&#xff0c;即便能下载到&#xff0c;也是无法安装使用。如果你能下到且安装上&#xff0c;别忘了分享给我。 二是有的…