抽象

本文探讨了 Java Spring Boot 微服务架构中使用的基本组件和设计模式,为开发人员构建可扩展、灵活且有弹性的应用程序提供了全面的指南。
Spring Boot 通过提供一系列用于构建独立生产级应用程序的工具和约定,简化了 Java 应用程序(尤其是微服务)的开发。1

微服务架构是一种方法,其中将大型应用程序分解为较小的、松散耦合的服务,这些服务可以独立开发、部署和扩展。
这种架构增强了灵活性和弹性,使其成为现代软件开发的理想选择。

Spring Boot 通过自动配置和固定默认值来简化配置和设置,为构建微服务奠定了基础。它包括一个嵌入式 Web 服务器,可以轻松创建独立应用程序。

Spring Cloud 是一个伞形项目,提供用于构建和管理微服务的工具。它包括用于服务发现、负载均衡、配置管理、断路器等的模块,这些模块对于微服务的高效通信、可扩展性和弹性至关重要。

服务发现是微服务架构中的关键组件,支持动态扩展和路由。Spring Cloud Eureka 充当服务注册和发现服务器,允许微服务自行注册并发现生态系统中的其他服务。

API 网关模式是使用 Spring Cloud Zuul 实现的,它管理对不同微服务的请求的路由、过滤和负载均衡。这简化了客户端与多个服务的通信,并处理了横切问题。

Spring Cloud Hystrix 提供的 Circuit breaker 模式通过防止因服务中断导致的系统故障来帮助维护系统稳定性。它优雅地处理和管理故障,确保微服务架构的弹性。

“每个服务的数据库”模式对于微服务中的数据管理至关重要。每个微服务都有自己的数据库,保证了数据的一致性和独立性,允许服务独立开发、部署和扩展。2

事件驱动的架构通过使用事件触发操作来促进微服务之间的通信。这种模式增强了解耦和可扩展性,使得管理微服务生态系统中的复杂交互变得更加容易。

Saga 模式用于管理分布式事务并确保微服务之间的数据一致性。它将事务分解为一系列较小的步骤,每个步骤都有自己的补偿操作,以保持一致性和可靠性。

服务发现机制允许微服务查找彼此并相互通信,从而实现动态扩展和负载均衡。这对于保持微服务架构的灵活性和弹性至关重要。3

配置服务器由 Spring Cloud Config Server 提供,用于管理微服务的外部化配置。它集中了不同环境和服务的配置属性,确保了一致性和易于管理。

监视和日志记录对于维护微服务的运行状况和性能至关重要。Spring Cloud Sleuth 等工具提供分布式跟踪,以跟踪各种微服务的请求,从而帮助诊断和排查性能问题。

javarevisited.blogspot.com

 🔧 核心组件

Spring Boot 是一个框架,它通过提供一系列用于构建独立生产级应用程序的工具和约定,简化了 Java 应用程序(尤其是微服务)的开发。
它提供自动配置和自以为是的默认值,使设置和配置 Spring 应用程序变得更加容易。此外,Spring Boot 包括一个嵌入式 Web 服务器,使开发人员可以毫不费力地创建独立应用程序。

微服务架构涉及将大型应用程序分解为较小的、可独立部署的服务。每个服务都专注于特定的业务功能,并通过 API 与其他服务进行通信。
这种方法增强了灵活性、可扩展性和弹性,允许每个微服务独立开发、部署和扩展。

Spring Cloud 是一个伞形项目,提供用于构建和管理微服务的工具。它包括用于服务发现、负载均衡、配置管理、断路器等的模块。
这些工具对于创建强大的微服务架构至关重要,可确保服务能够有效通信并优雅地处理故障。

服务发现是微服务架构中的关键组件。例如,Spring Cloud Eureka 充当服务注册表和发现服务器。
它允许微服务注册自身并发现生态系统中的其他服务,从而实现动态扩展和路由。这确保了服务可以有效地找到彼此并相互通信。

API 网关(例如 Spring Cloud Zuul)用作客户端请求的入口点。它管理对不同微服务的请求的路由、过滤和负载均衡。
这简化了客户端与多个服务的通信,并处理了身份验证、授权和速率限制等横切问题。

负载均衡是 Spring Cloud 提供的另一个重要组件。它将传入的请求分布在微服务的实例之间,以确保均匀的负载分布和高可用性。
Ribbon 是一种客户端负载均衡器,通常用于此目的,可增强微服务的弹性和性能。

