Skip to content

Spring Cloud

Spring Cloud 是构建分布式系统和微服务架构的工具集合,基于 Spring Boot 提供服务注册与发现、配置中心、服务调用、网关、熔断限流、链路追踪等能力。它不是单个框架,而是一组围绕“服务治理”的组件组合,用来把多个独立应用连接成可维护、可观测、可演进的系统。

适用场景

  • 多个服务需要独立开发、部署和扩缩容。
  • 需要统一处理服务发现、配置、路由、鉴权、限流和容错。
  • 需要治理服务间调用,例如负载均衡、超时、重试和熔断。
  • 需要为微服务系统建立可观测、可维护的基础设施。
  • 业务已经形成相对稳定的边界,团队具备自动化测试、发布和监控能力。

不建议过早使用的场景

  • 系统规模较小,单体应用仍能快速交付。
  • 团队还没有稳定的业务边界,拆分后接口会频繁变化。
  • 缺少 CI/CD、日志、指标、告警和链路追踪等基础设施。
  • 只是为了使用新技术,而不是为了解决独立交付、扩缩容或组织协作问题。

学习路线

建议先理解微服务架构和服务治理,再学习注册中心、配置中心、声明式调用和网关;随后补充熔断限流、链路追踪、消息驱动、部署和最佳实践。

学习时不要只看组件 API,更要关注组件解决的问题:地址如何发现、配置如何下发、调用如何失败、故障如何隔离、请求链路如何排查。

目录

常见架构图

上图体现了典型微服务系统的几类基础能力:入口层、业务服务、数据边界、服务治理、异步消息和可观测平台。

核心能力速览

能力解决的问题常见组件使用要点
服务发现实例地址动态变化,调用方不写死 IPNacos、Eureka、Consul服务名稳定,注册中心高可用,调用侧仍需超时和熔断
配置中心多服务、多环境配置集中管理Nacos Config、Spring Cloud Config区分环境和命名空间,敏感配置加密,变更可审计
服务调用服务间 HTTP 调用和负载均衡OpenFeign、Spring Cloud LoadBalancer明确接口契约,设置连接/读取超时,避免无限重试
服务网关统一入口、路由、鉴权、限流Spring Cloud Gateway网关只做横切能力,不承载复杂业务逻辑
容错治理下游故障不扩散到全站Resilience4j、Sentinel超时、限流、熔断、降级策略要一起设计
可观测性分布式问题定位困难Micrometer、Prometheus、Zipkin、SkyWalking统一 traceId,日志、指标、链路追踪联动
消息驱动削峰、解耦、最终一致性RabbitMQ、Kafka、RocketMQ关注幂等、重试、死信和消息积压

组件选型说明

场景推荐关注点说明
国内 Spring Cloud Alibaba 体系Nacos、Sentinel、RocketMQNacos 同时覆盖注册发现和配置中心,落地成本低
传统 Netflix 体系迁移Eureka、OpenFeign、GatewayEureka 仍可维护存量系统,新项目需关注组件维护状态
多语言服务治理Consul、Kubernetes Service、Service Mesh不局限于 Java,适合多语言和平台化团队
Kubernetes 原生部署Kubernetes Service、ConfigMap、Secret、Ingress/Gateway API可以减少外部注册中心依赖,但仍需服务治理和可观测能力

选型时优先看团队经验、生态兼容性、运维能力和已有基础设施,不要只比较单个组件的功能列表。

版本匹配提醒

Spring Cloud 强依赖 Spring Boot 版本,实际项目应使用官方 Spring Cloud Release Train 对应关系,并通过 BOM 统一管理版本。常见做法是在 Maven 中引入依赖管理:

xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

注意事项:

  • Spring Boot、Spring Cloud、Spring Cloud Alibaba 需要分别确认兼容矩阵。
  • 不要手动混用多个发行列车中的组件版本。
  • 升级前先在测试环境验证配置加载、注册发现、网关路由、Feign 调用和监控指标。
  • 大版本升级通常会涉及配置项变更、包名变更或默认行为变化,应逐项核对 release notes。

简单示例

java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@FeignClient(name = "user-service")
interface UserClient {
    @GetMapping("/users/current")
    String currentUser();
}

@RestController
class OrderController {
    private final UserClient userClient;

    OrderController(UserClient userClient) {
        this.userClient = userClient;
    }

    @GetMapping("/orders/current-user")
    String currentUser() {
        return userClient.currentUser();
    }
}

说明:调用方只关心服务名 user-service 和接口契约,具体实例地址由服务发现和负载均衡处理。

常见问题

Spring Cloud 是否等于微服务?

不是。微服务是一种架构风格,Spring Cloud 是 Java/Spring 生态下实现服务治理的一组工具。即使使用了 Spring Cloud,如果服务边界混乱、数据库共享严重、发布流程不可控,也不能算健康的微服务架构。

有了注册中心还需要网关吗?

需要视场景而定。注册中心解决服务之间如何找到实例的问题,网关解决外部流量如何统一进入系统的问题。网关通常负责路由、鉴权、限流、跨域、灰度入口等横切能力。

拆成微服务后性能一定更好吗?

不一定。微服务会引入网络调用、序列化、链路追踪和运维开销。它主要提升独立交付、扩缩容和团队协作能力,不是默认的性能优化方案。

排查思路

现象优先检查
服务调用失败服务名是否正确、实例是否已注册、网络是否互通、调用超时是否过短
配置未生效配置 DataId/Profile/命名空间是否匹配,应用是否启用远程配置
网关路由 404路由谓词是否匹配、服务名是否大小写一致、注册中心是否有实例
偶发超时下游延迟、连接池、线程池、重试放大、数据库慢查询
线上问题难定位traceId 是否贯穿日志,指标和链路追踪是否完整采集

生产注意事项

  • 微服务不是默认选择,单体应用能满足需求时不要过早拆分。
  • 注册中心、配置中心、网关、消息队列都属于关键基础设施,需要高可用部署和备份策略。
  • 所有远程调用都应设置超时,重要链路要有熔断、限流和降级方案。
  • 配置变更、网关规则、限流规则需要审计和回滚能力。
  • 统一日志格式、traceId、指标命名和告警规则,避免每个服务各自为政。
  • 服务拆分后会引入网络延迟、分布式事务、链路排查和运维复杂度,需要通过自动化和可观测能力抵消复杂度。
二维码手机扫码查看