Spring Cloud的那些组件和功能,get到了吗

Spring Cloud 是 Spring 技术栈生态很重要的一部分,面向大型网站服务端的开发和架构设计,它以 Spring/SpringBoot 为基础,提供的一系列组件规范和具体实现。

一、概述

Spring Cloud 提供了用于更快速构建分布式系统的基础规范(例如配置中心、服务发现、熔断器等)。基于 Spring Cloud 规范可以快速实现这些组件和功能,我们常用的分布式系统框架实现方案有以下三种:

  • Spring Cloud Netflix(停止维护)
  • Spring Cloud Alibaba
  • Spring Cloud Official(官方组件)

上述实现方案按技术更新时间排序。

文章教程都是基于 Spring Cloud Hoxton.RELEASE 或以上版本。

二、简述分布式系统

在后端服务中,随着业务量的增长,简单的单体服务已经很难满足需求,大型网站往往会演进到微服务分布式架构模式。

从单体服务系统到分布式系统,相当于实例数从 1 到 ∞ 的一次发展,这种量级的扩展,给开发和运维带来了很大难度。

为了解决升级分布式系统带来的问题,于是有了一系列分布式系统的规范和组件,Spring Cloud 既提供了解决方案规范,也提供了开箱即用的落地实现。

分布式系统常用组件:

  • 配置中心
  • 服务注册与服务发现
  • 路由管理(微服务网关)
  • 服务调用
  • 负载均衡
  • 熔断器
  • 分布式事务
  • 消息队列
  • 任务调度
  • 指标监控
  • 链路追踪
  • 日志采集

三、常用组件

Spring Cloud 组件常用的三种实现方案如下,按自己的业务需求选择,没有更好的,只有更合适的。

组件 Spring Cloud Netflix Spring Cloud Alibaba Spring Cloud Official
配置中心 - Nacos Spring Cloud Config / Spring Cloud Consul
服务注册 Eureka Nacos Spring Cloud Consul
路由管理 Zuul - Spring Cloud Gateway
服务调用 Feign Dubbo Spring Cloud OpenFeign
负载均衡 Ribbon Dubbo LB Spring Cloud LoadBalancer
熔断器 Hystrix Sentinel Spring Cloud Circuit Breaker - Resilience4J
分布式事务 - Seata -

表格可以左右滑动

其他组件常用实现:

消息队列:Kafka、RocketMQ、Nats

指标监控:Micrometer、Prometheus

链路追踪:Spring Cloud Sleuth、Zipkin

日志采集:ELK 技术栈、FileBeat

四、上下文使用

SpringCloud 应用会创建一个 bootstrap 上下文容器,作为 SpringBoot 应用的父容器。父容器负责加载外部的配置属性(例如配置中心的配置),两个容器共用一个Environment

bootstrap 父容器和应用容器加载方式不一样,基于本地bootstrap.yml而不是application.yml配置文件,这样可以很好的隔离父容器配置和应用容器配置。

图片

从配置中心加载指定应用的配置,需要指定spring.application.name配置。

从配置中心加载指定 Profile 的配置,需要指定spring.profiles.active配置。

上面配置应该在bootstrap.yml中配置,而不是application.yml,为了优先加载父容器的配置。

例如:bootstrap.yml

spring:
  application:
    name: sample
  profiles:
    active: dev
  cloud:
    config:
      uri: ${SPRING_CONFIG_URI:http://localhost:8888}

可以在系统配置中使用spring.cloud.bootstrap.enabled=false配置来禁用 bootstrap 流程。

五、配置中心加载

SpringCloud 默认在 Bootstrap 流程中从 Spring Cloud Config 服务器上加载外部配置,也支持从其他配置中心(Consul、Nacos 等)中加载。

配置中心客户端通过实现PropertySourceLocator接口,来添加配置中心加载逻辑。

@Configuration
public class CustomPropertySourceLocator implements PropertySourceLocator {

    @Override
    public PropertySource<?> locate(Environment environment) {
        Properties properties = new Properties();
        // 加载配置中心的配置
        return new PropertiesPropertySource("configServerProperties", properties);
    }
}

然后在classpath下创建/META-INF/spring.factories文件,并配置下面内容。

# Bootstrap Configuration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
cn.codeartist.springcloud.commons.locator.CustomPropertySourceLocator

六、应用配置加载

SpringCloud 应用会构建父子容器的上下文,bootstrap 父容器与应用容器是继承的关系,所以父容器会优先加载。

bootstrap 父容器中存在PropertySourceLocator接口实现时,会最优先加载该接口导入的配置。

父容器上下文会基于boostrap.[properties | yml]配置文件创建。

应用容器上下文在父容器创建完后,加载application.[properties | yml]配置文件。

图片

七、配置读取优先级

划重点了,一般项目都会有很多的配置文件,但是如果需要修改配置文件,不知道的优先级就很麻烦,SpringCloud 应用和 Spring 一样会从多个地方读取配置,配置的默认优先级从高到低如下:

  • 配置中心配置
  • JVM 系统属性 (-D指定的命令行参数)
  • 环境变量属性(操作系统环境变量)
  • application.[properties | yml]
  • boostrap.[properties | yml]

如果多个地方存在相同的配置,取优先级高的配置。

图片

配置中心默认最高优先级,不能被本地配置覆盖,如果必须要覆盖,可以在配置中心添加下面配置。

spring:
  cloud:
    config:
      allowOverride: true
      overrideNone: true
      overrideSystemProperties: false

注意:上述配置在本地配置无效,必须在配置中心配置。

总结

以上知识点对你帮助吗,留下你的关注,还有更多的知识点分享给你,一起学习。

猜你喜欢

转载自blog.csdn.net/weixin_40379712/article/details/130511355