配置管理由 Spring Cloud Config Server 处理,它管理微服务的外部化配置。
它集中了不同环境和服务的配置属性,从而可以更轻松地管理和更新配置,而无需重新部署服务。

由 Spring Cloud Hystrix 实现的断路器模式有助于防止由于服务中断而导致的系统故障。
它提供了一种机制来优雅地处理和管理故障,确保一个服务中的故障不会级联到其他服务,从而维护系统稳定性。

Spring Cloud Sleuth 提供的分布式跟踪对于跟踪各种微服务的请求至关重要。它通过提供对请求流的见解并识别系统中的瓶颈或故障来帮助诊断和排查性能问题。

Swagger 或 Springfox 等 API 文档工具通常与 Spring Boot 一起使用,以生成 API 文档并提供用于测试 API 的交互式 UI。
这使开发人员更容易理解不同微服务提供的 API 并与之交互,从而增强了开发人员的体验。

Spring Security 用于处理微服务中的身份验证和授权,确保只有授权用户才能访问某些资源。这对于维护微服务架构的安全性和完整性至关重要。

Docker 和 Kubernetes 等容器化和编排工具通常用于部署、管理和扩展微服务容器。虽然不是 Spring Boot 本身的一部分,但这些工具对于在生产环境中管理微服务的生命周期至关重要。

 📜 服务注册表

服务注册中心是微服务架构中的关键组件,充当跟踪系统内所有服务的中心枢纽。
每个微服务在启动时向服务注册表注册其关键信息(如 IP 地址和端口号),并在关闭时取消注册。
这种动态注册和注销功能可实现服务之间的无缝通信,从而确保系统保持灵活性和效率。4

服务注册中心还会对已注册的服务进行健康检查,实时更新其状态。这确保了只有健康的服务实例才能进行通信,从而增强了整体系统的可靠性。
例如,如果服务实例崩溃或无响应,服务注册表将更新其状态并阻止其他服务尝试与其通信。

服务发现与服务注册中心紧密相连。它解决了在动态环境中定位服务的挑战,在这种环境中,IP 地址可能会频繁更改,尤其是在容器化部署中。
有两种类型的服务发现:客户端和服务器端。在客户端发现中,客户端直接查询服务注册表以查找服务实例的位置,从而减少所需的网络跃点数。5

在服务器端发现中,客户端通过负载均衡器间接查询服务注册表。此模型简化了客户端代码,但引入了更多需要维护和监视的组件,这可能会因额外的网络跃点而增加延迟。
服务发现实现的示例包括用于客户端发现的 Netflix Eureka 和用于服务器端发现的 AWS ALB。

服务注册中心不仅促进了服务的发现,而且在维护系统的弹性和可扩展性方面也起着至关重要的作用。
通过保持所有可用服务的最新映射,它允许系统动态地适应变化,例如根据需求扩大或缩小服务。这种适应性对于在微服务架构中保持高可用性和性能至关重要。6

 🔄 断路器

断路器模式是微服务架构中的关键设计模式,旨在通过防止级联故障来维护系统稳定性。它起到保护措施的作用,如果服务运行不正常,则停止请求和响应过程。
如果客户端向多个服务发送请求,而其中一个服务已关闭,则会导致潜在的资源耗尽和性能下降,则此模式特别有用。7

当服务反复失败时,断路器模式会跳闸,从而在指定的超时期限内停止对有问题的服务的进一步请求。
在此期间,任何调用服务的尝试都将立即失败,从而防止系统将资源浪费在无响应的服务上。超时后,断路器允许通过有限数量的测试请求。
如果这些请求成功,则恢复正常操作;否则,超时期限将再次开始。

断路器模式以三种状态运行:闭合、开路和半开。在闭合状态下,熔断器允许所有请求正常通过。
当故障次数超过预定义的阈值时,断路器将转换为打开状态,在此状态下,所有请求都将被阻止并立即失败。
半开状态是一个过渡阶段,在这个阶段,断路器允许一些测试请求来确定服务是否已恢复。8

实施 Circuit Breaker 模式可以显著提高微服务架构的容错能力和弹性。通过隔离故障服务,它可以防止关键资源的耗尽,并维护整个系统的稳定性。
这种模式在分布式系统中特别有效,在分布式系统中,一个服务的故障可能导致整个系统的故障连锁反应。9

在依赖于支付服务的电子商务应用程序中可以看到断路器模式的一个实际示例。
如果支付服务开始失败或响应缓慢,断路器将跳闸,阻止进一步的请求并显示用户友好的错误消息。
这种方法不仅可以保留系统资源,还可以通过在服务中断期间提供明确的反馈来改善用户体验。

