202520 | 微服务

发布于:2025-04-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

微服务 VS 单体架构

单体架构(Monolithic Architecture)和微服务架构(Microservices Architecture)是两种主流的软件设计模式,它们在开发、部署、扩展和维护等方面有显著差异。以下是两者的详细对比:


1. 定义与核心思想

  • 单体架构

    • 定义:整个应用作为一个单一、紧密耦合的代码库运行,所有功能模块(如用户管理、订单处理等)共享同一个进程和数据库。
    • 核心思想:集中化开发、测试、部署和扩展。
  • 微服务架构

    • 定义:应用被拆分为多个小型、独立的服务,每个服务负责特定功能,通过轻量级通信(如HTTP/RPC)交互,可独立开发、部署和扩展。
    • 核心思想:解耦、自治、单一职责。

2. 主要对比维度

维度 单体架构 微服务架构
开发复杂度 简单,代码和依赖集中管理。 复杂,需处理分布式系统的挑战(如服务发现、容错)。
技术栈 通常统一(单一语言/框架)。 灵活,不同服务可用不同技术栈。
部署 整体部署,更新需重新发布整个应用。 独立部署,单个服务更新不影响其他部分。
扩展性 垂直扩展(提升单机性能),资源利用率低。 水平扩展(按需扩展特定服务),资源利用率高。
性能 模块间调用高效(进程内通信)。 存在网络延迟,需优化通信机制(如gRPC)。
数据一致性 强一致性(单一数据库事务)。 最终一致性(需引入Saga、事件溯源等模式)。
容错性 单点故障可能导致整个系统崩溃。 故障隔离,单个服务失败不影响整体。
测试 简单,端到端测试容易。 复杂,需模拟服务依赖(如Mock测试)。
运维成本 低,只需管理单一应用和数据库。 高,需监控、日志聚合、服务网格等基础设施。
适用场景 小型应用、快速原型开发、低流量场景。 大型复杂系统、高并发、快速迭代需求。

3. 优缺点总结

单体架构
  • 优点
    • 开发简单,调试和测试直接。
    • 部署流程简单(单一包)。
    • 适合团队规模小、需求明确的项目。
  • 缺点
    • 代码臃肿,维护成本随规模增长。
    • 扩展性差,无法针对模块单独优化。
    • 技术栈僵化,难以局部创新。
微服务架构
  • 优点
    • 模块化强,团队可独立开发不同服务。
    • 弹性扩展,适应高并发需求。
    • 技术多样性,灵活选择最佳工具。
  • 缺点
    • 分布式系统复杂性(如网络延迟、CAP定理)。
    • 运维复杂,需CI/CD、容器化(如Kubernetes)支持。
    • 调试和监控难度大(需分布式追踪工具)。

4. 演进与折中方案

  • 演进路径
    单体 → 模块化单体(如分包分层) → 微服务(按业务拆分)。
    注:微服务不是银弹,过度拆分会引入不必要的复杂性。

  • 折中方案

    • 宏服务(Macroservices):适度拆分,服务粒度介于单体和微服务之间。
    • 无服务器架构(Serverless):进一步解耦,按函数粒度部署。

5. 选择建议

  • 选单体:项目初期、团队小、需求稳定、追求快速交付。
  • 选微服务:系统复杂、长期迭代、高可用性要求、团队具备DevOps能力。

示例

  • 单体:个人博客、企业内部管理系统。
  • 微服务:电商平台(订单、支付、库存分离)、流媒体服务(如Netflix)。

通过对比可见,架构选择需权衡业务需求、团队能力和长期维护成本。没有绝对优劣,只有更适合当前场景的方案。

SpringCloud

image-20250329103115591

Spring Cloud 介绍

Spring Cloud 是一套基于 Spring Boot 的微服务架构开发工具集,用于简化分布式系统的构建、部署和管理。它提供了微服务架构所需的常见组件(如服务发现、配置中心、负载均衡、熔断器等),帮助开发者快速构建高可用、可扩展的云原生应用。


1. Spring Cloud 的核心功能

Spring Cloud 包含多个子项目,每个子项目解决微服务架构中的特定问题:

组件 功能
Spring Cloud Netflix 集成 Netflix OSS(如 Eureka、Hystrix、Zuul、Ribbon),提供服务发现、熔断、API 网关等功能(部分组件已逐步被替代)。
Spring Cloud Gateway 基于 Reactor 的高性能 API 网关,替代 Zuul,支持动态路由、限流、鉴权等。
Spring Cloud Config 分布式配置中心,支持 Git、数据库等方式管理配置,实现配置的动态刷新。
Spring Cloud OpenFeign 声明式 HTTP 客户端,基于 Ribbon 实现负载均衡,简化服务间调用。
Spring Cloud Sleuth + Zipkin 分布式链路追踪,用于监控微服务调用链。
Spring Cloud Stream 消息驱动微服务,集成 Kafka、RabbitMQ 等消息中间件。
Spring Cloud Security 提供 OAuth2、JWT 等安全认证方案,保护微服务 API。
Spring Cloud Alibaba 集成阿里云生态(如 Nacos、Sentinel、Seata),提供注册中心、流量控制、分布式事务等能力。

2. Spring Cloud 的核心架构

