不会飞的章鱼

熟能生巧,勤能补拙,静能养慧;为而不争,莫向外求,反求诸己;念念不忘,必有回响

【慕聘网】使用SpringCloud Alibaba构建微服务

单体、分布式、集群、SOA技术架构演变

软件架构并非一蹴而就,而是随着业务复杂度和用户量的增加,不断演进而来的。我们可以将其主要划分为以下几个阶段:

1. 单体应用架构 (All in One)

在互联网发展的早期,业务逻辑相对简单,我们将所有的功能模块(如用户、支付、订单、简历等)都打包在一个 WARJAR 包中,部署在同一台服务器上运行。这就是典型的单体应用架构

📌 架构示意图

单体应用架构

✅ 优点

  • 开发简单:所有代码在一个项目中,便于调试和修改。
  • 部署方便:只需要将一个包复制到服务器即可。
  • 前期成本低:无需复杂的架构设计,适合小型创业项目快速试错。

❌ 缺点

  • 高耦合:代码紧密耦合,牵一发而动全身,维护困难。
  • 扩展性差:无法针对某个模块(如高频访问的“支付模块”)单独扩容,只能整体扩容。
  • 技术栈受限:整个项目必须使用同一种语言和框架。
  • 单点故障:一个模块的内存溢出可能导致整个服务崩溃。

2. 垂直应用架构 (Vertical Application)

随着业务量的增长,单体应用的访问量逐渐增大,服务器不堪重负。为了解决这个问题,我们开始根据业务功能,将应用拆分成几个互不相关的独立应用(如:前台交易系统、后台管理系统、CMS系统等),每个应用独立部署。这就是垂直应用架构

📌 架构示意图

垂直应用架构

✅ 优点

  • 业务解耦:系统之间相对独立,互不影响。
  • 独立扩展:可以针对访问量大的应用(如用户端)单独进行集群扩容。
  • 容错性提升:某个应用挂掉不会影响其他应用的正常运行。

❌ 缺点

  • 重复造轮子:多个应用之间可能存在大量重复的代码(如:工具类、实体类、DAO层逻辑)。
  • 数据孤岛:不同应用之间的数据交互困难,需要通过复杂的接口调用或数据库共享。
  • 维护成本与日俱增:随着应用数量的增加,运维和管理的难度呈指数级上升。

3. 分布式服务架构 (RPC) & SOA

为了解决垂直应用架构中代码重复和交互困难的问题,我们开始将核心业务抽取出来,作为独立的服务(Service),供其他应用(Controller层/Web层)调用。这就形成了分布式服务架构

此时,RPC (Remote Procedure Call) 技术成为了关键。我们希望像调用本地方法一样调用远程服务。随之而来的,是SOA (Service Oriented Architecture,面向服务的架构) 的兴起,强调服务的注册、发现和治理。

Dubbo 就是在这个阶段诞生的杰出代表。

📌 架构示意图

分布式服务架构

✅ 优点

  • 服务复用:核心业务逻辑被抽取为独立服务,供多端共用,消除了重复代码。
  • 分层清晰:表现层(Web)和业务层(Service)分离,职责更明确。
  • 弹性伸缩:可以针对具体的服务进行细粒度的扩容(例如:只扩容由大促带来的“订单服务”压力)。

❌ 缺点

  • 调用关系复杂:随着服务增多,服务之间的调用链路变得错综复杂,像一团乱麻。
  • 服务治理难题:如何管理成百上千个服务的地址、负载均衡、容错、降级?这就需要服务治理中心(如 Zookeeper, Nacos)。

4. 微服务架构 (Microservices)

微服务架构是分布式架构的一种升华。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。

每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。

核心特征

  1. 原子性:服务拆分粒度更细,一个服务只做一件事(单一职责)。
  2. 独立部署:每个服务可以独立开发、测试、部署。
  3. 技术异构:不同的服务可以根据业务需求选择最适合的技术栈(如:Java 写订单,Go 写高并发网关,Python 做数据分析)。
  4. 去中心化:数据去中心化(每个服务有自己的数据库),治理去中心化。

