分布式系统架构和微服务架构
1、为什么需要分布式架构?
增大系统容量:单台系统的性能瓶颈,多台机器才能应对大规模的应用场景,所以就需要我们的应用支撑平台具备分布式架构。
加强系统的可用:为了满足业务的SLA要求,需要通过分布式架构消除单点故障,提升系统的可用性。
其他因素:增加功能模块复用、通过模块化加快开发效率、增强系统扩展性。
2、和单体应用相比分布式架构的优缺点是什么?
传统单体架构 | 分布式服务化架构 | |
新功能开发 | 需要时间 | 容易开发和实现 |
部署 | 不经常且容易部署 | 经常发布,部署复杂 |
隔离性 | 故障影响范围大 | 故障影响范围小 |
架构设计 | 难度小 | 难度级数增加 |
系统性能 | 响应时间快,吞吐量小 | 响应时间慢,吞吐量大 |
系统运维 | 运维简单 | 运维复杂 |
新人上手 | 学习曲线大(应用逻辑) | 学习曲线大(架构逻辑) |
技术 | 技术单一且封闭 | 技术多样且开放 |
测试和查错 | 简单 | 复杂 |
系统扩展性 | 扩展性很差 | 扩展性很好 |
系统管理 | 重点在于开发成本 | 重点在于服务治理和调度 |
3、分布式系统存在的问题
- 架构设计变得复杂(尤其是其中的分布式事务);
- 部署单个服务会比较快,但是如果一次部署多个服务,流程会变得复杂;
- 系统的吞吐量会变大,但是响应时间会变长;
- 运维复杂度会因为服务变多而变得很复杂;
- 架构复杂导致学习曲线变大;
- 测试和查错的复杂度增大;
- 技术多元化,这会带来维护和运维的复杂度;
- 管理分布式系统中的服务和调度变得困难和复杂。
总结:分布式系统架构的难点在于系统设计,以及管理和运维。所以分布式架构解决了“单点”和“性能容量”的问题,却新增了其他的问题。这就需要我们用各式各样的技术和手段来解决这些问题。
4、分布式系统的发展
从上图可以看到面向服务的架构可以分为以下三个阶段:
- 20世纪90年代前,是单体架构,软件模块高度耦合(这张图同样也说明了有的 SOA 架构其实和单体架构没什么两样,因为都是高度耦合在一起的)。
- 2000 年左右出现了比较松耦合的 SOA 架构,这个架构需要一个标准的协议或是中间件来联动其它相关联的服务(如 ESB)。 这样一来,服务间并不直接依赖,而是通过中间件的标准协议或是通讯框架相互依赖。
- 2010 年后,出现了微服务架构,这个架构更为松耦合。每一个微服务都能独立完整地运行(所谓的自包含),后端单体的数据库也被微服务这样的架构分散到不同的服务中。而它和传统 SOA 的差别在于,服务间的整合需要一个服务编排或是服务整合的引擎(这个编排和组织引擎可以是工作流引擎,也可以是网关。当然,还需要辅助于像容器化调度这样的技术方式,如 Kubernetes)。
马丁·福勒对微服务描述:https://martinfowler.com/articles/microservices.html
5、微服务的优缺点和解决思路
微服务的出现使得开发速度变得更快,部署快,隔离性高,系统的扩展度也很好,但在集成测试、运维和服务管理等方面就比较麻烦了。所以需要一套比较好的微服务PaaS平台,提供各种配置服务、服务发现、智能路由、控制总线,并且还需要提供各式各样的部署和调度方式。
6、思考
1)分布式系统和微服务架构的关系是什么?
1>.概念
- 微服务架构是一种基于组件化、微分化的设计方法,它将应用程序拆分成小型、独立的服务单元,每个服务单元都具有自己的数据存储、逻辑处理和接口。微服务架构旨在提高应用程序的可伸缩性、可维护性和可扩展性,同时降低开发和维护的成本;
- 分布式系统是指由多个独立组件(或者计算机节点)组成的系统,这些组件可以通过网络相互通信,实现数据存储、处理和传输等功能。分布式系统可以被看作是一种大型的、分布式的数据库或网络应用程序,它通常由多个节点组成,每个节点都有自己的数据和处理能力;
- 分布式架构是分布式系统的一种实现方式,它将分布式系统中的各个组件通过网络通信连接起来,实现数据的存储、处理和传输等功能。分布式架构的设计需要考虑多个方面,包括数据的分布式存储、负载均衡、容错机制等。
2>.分布式系统架构有以下几个主要优点:
-
高可用性:分布式系统可以将应用程序或数据分布在多个节点上,从而提高系统的可用性。即使一个节点失败,整个系统仍然可以正常运行,并及时切换到备用节点上;
-
可扩展性:分布式系统可以轻松地增加或删除节点来扩展系统的处理能力和容量,从而满足不同的需求;
-
可靠性:分布式系统可以将数据和应用程序分布在多个节点上,从而提高数据的安全性和可靠性。此外,分布式系统还支持容错机制,可以在节点失败时自动切换到备用节点上,从而保证系统的正常运行;
-
灵活性:分布式系统可以根据不同的需求和场景进行灵活的设计和配置,以实现最佳的性能和可用性。
分布式系统架构也有一些挑战,例如网络延迟、数据一致性、分布式事务等问题。为了解决这些问题,分布式系统架构通常采用一些常用的技术和工具,例如分布式缓存、消息队列、分布式事务等。
3>.微服务和分布式的区别
- 实践的角度看:可以说微服务架构是分布式架构,反之则未必成立;
- 微服务重在解耦合,使每个模块都独立。分布式重在资源共享与加快计算机计算速度;
- 分布式:分散压力。微服务:分散能力;
- 区别分布式的方式是根据不同机器不同业务:
- 将一个大的系统划分为多个业务模块,业务模块分别部署到不同的机器上,各个业务模块之间通过接口进行数据交互。区别分布式的方式是根据不同机器不同业务。
- 微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上,他也可以是同一个服务器。
- 微服务更加强调单一职责、轻量级通信(HTTP)、独立性并且进程隔离。
2)马丁福勒讲的微服务的精髓是什么?
马丁·福勒对微服务架构的研究和倡导了很长时间,他提出的微服务精髓主要包括以下几个方面:
- 服务化:将应用程序拆分成多个小型的服务单元,每个服务单元专注于完成一项特定的任务,并提供一个简单的、可扩展的接口。服务化的微架构可以提高系统的可伸缩性、可维护性和可扩展性,同时也有利于开发人员更好地专注于服务单元的开发和实现。
- 松耦合:服务单元之间的耦合度应该尽可能地低,以实现更好的可扩展性和可维护性。福勒提出了“单一职责原则”(SRP) 和“开放封闭原则”(OCP) 等原则,以保证服务单元的松耦合和可扩展性。
- 低延迟:微服务应该尽可能地降低延迟,以提高系统的性能和响应速度。福勒提出了“事件驱动”和“低延迟通信”等策略,以实现微服务的低延迟和高效协作。
- 自动化:微服务应该尽可能地实现自动化,以提高系统的可维护性和可扩展性。福勒提出了“自动化测试”、“自动化部署”和“自动化监控”等自动化策略,以实现微服务的自动化和智能化。
- 可观测性:微服务应该尽可能地实现可观测性,以便开发人员可以更好地监控和服务单元的性能、可用性和安全性。福勒提出了“可观测性设计”和“观测中心”等策略,以实现微服务的可观测性。
- 安全性:微服务应该尽可能地实现安全性,以确保系统的安全性和可靠性。福勒提出了“安全设计原则”和“安全审计”等策略,以实现微服务的安全性。
- 可扩展性:微服务应该尽可能地实现可扩展性,以适应系统规模和需求的变化。福勒提出了“水平扩展”和“负载均衡”等策略,以实现微服务的可扩展性。
- 高可用性:微服务应该尽可能地实现高可用性,以确保系统的稳定性和可靠性。福勒提出了“故障转移”和“容错设计”等策略,以实现微服务的高可用性。
- 可定制性:微服务应该尽可能地实现可定制性,以便开发人员可以更好地根据需求定制和服务单元。福勒提出了“可定制设计”和“定制接口”等策略,以实现微服务的可定制性。
- 灵活性:微服务应该尽可能地实现灵活性,以适应系统需求的变化和扩展。福勒提出了“灵活性设计”和“动态规划”等策略,以实现微服务的灵活性。
- 分布式事务:微服务架构通常采用分布式事务来保证数据的一致性和完整性。福勒提出了“单一事务模型”和“提交读锁”等策略,以实现微服务的分布式事务。
- 轻量级服务:微服务应该尽可能地实现轻量级服务,以减少系统的复杂度和功耗。福勒提出了“轻量级设计”和“服务注册与发现”等策略,以实现微服务的轻量级服务。
- 服务治理:微服务应该尽可能地实现服务治理,以确保系统的可用性和可靠性。福勒提出了“服务治理设计”和“服务监控”等策略,以实现微服务的治理。
总的来说,微服务的精髓在于将应用程序拆分成多个小型的服务单元,并以服务化的方式组织这些服务单元,以提高系统的可扩展性、可维护性和可伸缩性。同时,微服务还应该尽可能地实现自动化、低延迟、可观测性、安全性、分布式事务和轻量级服务,以提高系统的性能和可靠性。
7、参考内容:
1、《分布式系统架构的冰于火》;
2、什么是微服务和分布式?微服务和分布式的区别是什么?;
3、ChatGPT。