典型的 Spring Cloud 微服务架构包含以下核心组件:

  1. 服务注册与发现(Eureka/Nacos)

    • 服务提供者向注册中心注册自己(如 user-service)。
    • 服务消费者从注册中心获取可用服务列表(如 order-service 调用 user-service)。
  2. API 网关(Spring Cloud Gateway/Zuul)

    • 统一入口,处理路由、鉴权、限流等。
    • 例如:/api/orders → 路由到订单服务。
  3. 负载均衡(Ribbon/Spring Cloud LoadBalancer)

    • 客户端负载均衡,决定调用哪个服务实例(如轮询、随机策略)。
  4. 熔断与降级(Hystrix/Sentinel)

    • 防止服务雪崩,当某个服务失败时快速失败或返回兜底数据。
  5. 配置中心(Spring Cloud Config/Nacos)

    • 集中管理所有微服务的配置,支持动态更新。
  6. 分布式链路追踪(Sleuth + Zipkin)

    • 记录请求在微服务间的流转路径,便于排查性能瓶颈。

3. Spring Cloud 的优势

标准化微服务开发:提供开箱即用的组件,避免重复造轮子。
与 Spring Boot 深度集成:简化配置,快速启动项目。
丰富的生态支持:兼容 Netflix、Alibaba、Kubernetes 等方案。
云原生友好:支持容器化(Docker/K8s)、Serverless 等部署方式。


4. Spring Cloud 的版本演进

  • Spring Cloud Netflix(早期主流,部分组件已进入维护模式)
    • Eureka(服务注册)、Hystrix(熔断)、Zuul(网关)等。
  • Spring Cloud Gateway(替代 Zuul,性能更高)
  • Spring Cloud Alibaba(国内流行,集成 Nacos、Sentinel)
  • Spring Cloud 2023.x(最新版本)
    • 默认使用 Spring Cloud LoadBalancer 替代 Ribbon。

5. 示例:Spring Cloud 微服务调用流程

  1. 服务注册
    • user-service 启动后向 Eureka/Nacos 注册自己的地址(如 192.168.1.1:8080)。
  2. 服务发现
    • order-service 通过 Feign 调用 user-service,Ribbon 从注册中心获取可用实例并负载均衡。
  3. API 网关
    • 外部请求通过 Spring Cloud Gateway 路由到对应的微服务。
  4. 熔断保护
    • 如果 user-service 宕机,Hystrix/Sentinel 触发降级逻辑(如返回缓存数据)。

6. 学习建议

📌 入门路径

  1. 掌握 Spring Boot(基础必备)。
  2. 学习 Spring Cloud Netflix(如 Eureka + Feign + Hystrix)。
  3. 过渡到 Spring Cloud Alibaba(Nacos + Sentinel + Seata)。
  4. 结合 Docker/Kubernetes 部署微服务。

📌 推荐资源


总结

Spring Cloud 是微服务架构的“瑞士军刀”,通过标准化组件降低分布式系统的开发难度。选择时需根据团队技术栈(如 Netflix 或 Alibaba 生态)和业务需求(如高并发、配置管理)灵活搭配。

微服务拆分

微服务拆分指南(适中详解版)

1. 核心拆分原则

1.1 业务优先

  • 按业务能力而非技术分层拆分(如电商拆分为用户服务订单服务支付服务
  • 避免出现"用户订单服务"这种混合职责的服务

1.2 单一职责

  • 每个服务只解决一个核心问题(如库存服务仅处理库存增减)
  • 服务代码量控制在1-2周可完全理解的范围

1.3 数据自治

  • 每个服务独占数据库(MySQL/NoSQL)
  • 跨服务数据通过API调用获取,禁止直接访问其他服务数据库
2. 常用拆分策略
策略 适用场景 示例
按功能 业务边界清晰 拆出独立的购物车服务
按数据 数据访问模式差异大 商品查询服务vs商品管理服务
按变更频率 不同模块迭代速度差异大 高频的促销服务与稳定的基础数据服务
3. 典型拆分流程

3.1 识别业务边界

  • 通过事件风暴找出核心业务域(如电商的订单、支付、物流)

3.2 定义服务契约

// 订单服务调用支付服务的API定义
@PostMapping("/payments")
PaymentResult createPayment(@RequestBody PaymentRequest request);

3.3 渐进式拆分

  • 从单体中逐步剥离服务(推荐"绞杀者模式")
  • 优先拆分高频变更或性能敏感模块
4. 必须解决的三大难题

4.1 分布式事务

  • 方案选择:
    • 最终一致:Saga模式
    • 强一致:TCC模式
    • 折中方案:本地消息表

4.2 服务通信

  • 同步调用:Spring Cloud OpenFeign
  • 异步消息:Kafka/RocketMQ
  • 性能优化:gRPC替代HTTP

4.3 运维监控

  • 基础三件套:
    • 指标监控:Prometheus + Grafana
    • 日志收集:ELK
    • 链路追踪:SkyWalking
5. 实用建议

5.1 拆分前

  • 先做好模块化单体(package by feature)
  • 准备完善的CI/CD和监控体系

5.2 拆分时

  • 保持服务接口向后兼容
  • 采用防腐层隔离新旧系统

5.3 拆分后

  • 每个服务配置独立告警规则
  • 定期进行故障演练(如混沌工程)
6. 经典案例参考
调用
调用
电商平台
获取用户信息
校验库存
订单服务
支付服务

关键数字

  • 初期建议服务数量控制在5-8个
  • 每个服务响应时间应<300ms
  • 服务间调用深度不超过3层
7. 工具推荐
  • 开发:Spring Cloud Alibaba(Nacos+Sentinel)
  • 部署:Docker + Kubernetes
  • 监控:Prometheus + Grafana

提示:先从1-2个服务试点拆分,验证效果后再全面推广。避免陷入"为拆而拆"的陷阱。