在接下来的章节中,我们将使用 Spring Cloud Alibaba 这一强大的微服务全家桶,带领大家从零开始构建一个现代化的微服务招聘平台。


如何真正认识微服务

微服务架构不仅仅是一种技术选择,更是一种架构设计风格。它强调将一个单一的应用拆分为一组小型服务,每个服务运行在自己的进程中,并使用轻量级机制(通常是HTTP API)进行通信。

核心优势

根据我的实践经验,微服务架构带来的红利是肉眼可见的:

  1. 独立部署,简单灵活:每个微服务都可以独立于其他服务进行部署。这意味着我们不再需要因为修改了一行代码而重新部署整个庞大的单体应用,发布周期大大缩短。
  2. 高效率,微团队:服务拆分后,团队也可以随之拆分。每个小团队专注于一个或几个微服务,沟通成本降低,开发效率显著提升。
  3. 松耦合,易扩展:服务之间通过接口通信,内部实现细节被隐藏。当某个业务模块(如秒杀)需要承受高并发时,我们可以单独针对该服务进行扩容,而不必扩展整个系统。
  4. 技术异构性:这是我最喜欢的一点。我们不再被绑定在某一种语言或数据库上。对于计算密集型服务,我可以使用 Go;对于复杂的业务逻辑,我可以使用 Java;对于数据分析,我可以使用 Python。不同的服务可以使用最适合它的存储介质(Redis, MySQL, MongoDB 等)。

带来的挑战

当然,天下没有免费的午餐。微服务架构在带来灵活性的同时,也引入了分布式系统固有的复杂性:

  1. 接口依赖与版本管理:服务多了,服务间的调用关系就成了网状。接口参数的变动、版本的升级,如果协调不好,很容易导致“服务雪崩”。
  2. 测试与运维成本飙升:以前只需要测试一个包,部署一个包。现在需要测试几十个服务的集成,部署和监控几十个进程以及它们之间的链路。没有自动化的 CI/CD 和完善的监控体系(如 Prometheus + Grafana),微服务就是一场灾难。
  3. 分布式系统的难题
    • 分布式事务:跨服务的操作如何保证数据一致性?
    • 分布式安全:如何统一认证和鉴权?
    • 服务稳定性:如何处理服务雪崩、熔断和降级?
    • 故障排查:调用链太长,出现问题如何快速定位?

正因为面临这些挑战,Spring Cloud Alibaba 应运而生。它提供了一站式的微服务解决方案,帮我们解决了上述绝大多数“治理”层面的痛点,让我们能专注于业务逻辑的实现。

微服务AKF拆分原则

当我们谈论如何将一个庞大的单体系统拆分为微服务时,AKF 立方体(AKF Scale Cube) 是一个非常经典的理论指导模型。它从三个维度定义了扩展系统的可能性。

📌 AKF 立方体示意图

AKF 拆分原则立方体

1. Y 轴拆分:按业务功能拆分(Functional Decomposition)

这是微服务架构的核心。

  • 定义:按照不同的服务功能和业务逻辑进行垂直拆分。
  • 特点:实现高内聚、低耦合。每个开发人员或小团队只需要负责自己所开发的特定功能。
  • 示例:在“慕聘网”中,我们将单体应用拆分为:用户服务、支付服务、简历服务、订单服务等。

2. X 轴拆分:水平复制扩展(Horizontal Duplication)

这是最基础的扩展方式,也就是我们常说的“集群”。

  • 定义:通过水平复制单体应用或微服务,形成服务集群。
  • 目的:实现负载均衡,提高系统的吞吐能力。
  • 特点:如果某个服务压力大,我们直接多开启几个实例即可。它是 Y 轴拆分的有力补充。

3. Z 轴拆分:数据分区(Data Partitioning)