Netflix Hystrix 是 Circuit Breaker 模式的著名实现。它为定义回退机制提供了一个强大的框架,当断路器跳闸时可以使用该回退机制。
这确保了即使服务关闭,系统仍然可以提供降级但功能正常的响应,从而增强应用程序的整体弹性和可靠性。

 🚪 API网关

API 网关模式是微服务架构中的关键组件,充当所有客户端请求的单一入口点。
此模式解决了在应用程序分解为较小的自治服务时出现的几个挑战,例如将请求路由到适当的微服务和处理多个协议请求。

API 网关的主要功能之一是充当反向代理,将客户端请求转发到适当的微服务。
这不仅简化了客户端代码,而且抽象了微服务的内部结构,使客户端能够与统一的API进行交互,而无需了解服务分区的细节。

API 网关还可以处理数据转换,将协议请求从一种类型转换为另一种类型,例如从 AMQP 转换为 HTTP。
此功能可确保不同的客户端(无论是 Web 应用程序、移动应用程序还是其他服务)都可以与微服务无缝通信,无论它们使用何种协议。10

除了路由和协议转换之外,API 网关模式还可以卸载横切问题,例如身份验证、授权、SSL 终止和缓存。
通过集中这些职责,API 网关增强了安全性和性能,减少了攻击面并确保敏感数据受到保护。

API 网关的另一个显著优势是它能够聚合来自多个微服务的数据。这意味着单个客户端请求可以扇出到多个服务,并且结果可以合并并作为单个响应返回。
这种聚合减少了获取数据所需的往返次数,从而提高了应用程序的效率和用户体验。

但是,实施 API 网关确实会给系统带来额外的复杂性。尽管如此,简化的客户交互、增强的安全性和高效的数据处理的好处往往大于缺点。
通过将一些逻辑从客户端应用程序移动到网关,整体架构变得更加易于管理和可伸缩。

综上所述,API 网关模式是微服务架构中必不可少的设计模式。
它为客户端请求提供统一的入口点,处理横切关注点,并聚合来自多个服务的数据,同时抽象出微服务的内部结构。
这使它成为构建可扩展、安全和高效的微服务应用程序的强大工具。

📊 每个服务的数据库

在微服务架构中,“每个服务的数据库”模式是一个基本设计原则,可确保每个微服务都有自己的专用数据库。
这种方法对于保持每个服务的独立性和自主性至关重要,允许它们独立开发、部署和扩展,而不会影响其他服务。

“每个服务数据库”模式的主要优点之一是数据隔离。通过拥有单独的数据库,每个服务都可以管理自己的数据,而不会受到其他服务的干扰。
这种隔离增强了数据的完整性和安全性,因为服务无法直接访问彼此的数据。

“每个服务的数据库”模式还允许更好的性能优化。
每个服务都可以根据其特定需求选择最合适的数据库技术,无论是关系数据库(如 MySQL 或 PostgreSQL)、NoSQL 数据库(如 MongoDB 或 Cassandra),甚至是基于云的数据库(如 AWS RDS 或 Google Cloud SQL)。

另一个显著优势是能够独立扩展服务。由于每个服务都有自己的数据库,因此扩展特定服务不需要更改其他服务的数据库。
服务和数据库的这种解耦简化了扩展过程,并增强了系统的整体灵活性。

但是,实施“按服务数据库”模式也带来了挑战,特别是在管理分布式事务和确保服务之间的数据一致性方面。
为了解决这些问题,可以采用像 Saga 模式这样的模式,该模式通过将分布式事务分解为一系列更小、可管理的事务来管理分布式事务。

尽管存在这些挑战,但“按服务数据库”模式仍然是微服务架构的基石。
它不仅支持微服务的核心原则(如松耦合和高内聚),而且还为构建可扩展、灵活且有弹性的应用程序提供了一个强大的框架。

📡 事件驱动架构

在事件驱动的体系结构中,当一个服务执行其他服务需要了解的操作时,它会发出一个事件,即该操作的记录。然后,其他服务会根据需要对事件做出反应。
这是解耦服务的一种强大方法,并允许高度可扩展和强大的系统。

通过此体系结构,您可以构建更易应对故障的系统,因为服务不需要相互了解。如果一个服务失败,它不会影响其他服务。
此外,此体系结构还具有高可扩展性,因为您可以在不影响现有服务的情况下向系统添加新服务。

