分布式与微服务

简介

微服务是基于分而治之的思想演化出来的。过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们从单独架构发展到分布式架构,又从分布式架构发展到 SOA 架构,服务不断的被拆分和分解,粒度也越来越小,直到微服务架构的诞生。
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。分布式、微服务、分布式微服务的概念是大不相同的,但是这三个概念是息息相关的。微服务是一个持续发展和演变的领域,我们应该保持开放和学习的态度,跟踪行业的最新动态和最佳实践,不断提高我们的设计和开发能力。
本篇文章《分布式与微服务》作为《分布式与云原生》系列的开篇,将先为读者区分这两个核心概念,并分享我在学习并区分这些概念时所遇到的问题与解决思路。

发展史与大众观点

发展史

分布式系统的概念是在==计算机科学==的早期阶段提出的,基于一种理念:将多台计算机网络连接起来,让它们共同完成一项任务,每台计算机都有自己的分布式组件和相应的职责,但是对于用户来说,它们看起来就像一个单一的系统
随着互联网的快速发展和普及,系统的规模和复杂性开始快速增长。为了应对这种情况,技术人员开始寻求更灵活、更可扩展的解决方案,这就催生了服务导向架构(SOA)的概念。SOA强调的是将应用程序构建为一组可复用的服务,这些服务可以通过网络调用。这种架构模式极大地提高了系统的灵活性,因为可以独立地开发、部署和扩展各个服务。
然而,随着业务和技术需求的不断发展,人们开始发现SOA在处理大规模和复杂的应用程序时仍然存在一些挑战。比如,对于大型的、单一的服务应用,一旦出现问题,可能会影响到整个服务的可用性。另外,随着应用的规模不断扩大,代码库可能会变得越来越庞大和难以管理。
微服务架构就是在这样的背景下诞生的。微服务架构将一个大型应用程序分解为一组小的、独立的、松耦合的服务。这些服务各自可以独立地进行开发、测试、部署、扩展和维护。因此,微服务架构相比于传统的SOA,更具有可扩展性、灵活性和故障隔离性。
微服务架构的提出是基于云计算、容器技术(如Docker)、持续集成/持续部署(CI/CD)等技术的快速发展。这些技术降低了服务部署、扩展和运维的难度,使得微服务架构成为可能。

graph LR A["分布式"] B["单体应用"] C["SOA"] D["微服务"] A -->|"分解为多个节点"| B B -->|"服务化、松耦合"| C C -->|"更细粒度的服务化、去中心化"| D

大众观点

在某乎上似乎有部分人在排斥微服务的概念,认为微服务的概念是不清晰的是模糊的也是易于混淆的。微服务架构确实是一种复杂的系统设计模式,对于很多人来说,可能理解起来比较困难。这是因为微服务的概念涉及到许多不同的元素,包括服务之间的通信、数据一致性、服务发现、负载均衡、故障恢复等。并且,因为微服务的定义并不严格,不同的团队和公司可能对其有不同的理解和实践方式,这也可能导致一些混淆和不清晰。
然而,尽管微服务的概念可能有些模糊,但这并不意味着它没有价值或者应该被忽视。事实上,微服务架构为很多大规模和复杂的系统提供了一个有效的解决方案。通过将大型应用程序分解为一系列小的、独立的服务,微服务可以提高开发效率、降低系统复杂性、提高可扩展性和故障隔离。
同时,也需要承认,微服务并不是所有场景下的“银弹”,它也有自己的挑战和限制,比如服务间通信的复杂性、数据一致性问题等,所以在决定是否采用微服务架构时,需要根据具体的业务需求和团队能力进行权衡。

分布式

基本概念

分布式架构是一种软件系统架构,它的任务是在网络中的多台独立计算机(被称为节点)之间分配和协调工作。每个节点都运行着自己的实例,并与其他节点协同工作。分布式系统可以提高可用性和可靠性,因为即使某个节点发生故障,其他节点仍然可以继续提供服务。分布式系统也可以通过添加更多的节点来提高可伸缩性。

架构特点

在一个分布式的Spring应用中,通常会使用Maven的多模块项目结构来管理项目。父模块的pom.xml文件则用来管理公共的依赖和插件。Spring Cloud提供了一系列的框架和库来帮助开发分布式和微服务应用。这包括服务发现、配置管理、路由和负载均衡、断路器等。

微服务

基本概念

微服务架构是一种设计模式,它将大型复杂的应用程序分解为一系列小的、独立的服务。每个服务都有自己的特定角色,通常围绕着特定的业务功能进行设计。每个服务都可以独立开发、部署、扩展和更新,从而实现更好的敏捷性和可维护性。这些服务通过定义良好的 API 和协议(如 HTTP/REST 或 gRPC)进行通信。

架构特点

在一个微服务的Spring应用中,通常会使用Maven的多模块项目结构来管理项目。父模块的pom.xml文件则用来管理公共的依赖和插件。在微服务架构中,每个服务通常都是一个独立的Spring Boot应用,可以单独运行和部署。

分布式微服务

基本概念

分布式微服务是一个将上述两个概念结合起来的架构。在一个分布式微服务系统中,你的应用程序是由许多微服务构成的,这些微服务在分布式环境中运行,即每个服务可能在不同的物理或虚拟机上运行,可能在不同的地理位置。这种架构提供了微服务的所有优点,并允许服务在需要时扩展和收缩,为大规模和复杂的应用程序提供了一个高度可伸缩、可靠和灵活的架构模型。

