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

news2024/11/29 4:34:05

文章目录

  • 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简单的性能差异对比

差异对比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.coloradmin.cn/o/367495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis】映射器配置|注解完成CRUD(三)

&#x1f697;MyBatis学习第三站~ &#x1f6a9;起始站&#xff1a;MyBatis概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 上一篇我们学习了如何使用Mapper代理开发&#xff0c;核心配置文件&#xff0c;但却…

OnlyOffice验证(一)DocumentServer编译验证

OnlyOffice验证&#xff08;一&#xff09;DocumentServer编译验证 资源准备 Ubuntu16.04桌面版 验证用的版本[ubuntu-16机接上传ubuntu.04.7-desktop-amd67131.iso&#xff0c;&#xff08;别用高版本&#xff01;试过20.04耽误两三天&#xff0c;差点放弃了&#xff09;&am…

javaee之node.js与es6

问题1&#xff1a;在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2&#xff1a;response.end()作用 在Web开发中&#xff0c;浏览器端的请求到达服务器进行处理的时候&#xff0c;Response.End的作用就是让request执行到此结束&#xff0c;输出到客户…

移掉K位数字-力扣402-java贪心策略

一、题目描述给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。示例 1 &#xff1a;输入&#xff1a;num "1432219", k 3输出&#xff1a;"1219&q…

Vue实战第5章:发布Vue工程到github静态页面

前言 本篇在讲什么 简单讲解关于Vue发布github静态页面相关的内容 本篇适合什么 适合初学Vue的小白 适合想要自己搭建网站的新手 本篇需要什么 对Html和css语法有简单认知 对Vue有简单认知 Node.js(博主v18.13.0)的开发环境 Npm(博主v8.19.3)的开发环境 Vue(博主v5.…

< elementUI组件样式及功能补全: 实现点击steps组件跳转对应步骤 >

文章目录&#x1f449; 前言&#x1f449; 一、效果演示&#x1f449; 二、点击steps跳转效果实现&#x1f449; 三、实现案例往期内容 &#x1f4a8;&#x1f449; 前言 在 Vue elementUi 开发中&#xff0c;elementUI中steps步骤条组件只提供了change方法&#xff0c;并未提…

【Database-03】从 MySQL 迁移到 达梦数据库(DM 8)

1、环境 源数据库 MySQL 8.30 目标数据库 DM 8 操作系统 Centos 9 Steam 迁移工具 DM 数据迁移工具 (DM DTS) 2、开始迁移 2.1、打开DM数据迁移工具 在新建工程对话框中填写工程名和工程描述信息&#xff0c;点击【确定】按钮&#xff0c;成功添加了一个工程。 2.2、新建迁…

海思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的参考,需要自己…

[黑马程序员SSM框架教程] Spring-11-setter注入

思考&#xff1a;向一个类中传递数据要几种&#xff1f; set方法构造方法 思考&#xff1a;依赖注入描述了在容器中建立bean与bean之间依赖关系的过程&#xff0c;如果bean运行需要数字或字符呢 引用类型简单类型&#xff08;基本数据类型和字符串&#xff09; 注入方式&#x…

软考学习笔记(题目知识记录) 2023.2.24

答案为 概要设计阶段 本题涉及软件工程的概念 软件工程的任务是基于需求分析的结果建立各种设计模型&#xff0c;给出问题的解决方案 软件设计可以分为两个阶段&#xff1a; 概要设计阶段和详细设计阶段 结构化设计方法中&#xff0c;概要设计阶段进行软件体系结构的设计&…

webpack基础学习,各个loader和plugin的具体配置

一、邂逅Webpack Webpack是什么 webpack是一个静态的模块化打包工具&#xff0c;为现代的JavaScript应用程序&#xff1b; 打包bundler&#xff1a;webpack可以将帮助我们进行打包&#xff0c;所以它是一个打包工具 静态的static&#xff1a;这样表述的原因是我们最终可以将…

(三十)大白话MySQL的redo log buffer中的缓冲日志,到底什么时候可以写入磁盘?

之前我们给大家讲解了一下redo log buffer的缓冲机制&#xff0c;大家现在应该都知道了&#xff0c;redo log在写的时候&#xff0c;都是一个事务里的一组redo log&#xff0c;先暂存在一个地方&#xff0c;完事儿了以后把一组redo log写入redo log buffer。 写入redo log buf…

C++ 动态内存管理

目录 1. C/C内存分布 练习 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 4.1 operator new与operator delete函数&#xff08…

跨境多账号管理教程分享:解决多账号管理混乱问题

如今&#xff0c;跨境电商卖家拥有多平台多账号已经成为常态&#xff0c;但很多人找东哥咨询的担忧都是要如何有效地管理这么多账号&#xff0c;因为如果账号过多&#xff0c;容易被关联&#xff0c;进而影响账号安全。如果你也刚好有这个烦恼&#xff0c;那找东哥真的就是找对…

HEVC 编码速率控制

视频传输带宽通常都会受到一定的限制&#xff0c;为了在满足通信带宽和传输时延限制的情况下有效传输视频数据&#xff0c;保证视频业务的播放质量&#xff0c;需要对视频编码过程进行速率控制&#xff0c;所谓速率控制&#xff0c;就是通过选择一系列编码失真尽量小&#xff0…

「TCG 规范解读」初识 TPM 2.0 库续三

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

导航定位状态评估专题:“特征”离群点判断与剔除 | 定位状态完整性监控

1、前言&#xff1a;经典状态估计中协方差的计算能准确反映机器人状态的完整性吗&#xff1f;在每一次机器人执行各种目的的自动导航任务时&#xff0c;拥有高精度且可靠状态估计的能力可以说是机器人顺利、安全完成任务的必要条件之一。简而言之&#xff0c;机器人状态估计算法…

Docker Compose

为什么需要使用Docker ComposeDocker Compose 容器编排技术1、现在我们有一个springboot项目&#xff0c;需要依赖Redis、mysql、nginx。如果使用docker原生部署的话&#xff0c;则需要安装Redis、mysql、nginx容器&#xff0c;才可以启动我们springboot项目&#xff0c;这样的…

Flink-CEP理论与实践

一.什么是Flink cepCEP 是复杂事件处理&#xff08;Complex Event Processing&#xff09;的缩写&#xff0c;是一种处理实时数据流的技术。它可以在大规模数据流中实时识别出与预定义的模式匹配的事件&#xff0c;并在匹配到事件时采取相应的措施。CEP 技术的应用范围非常广泛…

Web前端:为什么要雇佣全栈开发人员

全栈开发人员是任何软件开发项目的宝贵专家。但是&#xff0c;在某些情况下&#xff0c;它们是企业最需要的。雇佣一名全栈开发人员来监督你的项目&#xff0c;从构思到启动&#xff0c;再到以后&#xff0c;有无数的好处。1.出色的web/应用程序开发人员全栈web开发人员有经验&…