在处理请求时,微服务需要交换数据。对于稳定、高度可扩展的系统,它们应该通过交换“事件”进行异步通信。在一些传统的数据库中,具有当前“状态”的业务实体是直接存储的。
通过事件溯源,可以存储任何状态更改(或重要)事件来代替实体。

可以通过回收业务实体中的所有事件来推断业务实体的状态。
不同的服务可以从事件存储中重播事件,以确定其各个数据存储的正确状态(因为数据存储为一系列事件,而不是通过直接更新存储)。

此模式使每个服务都能够保持一致性,而无需同步通信。开发人员还可以查询事件以跟踪更改并对应用程序的状态进行任何必要的调整。

当开发人员想要捕获实体状态中的所有更改时,在微服务中使用事件溯源设计模式。使用 Kafka 等事件存储或替代方案将有助于跟踪事件更改,甚至可以充当消息代理。
消息代理有助于不同微服务之间的通信,监控消息并确保通信的可靠性和稳定性。

为了实现此功能,事件溯源模式存储了一系列状态更改事件,并可以通过重放实体的出现来重建当前状态。
当事务对应用程序至关重要时,在微服务中,使用事件溯源是一个可行的选项。当需要避免对现有数据层代码库进行更改时,这也非常有效。

事件溯源基于这样一种思想,即实体状态的任何变化都应该被系统捕获。业务项的持久性是通过存储一系列状态更改事件来实现的。
每次对象的状态更改时,都会将新事件添加到事件序列中。它本质上是原子的,因为它是一个动作。

通过重放实体的出现,可以重建其当前状态。事件存储用于跟踪所有事件。事件存储充当消息代理以及事件数据库。
它使服务能够通过 API 订阅事件。

事件存储向所有感兴趣的订阅者发送有关保存在数据库中的每个事件的信息。在事件驱动的微服务架构中,事件存储是基础。
此模式可用于以下情况:必须保留现有数据存储,并且不应更改现有数据层代码库。

 🔄 佐贺模式

saga 模式是微服务架构中的关键设计模式,用于解决在多个服务之间维护数据一致性的挑战。
与依赖于两阶段提交事务的传统单体系统不同,saga 模式将事务分解为一系列本地事务,每个事务都由单独的服务管理。
这种方法可确保每个服务都可以独立处理其事务部分,从而提高体系结构内的灵活性和可伸缩性。

在微服务架构中,saga 本质上是一个高级业务流程,它由多个子请求组成,每个子请求都在单个服务中更新数据。
如果本地事务失败,则执行补偿事务以撤消更改,从而保持数据一致性。此模式可以通过两种主要方式实现:编排和编排。
在编舞方法中,没有中央协调员;每个服务都生成并侦听事件,并独立决定是否执行操作。

另一方面,编排方法涉及一个中央编排器,该编排器管理事件和决策的顺序。编排器指示参与者执行哪些本地事务,从而确保过程更加可控和协调。
在需要中央机构来管理工作流和处理异常的复杂业务流程中,此方法特别有用。

saga 模式的一个显著优点是它能够保持系统可靠性和数据一致性,而无需服务之间的紧密耦合。
这在事务跨多个服务的场景中尤其有用,例如在电子商务应用程序中,订单和客户信用由不同的服务管理。
通过允许每个服务独立管理其事务,saga 模式增强了系统的整体弹性和容错能力。

然而,实现 saga 模式也有其自身的一系列挑战。它需要更复杂的编程模型,因为开发人员必须设计补偿事务来处理故障并确保服务之间的协调。
尽管存在这种复杂性,但使用 saga 模式的好处(例如提高数据一致性和系统可靠性)使其成为微服务架构工具包中的宝贵工具。

 🔍 服务发现

服务发现是微服务架构中的关键组件,它使服务能够动态定位并相互通信。
此机制对于维护系统的灵活性和可伸缩性至关重要,因为它允许服务在启动和停止时自行注册和注销,从而确保系统始终具有可用服务的最新视图。

服务发现有两种主要类型:客户端和服务器端。在客户端发现中,客户端直接查询服务注册表以查找服务实例的位置。
此模型减少了所需的网络跃点数,但需要在每个客户端中实现服务发现逻辑,从而增加了复杂性。

另一方面,服务器端发现涉及客户端通过负载均衡器间接查询服务注册表。
此方法简化了客户端代码,但引入了需要维护和监视的其他组件,这可能会因网络跃点增加而增加延迟。服务器端发现的示例包括 AWS ALB,而 Netflix Eureka 是一种流行的客户端发现工具。