graph LR D[客户端] -- 请求 --> M1[API网关] subgraph 分布式系统 M1 --> R1[负载均衡] R1 -- 请求转发 --> M2[用户服务] R1 -- 请求转发 --> M3[产品服务] R1 -- 请求转发 --> M4[订单服务] R1 -- 请求转发 --> M5[库存服务] subgraph 微服务架构 subgraph 服务器1 M2 -- 请求 --> DB1[(MySQL)] end subgraph 服务器2 M3 -- 请求 --> DB2[(MySQL)] end subgraph 服务器3 M4 -- 请求 --> DB3[(MongoDB)] end subgraph 服务器4 M5 -- 请求 --> DB4[(SQL Server)] end end end

架构特点

  1. 中间件:在分布式和微服务的架构中,中间件扮演着重要的角色,例如消息队列(如RabbitMQ或Kafka)用于实现异步通信和解耦,数据库和缓存(如MySQL、MongoDB、Redis等)用于存储数据,搜索引擎(如Elasticsearch)用于提供高效的搜索功能,还可能使用各种其他的中间件如分布式锁等。

  2. 服务注册与发现:在分布式和微服务架构中,服务注册与发现是一个重要的部分。Spring Cloud提供了Eureka,Consul等服务注册与发现的解决方案。

  3. API网关:API网关是微服务架构中的重要组成部分,它处理所有微服务的入口流量,对请求进行路由,以及执行各种跨切面的操作,如认证、授权、限流等。Spring Cloud Gateway是Spring Cloud官方推出的基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术的API网关。

  4. 配置管理:分布式和微服务架构中的服务通常需要从一个集中的位置获取配置信息。Spring Cloud Config提供了一种集中化的配置管理方案。

  5. 分布式追踪:在微服务架构中,一个请求可能需要经过多个服务才能完成,为了能够追踪请求的完整路径,需要进行分布式追踪。Spring Cloud Sleuth和Zipkin可以帮助实现这一目标。

以上只是一个概括,实际的应用可能会更加复杂,也会根据实际的需求和场景选择适合的架构模型。

CAP理论

CAP理论是分布式微服务架构中重要的理论,是一个描述分布式系统无法同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三个基本需求的理论。三个基本需求如下:

  1. Consistency:数据强一致性。如果写入某个数据成功,之后读取,读到的都是新 写入的数据;如果写入失败,之后读取的都不是写入失败的数据。所有节点在同一时刻是否可以看到同样的数据。如果系统保证一致性,那么在一个节点上的读操作必须能返回最新的写操作的结果。

  2. Availability:服务可用性。系统提供的服务必须一直处于可用的状态,对于系统的所有请求都能在有限的时间内返回结果。

  3. Partition-tolerance:分区容错性。系统在网络分区(即节点之间无法通信)的情况下,仍然能够正常提供服务。

CAP理论的主要观点是,对于一个分布式系统来说,上述三个需求无法同时满足。换句话说,设计分布式系统时,最多只能满足其中的两项。因为在发生网络分区的情况下,系统必须在一致性和可用性之间做出选择:如果选择保证一致性,那么在网络分区期间,部分节点可能无法获取最新的数据,因此需要停止提供服务;如果选择保证可用性,那么在网络分区期间,各个节点会独立地接收请求和提供服务,可能会导致数据不一致。

小结

分布式与微服务重在概念与理论,这些理论是支撑大型应用项目架构的核心。分布式系统以网络互连的多个独立节点形式出现,这些节点协同工作,向用户提供一致的、统一的服务。分布式系统的目标是使各个节点的集合体能够像单一的系统一样运行,实现资源共享,提高系统性能,提高可用性和可靠性,减少单点故障的可能性。然而,设计和实现分布式系统并不容易,开发者需要面对并解决一系列挑战,比如节点间的通信,数据的一致性,容错和恢复等问题。
而微服务架构则是分布式系统理论应用的一种形式,它将一个大型应用分解为许多独立的小型服务,这些服务都在各自的进程中运行,通过网络调用进行通信和协作。每个服务都有自己的独立的数据库和业务逻辑,可以独立开发、独立部署、独立扩展,具有高度的自治性。微服务架构的目标是实现服务的松耦合和高内聚,提高系统的灵活性和可扩展性,实现持续集成和持续部署,提高开发效率和产品质量。
然而,无论是分布式系统还是微服务架构,实现这些理论需要平衡一系列复杂的因素,比如一致性、可用性和分区容忍性。要在实践中找到合适的平衡点,就需要深入理解这些理论,并结合实际的业务需求和环境来做出决策。
后续我将会围绕这两个概念展开讲述服务发现、服务熔断、服务降级、网关、负载均衡等组件以及其他一些Redis集群、Kafka集群、数据库集群、MQ等数据或通信中间件。

参考文献

[1] Newman, S. (2015). Building Microservices: Designing Fine-Grained Systems. O'Reilly Media, Inc.
[2] Fowler, M., & Lewis, J. (2014). Microservices. ThoughtWorks, Inc. Retrieved from https://martinfowler.com/articles/microservices.html
[3] Richardson, C. (2018). Microservices Patterns: With Examples in Java. Manning Publications Co.
[4] Lewis, J., & Fowler, M. (2014). Microservices: a definition of this new architectural term. Retrieved from https://martinfowler.com/articles/microservices.html
[5] Tanenbaum, A. S., & Van Steen, M. (2007). Distributed Systems: Principles and Paradigms (2nd ed.). Pearson Prentice Hall.
[6] 码一行. (2023). 三分钟彻底弄懂什么是分布式和微服务架构. Retrieved June 16, 2023, from https://juejin.cn/post/7195027200884604987