当业务规模达到一定量级时,需要从数据的维度进行拆分。

  • 定义:根据数据的特定维度(如时间、地域、用户ID等)进行拆分。
  • 场景:适用于超大规模项目和海量数据场景。
  • 示例
    • 时间维度:将订单数据按年份存储在不同的数据库表中(2024年表、2025年表)。
    • 地域维度:朋友圈功能,针对地理位置显示不同的内容,或者将数据存储在离用户最近的机房。

💡 我的拆分实践心得

在“慕聘网”的建设过程中,我主要采用了 Y 轴拆分(功能拆分)X 轴扩展(水平复制)

  • 第一步(Y轴):先根据业务边界划清界限,让每个服务各司其职。
  • 第二步(X轴):针对访问频繁的核心服务(如职位搜索、简历投递),通过 Nacos 注册中心实现多实例部署和动态负载均衡。

对于绝大多数中大型项目,掌握好 X 轴和 Y 轴的配合,就已经能解决 90% 以上的性能和扩展性难题了。

微服务的CAP定理与数据一致性抉择

在分布式系统和微服务架构的构建中,CAP 定理是一个绕不开的核心理论,它为我们进行架构设计和技术选型提供了重要的理论依据。

什么是 CAP 定理?

CAP 定理(CAP theorem)指出,对于一个分布式计算系统,不可能同时满足以下三点:

  1. 一致性 (Consistency)

    • 定义:在分布式系统中的所有数据备份,在同一时刻是否有同样的值。
    • 通俗理解:用户在任何一个节点写入数据后,随后在其他任意节点都能读到最新的写入数据。这就好像系统只有一个数据副本一样。
    • 场景:转账后,余额必须立即更新,不能有延迟。
  2. 可用性 (Availability)

    • 定义:负载过大后,集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
    • 通俗理解:系统在任何时候都能正常响应用户的请求,即使部分服务器宕机,系统依然“在线”。
    • 场景:双十一购物,不能因为某个服务器挂了就让用户无法下单。
  3. 分区容错性 (Partition Tolerance)

    • 定义:系统中任意信息的丢失或失败不会影响系统的继续运作。
    • 通俗理解:在网络分区(如断网、延迟抖动)发生时,系统依然能对外提供服务。
    • 现状:分布式系统中,节点分布在不同网络、机房甚至地域,网络分区是不可避免的,因此 P 是必须满足的

CAP 的取舍策略

既然 CAP 三者无法兼得,在分布式系统中,由于 分区容错性 (P) 是客观存在的(网络不可靠),我们必须在 P 的前提下,在 一致性 (C)可用性 (A) 之间做权衡。这引出了三种经典的组合:

CAP定理的三种组合

1. CP 架构 (Consistency + Partition Tolerance)

  • 特点:保证强一致性,牺牲可用性。
  • 原理:当发生网络分区时,为了保证数据一致性,系统会拒绝客户端的请求(或者阻塞请求),直到数据同步完成。
  • 适用场景:对数据一致性要求极高的系统,如 银行系统、支付系统、Zookeeper
  • 代价:由于需要等待数据同步,系统性能会下降,且在同步期间服务可能不可用。

2. AP 架构 (Availability + Partition Tolerance)

  • 特点:保证高可用性,牺牲强一致性(接受最终一致性)。
  • 原理:当发生网络分区时,为了保证服务可用,系统允许返回旧数据,优先响应用户请求。
  • 适用场景:绝大多数 互联网业务、微服务系统、电商网站(如 Eureka, Nacos 的 AP 模式)。
  • 优势:系统响应快,用户体验好。

3. CA 架构 (Consistency + Availability)

  • 特点:放弃分区容错性。
  • 原理:要求系统不再发生网络分区。这在分布式系统中几乎是不可能的,因为只要有网络调用,就有失败的风险。
  • 适用场景:单机数据库(如单机版 MySQL、Oracle)。

微服务中的数据一致性抉择

在构建微服务(如我们的“慕聘网”)时,我们通常面临的现实是:

分布式系统无法同时满足一致性 (C)、可用性 (A) 和分区容错性 (P)。