服务注册表是一个数据库,用于存储每个服务实例的元数据,例如 IP 地址和端口号。当服务启动时,它会向服务注册表注册其详细信息,而当它停止时,它会取消注册自身。
此注册表还执行运行状况检查,以确保只有正常运行的实例才能进行通信,从而增强系统的整体可靠性。

服务发现机制对于微服务架构中的动态扩展和负载均衡至关重要。通过维护更新的服务实例注册表,系统可以有效地分配流量,并根据需求扩大或缩小服务规模。
这种动态扩展确保了最佳的资源利用率和系统性能,即使在不同的负载下也是如此。

 ⚙️ 配置服务器

在微服务架构中,跨多个服务管理配置数据可能具有挑战性。配置服务器模式通过外部化配置来解决此问题,允许服务在不同的环境中运行而无需修改。
此模式对于在动态微服务生态系统中保持一致性和灵活性至关重要。

Spring Boot 是一种流行的微服务构建框架,支持通过 Spring Cloud Config 进行外部化配置。这允许应用程序从各种源(如 Git 存储库)读取配置,并根据读取顺序动态更改设置。
此功能对于适应不同的环境和管理敏感数据(如数据库凭据和密钥)至关重要。

要在 Spring Boot 中设置配置服务器,您需要创建一个 ConfigServerApplication 类,并使用 @EnableConfigServer 和 @EnableDiscoveryClient 注释激活发现客户端和配置服务器。
此设置使应用程序能够向体系结构中的其他微服务提供配置数据。

Spring Boot 配置服务器的一个示例配置包括在application.yml文件中设置服务器端口和应用程序名称。此外,您还可以指定存储配置文件的 Git 存储库的 URI。
此设置可确保所有微服务都可以从一个集中位置访问其各自的配置文件,从而提高一致性和易管理性。

Spring Cloud Config 与 Eureka 等服务发现机制无缝集成。
通过在 application.yml 文件中配置 Eureka 客户端,配置服务器可以将自身注册到 Eureka 服务器,从而使其他微服务能够动态地发现并连接到它。
这种集成对于维护可扩展且具有弹性的微服务架构至关重要。

总之,Spring Boot 微服务架构中的配置服务器模式在管理配置数据方面起着举足轻重的作用。
通过外部化配置并与服务发现集成,它确保微服务能够适应不同的环境,保持一致性,并安全地管理敏感数据。
此模式对于构建可扩展、灵活且具有弹性的微服务应用程序至关重要。

📈 监控和日志记录

在微服务架构中,监视和日志记录对于维护系统的运行状况和性能至关重要。鉴于微服务的分布式特性,传统的监控工具往往无法满足需求。
因此,必须建立一个强大的流程,以便在一个集中位置主动监控数据存储。
这种方法有助于反映频繁的更改,而不会影响系统的性能,从而确保开发人员可以有效地跟踪整个过程。11

微服务中的关键可观察性模式之一是分布式跟踪。此模式为每个请求分配一个唯一的 ID,记录有关调用的服务和执行的操作的信息。
这使开发人员能够从头到尾跟踪请求,帮助他们确定任何问题的根本原因。
分布式跟踪对于监视服务交互方式和查明延迟问题特别有用,从而增强了整体系统性能。

日志聚合是监视微服务的另一种基本模式。每个微服务都会生成一个关于其活动的标准化日志文件,该文件可以由集中式日志记录服务进行编译。
此服务对来自不同微服务的日志进行规范化和整合,并将它们存储在集中式平台上。然后,开发人员可以搜索和分析这些日志,创建由特定问题消息触发的警报。
此模式简化了问题的解决,并提供了系统行为的全面视图。

性能指标对于监控微服务架构的运行状况至关重要。此模式涉及收集有关单个操作的数据(例如延迟和 CPU 性能),并将其合并到单个指标服务中。
此服务提供报告和警报功能,提供微服务基础结构执行方式的综合视图。
有两种模型:推送(服务将指标推送到指标服务)和拉取(指标服务从服务中提取指标)。

Spring Boot 的可选插桩框架 Micrometer 将指标直接发送到 Prometheus、Atlas 和其他监控工具,以提供有价值的见解。Spring Cloud 的 Sleuth 和 Zipkin 项目对此进行了补充,它们提供了分布式跟踪功能。
这些工具使开发人员能够实时跟踪正在发生的事情,确保微服务以最佳方式运行,并及时解决任何问题。12