专栏目录
31. FeignClient 实现断路器以及线程隔离限流的思路 5.所有项目的parent与spring-framework-common说明 19.Eureka的服务端设计与配置 16.Eureka架构和核心概念 36. 验证断路器正确性 28.OpenFeign的生命周期-进行调用 4.maven依赖回顾以及项目框架结构 40. spock 单元测试封装的 WebClient(上) 38. 实现自定义 WebClient 的 NamedContextFactory 1. 背景 37. 实现异步的客户端封装配置管理的意义与设计 35. 验证线程隔离正确性 29.Spring Cloud OpenFeign 的解析(1) 41. SpringCloudGateway 基本流程讲解(2) 44.避免链路信息丢失做的设计(1) 14.UnderTow AccessLog 配置介绍 15.UnderTow 订制 40. spock 单元测试封装的 WebClient(下) 17.Eureka的实例配置 7.从Bean到SpringCloud 6.微服务特性相关的依赖说明 12.UnderTow 简介与内部原理 11.Log4j2 监控相关 23.订制Spring Cloud LoadBalancer 21.Spring Cloud LoadBalancer简介 20. 启动一个 Eureka Server 集群 22.Spring Cloud LoadBalancer核心源码 24.测试Spring Cloud LoadBalancer 30. FeignClient 实现重试 8.理解 NamedContextFactory 43.为何 SpringCloudGateway 中会有链路信息丢失 41. SpringCloudGateway 基本流程讲解(1) 39. 改造 resilience4j 粘合 WebClient 44.避免链路信息丢失做的设计(2) 18.Eureka的客户端核心设计和配置 27.OpenFeign的生命周期-创建代理 42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷 25.OpenFeign简介与使用 10.使用Log4j2以及一些核心配置 26.OpenFeign的组件 33. 实现重试、断路器以及线程隔离源码 13.UnderTow 核心配置 32. 改进负载均衡算法 3.Eureka Server 与 API 网关要考虑的问题 45. 实现公共日志记录 9.如何理解并定制一个Spring Cloud组件 2.微服务框架需要考虑的问题 34.验证重试配置正确性

7.从Bean到SpringCloud

干货满满张哈希
• 阅读 945

7.从Bean到SpringCloud

本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~

在理解 Spring Cloud 之前,我们先了解下 Spring 框架、Spring Boot、Spring Cloud 这三者的关系,从一个简单的 Bean,是如何发展出一个具有微服务特性的 Spring Cloud 的呢?

7.从Bean到SpringCloud

Spring bean 是 Spring 框架在运行时管理的对象。Spring bean 是任何Spring应用程序的基本构建块。你编写的大多数应用程序逻辑代码都将放在Spring bean 中。之后我们就用 Bean 来简称 Spring bean

7.从Bean到SpringCloud

BeanFactory 是 Spring 容器的核心,是一个管理着所有 Bean 的容器。通常情况下,BeanFactory 的实现是使用懒加载的方式,这意味着 Bean 只有在我们通过 getBean() 方法直接调用获取它们时才进行实例化

7.从Bean到SpringCloud

ApplicationContext 在 BeanFactory 的基础上,增加了:

  • 资源定位与加载,基于 ResourcePatternResolver(其实就是带通配符的 ResourceLoader),用来定位并加载各种文件或者网络资源
  • 所处环境,基于 EnvironmentCapable。每个 ApplicationContext 都是有 Environment 的,这个 Environment,包括 Profile 定义还有 Properties。Profile 配置是一个被命名的、bean 定义的逻辑组,这些 bean 只有在给定的 profile 配置激活时才会注册到容器。Properties 是 Spring 的属性组,这些属性可能来源于 properties 文件、JVM properties、system环境变量、JNDI、servlet context parameters 上下文参数、专门的 properties 对象,Maps 等等。
  • Bean 的初始化
  • 更加完整的 Bean 生命周期,包括 BeanPostProcessor 以及 BeanFactoryPostProcessor 的各种处理
  • 国际化,核心类MessageSource
  • 事件发布,基于 ApplicationEventPublisher:将 ApplicationEvent 或者其他类型的事件,发给所有的 Listener

