集群、分布式、微服务
集群、分布式、微服务
核心关系一句话总结
微服务是一种特定的分布式应用设计架构,而集群是实现分布式和微服务的高可用与扩展性的通用技术手段。
它们三者的关系可以概括为:
微服务 ⊂ 分布式 ⊃ 集群
集群和微服务都是分布式
三者的角色与定位
| 概念 | 是什么? | 核心目标 | 好比是... |
|---|---|---|---|
| 集群 | 一种技术手段 | 高可用、负载均衡、扩展能力 | “复制” - 像组织一支一模一样的替补队伍,随时能顶上去。 |
| 分布式 | 一种系统架构风格 | 分工协作、解决单机性能瓶颈 | “拆分与协作” - 像组建一家分工明确的公司,有市场部、技术部、财务部。 |
| 微服务 | 一种具体的应用设计范式 | 敏捷开发、独立部署、技术异构 | “精细化拆分与自治” - 像将公司重组为独立核算、高度自治的敏捷小团队。 |
层层递进的关系解析
- 集群是基石
- 它是构建高可用、可扩展系统最基础、最通用的技术。
- 它既可以用于支撑一个庞大的单体应用(单体集群),也可以用于支撑分布式系统中的一个组件(如数据库集群),还可以用于支撑微服务架构中的每一个独立服务(如订单服务集群)。
- 没有集群,大规模的分布式和微服务系统就很难具备生产级的可靠性。
- 分布式是目标与范畴
- 它定义了一个宏观的蓝图:系统将由多个通过网络通信的组件构成。
- 只要你的系统跑在多台机器上并协同工作,你就进入了“分布式”的范畴。
- 集群是实现分布式蓝图的一种常用方式。
- 微服务是分布式的“最佳实践”
- 它回答了“在分布式这个宏大的蓝图下,我应该如何具体地设计我的应用?”这个问题。
- 它给出了明确的指导原则:按业务边界精细拆分、服务自治、独立部署。
- 微服务架构是分布式应用架构的一种高级形态,它必然建立在分布式系统之上,并且几乎总是依赖集群技术来保证每个服务的可靠性。
一个最终的比喻:建设城市
- 集群:你在城市的每个区域都建设了一模一样的消防站。这是一个消防站集群,确保任何地方起火,最近的消防站都能出动。
- 分布式:整个城市本身就是一个分布式系统。它有专门负责供电的电站、负责供水的自来水厂、负责交通的道路网、负责治安的警察局...这些单位各司其职,通过道路(网络)协作,共同维持城市的运转。
- 微服务:这是城市规划的先进理念。它要求不再建设功能混杂的“巨型社区”,而是规划出一个个功能单一、高度自治的“特色小镇”:一个金融小镇、一个科技园区、一个大学城。每个小镇有自己的管理规则和基础设施(独立数据库),小镇之间通过高效的道路(API)连接。同时,每个小镇内部也有多个消防站(集群)来保障自身安全。
结论:
当你设计一个现代互联网系统时,你很可能是在采用 微服务架构 (设计理念),来构建一个 分布式系统 (整体结构),并通过为每个微服务建立 集群 (技术实现)来确保其高可用与可扩展性。这三者相辅相成,共同构成了现代云计算时代的系统基石。
分布式和微服务
微服务是分布式的特殊情况,是分布式的更为精细的拆分。
微服务架构通过一种“精细化的、以业务为边界的拆分”方式,来实现一个“分布式系统”的终极目标(即可扩展、高可用、高性能),同时更侧重于获得开发敏捷性、技术自由度和弹性能力。
分布式和微服务
分布式:拆了就行。
微服务:细粒度的垂直拆分。
- 拆分目的不同:
- 提出分布式设计是为了解决单体应用资源有限的问题,一台服务器无法支撑更多的用户访问,因此将一个应用拆解成不同的部分,然后分别部署到不同服务器上,从而分担高并发的压力。
- 微服务是对服务组件进行精细化,目的是更好地解耦,让服务之间通过组合实现高性能、高可用、可伸缩、可扩展。
- 拆分方式不同:
- 分布式服务架构将系统按照业务和技术分类进行拆分,目的是让拆分后的服务负载原来单一服务的业务。
- 微服务则是在分布式的基础上进行更细的拆分,它将服务拆成更小的模块,不仅更专业化,分工也更为精细,并且每个小模块都能独立运行。
- 部署方式不同:
- 分布式架构将服务拆分以后,通常会把拆分后的各部分部署到不同服务器上。
- 而微服务既可以将不同的服务模块部署到不同服务器上,也可以在一台服务器上部署多个微服务或者同一个微服务的多个备份,并且多使用容器
的方式部署。
历史演进的视角
“技术驱动业务,业务倒逼技术”
阶段一:单体架构时代(前分布式时期)
- 时间:2000年代早期及以前
- 架构模型:
- 整个应用(用户界面、业务逻辑、数据访问)被打包成一个单一的程序(如WAR包、JAR包)。
- 部署在一台强大的服务器(如大型机、小型机)上。
- 要解决的问题:
- 核心是“实现功能”。这个阶段的首要任务是把软件做出来,实现业务逻辑的自动化。
- 面临的挑战(作用的反面):
- 扩展性瓶颈:流量增加时,只能升级硬件(垂直扩展),成本高昂且有上限。
- 技术僵化:整个系统必须使用统一的技术栈,难以引入新技术。
- 交付缓慢:任何一个小的修改都需要重新构建和部署整个应用,风险高、周期长。
- 可靠性低:单点故障。任何一个模块的Bug都可能导致整个系统崩溃。
阶段二:集群时代(解决可用性与扩展性)
- 时间:2000年代中后期,互联网开始兴起
- 演进驱动力:网站流量开始增长,需要解决单点故障和性能瓶颈。
- 要解决的问题:
- 高可用性:确保服务7x24小时不中断。
- 初步的水平扩展:通过增加廉价服务器来分摊流量负载。
- 作用与架构模型:
- 技术手段:将同一个单体应用复制多份,部署到多台服务器上,前方通过负载均衡器分发请求。
- 作用:
- 解决了“机器级”的单点故障:一台服务器宕机,其他服务器可以接管。
- 实现了“无状态服务”的水平扩展:用户请求可以被分摊到多台机器。
- 遗留问题:
- 应用本身依然是庞大的单体,难以开发和维护。
- 数据库通常仍是单点,虽然可以通过主从复制做读写分离,但写操作瓶颈仍在。
阶段三:分布式系统时代(解决性能与分工)
- 时间:2010年代前后,Web 2.0和大型网站时代
- 演进驱动力:业务复杂度急剧上升,单一应用无法满足性能和专业性要求。
- 要解决的问题:
- 性能瓶颈:将计算密集型、IO密集型的任务分离出来,由专用系统处理。
- 系统分工:让合适的工具做合适的事,提升整体效率。
- 作用与架构模型:
- 架构模型:将单体应用中的某些通用功能拆分出来,形成独立的、分布式的组件。
- 例子:引入独立的分布式缓存(Redis)、分布式搜索(Elasticsearch)、分布式文件存储、消息队列等。
- 作用:
- 实现了“功能级”的拆分与协作:系统不再是简单的复制,而是有了专业分工。
- 大幅提升性能:专用组件处理特定任务,效率远超通用单体应用。
- 遗留问题:
- 核心业务逻辑依然集中在“单体应用”中。这个单体变得更大、更复杂,成了“分布式单体”,它需要与各种分布式组件通信,但内部依然是紧耦合的。
- 架构模型:将单体应用中的某些通用功能拆分出来,形成独立的、分布式的组件。
阶段四:微服务时代(解决业务敏捷性与复杂度)
- 时间:2010年代中期至今,云计算与DevOps成熟期
- 演进驱动力:
- 业务需求快速变化:市场要求极快的迭代速度。
- 团队规模扩大:需要多个团队能够独立并行开发。
- 容器化技术(Docker)和编排工具(K8s)的成熟,为微服务的部署、治理提供了技术基础。
- 要解决的问题:
- 组织沟通成本:大团队协作一个单体,沟通成本高。
- 技术交付速度:希望单个功能可以独立开发、测试、部署,而不影响整个系统。
- 系统弹性:一个功能的故障不应导致整个系统雪崩。
- 作用与架构模型:
- 架构模型:将庞大的单体应用按业务领域拆分成一系列小型、自治的服务。每个服务拥有自己的数据和部署流程。
- 作用:
- 提升了开发敏捷性:小团队可以独立负责一个或多个服务,并行工作。
- 实现了技术异构:不同服务可以根据需求使用不同的技术栈。
- 增强了系统弹性和容错能力:通过熔断、降级等手段,隔离故障。
- 实现了精细化的扩展:只扩展瓶颈服务,节约资源。
总结:演进脉络一览表
| 阶段 | 主要架构 | 要解决的核心问题 | 所起的作用 | 遗留/产生的新问题 |
|---|---|---|---|---|
| 1. 单体时代 | 单体架构 | 如何实现业务功能自动化 | 简单、快速交付 | 扩展性差、技术僵化、交付缓慢 |
| 2. 集群时代 | 单体 + 集群 | 如何保证可用性、应对流量 | 实现高可用、初步水平扩展 | 应用本身仍是复杂单体,数据库是瓶颈 |
| 3. 分布式时代 | 分布式系统 | 如何提升性能、实现专业分工 | 系统级分工,性能大幅提升 | 核心业务仍是“分布式单体”,紧耦合 |
| 4. 微服务时代 | 微服务架构 | 如何提升开发效率、业务敏捷性 | 业务解耦,独立部署,技术自由 | 架构复杂度(网络、数据一致性、调试、治理) |
最终的视角:
这个演进过程,是软件架构为了应对不断增长的规模(流量、数据、团队)和不断变化的业务需求而不断自我进化的结果。它从一个“怎么做出来”的问题,逐步转向“怎么做得好、做得快、做得稳”的问题。
微服务不是终点,它解决了单体时代的敏捷性问题,但也带来了分布式系统固有的复杂性。因此,现在又出现了 Service Mesh(服务网格) 等新范式,来专门处理微服务间的通信复杂度,这正体现了技术不断螺旋上升的发展规律。
分布式系统和微服务架构案例
一个系统,如果仅仅把订单和商品功能物理上分开部署,那它只是一个“分布式系统”。当这些分开的部分被设计成“可以独立部署”的、高度自治的服务时,它就演进成了“微服务架构”。
第一种情况:仅仅是分布式,但不是微服务
- 场景:一个庞大的电商单体应用,它包含了订单、商品、用户等所有模块的代码。为了提升性能,你做了如下部署:
- 在 服务器A 上运行这个应用,但把所有对
/order/*的请求路由到这台机器。 - 在 服务器B 上运行完全相同的应用,但把所有对
/product/*的请求路由到这台机器。
- 在 服务器A 上运行这个应用,但把所有对
- 分析:
- 是分布式吗? 是的。因为订单和商品的功能是由两台不同的服务器协作提供的。
- 是微服务吗? 不是。
- 无法独立部署:如果你想修改商品逻辑,必须重新部署整个应用到服务器B上,而这个应用包依然包含着你根本没动过的订单代码。同样,部署过程中,商品服务会中断。
- 没有独立性和自治性:它们仍然是同一个 monolithic 代码库的两个副本,共享同一个数据库,紧密耦合。
第二种情况:既是分布式,也是微服务
- 场景:
- 订单服务:一个完全独立的Java项目,只包含订单相关的业务逻辑,拥有自己的“订单数据库”。
- 商品服务:一个完全独立的Python项目,只包含商品相关的业务逻辑,拥有自己的“商品数据库”。
- 它们通过明确的API(如HTTP/REST)进行通信。
- 分析:
- 是分布式吗? 是的。和第一种情况一样,它们运行在不同的进程中,通过网络协作。
- 是微服务吗? 是的。
- 可以独立部署:你可以单独修改、测试、重启商品服务,而订单服务完全不受影响。你可以给商品服务扩容10个实例,而订单服务不需要任何改动。
- 技术异构:订单服务用Java,商品服务用Python,这完全没问题。
- 数据库分离:每个服务管理自己的数据,这是微服务的一个关键特征。
核心区别的再强调
“可以独立部署”是微服务区别于其他形式分布式系统的“试金石”。
- 分布式 关注的是 “有没有分开”。
- 微服务 关注的是 “分开后是否独立”。
一个完美的比喻:
- 分布式系统 就像一支军队,有步兵、炮兵、通信兵等不同兵种(分开的模块)协同作战。
- 微服务架构 则要求这支军队的每个兵种都能自给自足、独立行动(独立部署)。炮兵部队可以自行换装新式火炮(技术升级),而不需要等待步兵部队也换上新步枪。通信兵可以单独增加人手(扩容),而不需要请示炮兵部队。
结论
一个系统,如果其组件(如订单、商品)不仅是“分开部署”的,更是被设计为“可以独立开发、独立部署、独立扩展”的、围绕业务能力构建的服务,那么它就是微服务架构。而微服务架构,本身就是分布式系统的一种最佳实践形式。
浙公网安备 33010602011771号