面向Web应用程序的微服务架构
微服务架构:模式与最佳实践
微服务架构是将应用程序构建为一系列小型独立服务。每个服务专注于特定的业务能力,拥有自己的数据库,并且可以独立部署。这种方法提供了灵活性和可扩展性,但也引入了需要谨慎管理的复杂性。
服务边界:找到正确的拆分方式
微服务架构中最重要的决策是确定服务之间的边界。最佳方法是将服务与业务能力对齐。用户服务处理用户账户和资料。订单服务处理订单。支付服务处理支付。每个服务拥有完整的业务领域,包括其数据和逻辑。
一个有用的技术是从一个结构良好的单体应用开始,然后逐步识别边界。在单体应用中分离关注点时自然出现的模式往往是微服务的正确边界。在理解领域之前过早地拆分为服务会导致分布式单体——两败俱伤。
服务间通信
服务之间需要相互通信。两种主要方法是同步通信(HTTP或gRPC请求)和异步通信(通过队列或事件总线传递消息)。同步更简单,但会产生耦合——如果订单服务调用支付服务,而支付服务很慢,那么订单服务也会变慢。
异步通信解耦服务。订单服务在创建订单时发出事件。支付服务监听此事件并处理支付。如果支付服务宕机,事件会留在队列中,待其恢复后处理。这更具弹性,但更难推理。
数据管理
每个服务应拥有自己的数据。订单服务有自己的数据库,用户服务有自己的数据库,它们不直接共享数据库。这种独立性使得服务可以独立扩展和部署。但这也意味着跨多个服务的操作(例如显示用户的所有订单)需要服务之间的协调。
Saga模式是管理跨多个服务的事务的常见方式。它不是单个数据库事务,而是将操作分解为一系列本地事务,每个事务都有一个补偿操作,在出现问题时撤销该事务。
运维复杂性
微服务需要大量的运维投入。您需要服务发现以便服务之间能够相互发现。您需要API网关为客户端提供单一入口点。您需要分布式追踪来调试跨多个服务的请求。您需要集中式日志记录和监控。您需要为每个服务建立自动化部署管道。
这种运维复杂性是微服务不适合所有项目的主要原因。对于小型团队来说,管理多个服务的开销超过了收益。对于大型组织来说,独立性和可扩展性值得投资。