可以理解为 ApplicationContext 内部包含了一个 BeanFactory,并增加了其他的组件,实现了更丰富的功能,并且,与 BeanFactory 懒加载的方式不同,它是预加载,所以,每一个 Bean 都在 ApplicationContext 启动之后实例化。

7.从Bean到SpringCloud

在 ApplicationContext 的基础上,Spring 框架引入了很多特性。其中最常见的就是 Spring Web 程序。在过去,Spring Web 应用程序被嵌入到 servlet 容器中运行,大多数的企业应用都是在 servlet 容器上配置并部署运行的。这对于开发人员来说,又增加了关于对应 servlet 容器的学习曲线,这包括:

  • web.xml 和其他面向 servlet 的配置概念
  • .war 文件目录结构
  • 不同容器的特定配置(例如暴露端口配置,线程配置等等)
  • 复杂的类加载层次
  • 在应用程序之外配置的监控管理相关设施
  • 日志相关
  • 应用程序上下文配置等等

以上配置不同容器并不统一,开发者需要在知道 spring 相关配置的基础上,还要了解容器这些配置特性。这些复杂的配置特性导致学习门槛变高,并且随着技术发展掌握 Servlet 原理的开发者越来越少了。在企业应用开发的时候,应用程序框架越简单,开发人员就越有可能采用该框架。于是,Mike Youngstrom 提出 Improved support for 'containerless' web application architectures,意图通过内置 Servlet 容器以及预设加载某些类组成特定的 ApplicationContext,来简化 Spring 应用开发的配置。

Spring Boot,在 ApplicationContext 的基础上,实现了 Spring Boot 特有的 ApplicationContext,并通过添加不同 ApplicationEvent 的 Listener 实现了特有的生命周期配置SPI 加载机制(spring.factoriesapplication.properties),在此基础上进而实现了如下功能:

  1. 内置 servlet 容器,提供了容器的统一抽象,即 WebServer。目前包括:Tomcat(TomcatWebServer),Jetty(JettyWebServer),Undertow(UndertowWebServer),Netty(NettyWebServer)
  2. 不同 servlet 容器的配置都可以用相同的 key 在 application.yml 中配置。例如暴露端口不用再在不同的 servlet 容器中配置,而是直接在 application.yml 中配置 server.port 即可。
  3. 不再需要构造 war 包部署到 servlet 容器中,而是直接打包成一个 jar 包直接运行。
  4. 用户不用关心 ApplicationContext 的创建与管理,而是可以直接使用。
  5. 只存在一个 ClassLoader,而不是像 servlet 容器那样有独立的 ClassLoader

7.从Bean到SpringCloud

Spring Cloud 在 Spring Boot 的基础上,增加微服务相关组件的接口与实现,不同的 Spring Cloud 体系组件接口与实现不同。但是公共的组件接口在 spring-cloud-commons 这个项目中,其中关于微服务组件的接口包括:

  • 服务注册接口
  • 服务发现接口
  • 负载均衡接口
  • 断路器接口

实现这些接口的组件,会基于 Spring Cloud 的 NamedContextFactory,对于不同微服务的调用或者控制,以微服务名称区分,产生不同的子 ApplicationContext。对于这个 NamedContextFactory,我们这个系列会专门有一节进行分析。

7.从Bean到SpringCloud

我们这一节梳理清楚了从 Bean 到 BeanFactory,在 BeanFactory 基础上封装的 ApplicationContext,以及主要基于注解的 ApplicationContext 以及 Spring factory SPI 的 Spring Boot,以及在 Spring Boot 基础上增加微服务抽象的 Spring Cloud 的这一系列关系。接下来我们会详细分析下 Spring Cloud 中很重要的抽象 - NamedContextFactory

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

7.从Bean到SpringCloud

点赞
收藏
评论区
推荐文章

暂无数据