由于微服务天生是分布式的,P (分区容错性) 是我们必须接受的底座。因此,我们的选择题其实变成了:是保 C 还是保 A?

  • **强一致性 (Strong Consistency)**:这会导致性能低下,吞吐量上不去,且可能因为节点故障导致服务不可用。
  • **最终一致性 (Eventual Consistency)**:这是互联网公司的主流选择。我们采用异步复制、消息队列等技术,允许数据在极短时间内不一致,但保证最终数据是一致的。

结论
在微服务架构中,我们更倾向于采用 AP 架构,即保证系统的高可用分区容错,通过“最终一致性”来弥补强一致性的缺失。

例如,在“慕聘网”中:

  • 用户投递简历后,系统先返回“投递成功”提示(保证 A)。
  • 后台异步进行简历解析、通知企业等操作(实现最终一致性)。

微服务Netflix与Alibaba的联系

微服务架构的发展经历了两个重要的阶段,我们可以将其形象地比喻为“前浪”与“后浪”。

1. 前浪:Spring Cloud Netflix

Netflix 是微服务领域的先驱,它开源的一系列组件(如 Eureka, Hystrix, Zuul, Ribbon)定义了第一代微服务的标准。

  • Eureka:服务注册与发现。
  • Hystrix:熔断器,防止服务雪崩。
  • Ribbon:客户端负载均衡。
  • Feign:声明式服务调用。
  • Zuul:微服务网关。

然而,随着时间的推移,Netflix 的部分组件进入了**维护模式 (Maintenance Mode)**,不再进行新特性的开发。这就给了后来者巨大的机会。

2. 后浪:Spring Cloud Alibaba

阿里巴巴结合自身在电商领域的超大规模实践,开源了 Spring Cloud Alibaba 全家桶。它不仅完全兼容 Spring Cloud 标准,还提供了更符合中国互联网高并发场景的解决方案。

核心组件对比

功能 Spring Cloud Netflix (旧) Spring Cloud Alibaba (新)
服务注册与发现 Eureka (停止更新) Nacos (更强大,支持 AP/CP)
服务熔断与降级 Hystrix (停止更新) Sentinel (可视化强,流量控制)
分布式配置中心 Spring Cloud Config Nacos (配置管理更便捷)
微服务网关 Zuul (性能一般) Spring Cloud Gateway (基于Netty)
负载均衡 Ribbon (停止更新) Spring Cloud LoadBalancer / Dubbo
分布式事务 Seata (独有优势)
消息队列 无 (需整合) RocketMQ (削峰填谷神器)

3. Spring Cloud Alibaba 核心功能概览

根据官方 Roadmap 和我们的实际使用,Spring Cloud Alibaba 提供了以下一站式解决方案:

  • Sentinel:无论流量如何汹涌,Sentinel 都能通过流量控制、熔断降级、系统负载保护等多个维度,保障服务的稳定性。它就是微服务的“防洪堤”。
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它集注册中心与配置中心于一体,极大地简化了架构。
  • RocketMQ:基于高可用分布式集群技术,提供低延时、高可靠的消息发布与订阅服务。我们在秒杀、解耦等场景中大量使用。
  • Seata:阿里巴巴开源的高性能微服务分布式事务解决方案。它让分布式事务像本地事务一样简单,且对业务代码零侵入。
  • Alibaba Cloud OSS:阿里云对象存储服务。海量、安全、低成本、高可靠的云存储服务,我们在项目中用于存储简历附件、用户头像等。
  • Alibaba Cloud SchedulerX:阿里中间件团队开发的分布式任务调度产品。提供秒级、精准、高可靠的定时(Cron)任务调度服务。
  • Alibaba Cloud SMS:覆盖全球的短信服务。我们在用户注册、登录验证码发送等场景中使用。

Spring Cloud Alibaba 的出现,让我们在构建微服务时有了更强大、更现代化的武器库。

参考资料

------ 本文结束------
如果你喜欢这篇文章,打赏一下让我开心到原地转圈圈~,金额随意,感谢鼓励与支持!