微服务架构的优缺点

2019/10/30 25

微服务的优点

它分解了复杂问题

它把可能变得庞大的单体应用程序分解成多套套服务。虽然功能数量不变,但是应用程序已经被分解成可管理的模块或服务。每个服务都有一个明确定义边界的方式,如远程过程调用(RPC)驱动或消息驱动(API)。微服务架构模式强制一定程度的模块化,实际上,使用单体代码来实现是极其困难的。因此,使用微服务架构模式,个体服务能被更快地开发,并更容易理解与维护。

微服务架构使得每个服务都可以由一个团队独立专注开发

开发者可以自由选择任何服务服务 API 契约地技术。当然,更多的组织是希望通过技术选型限制来避免完全混乱的状态。然而,这种自由意味着开发人员不再可能在这种自由的新项目开始时使用过时的技术。当编写一个新服务时,他们可以选择最新的技术。此外,由于服务较小,使用最新技术重写旧服务将变得更加可能。

微服务架构模式可以实现每个微服务独立部署

开发人员根本不需要去协调部署本地到生产。这些变更一经测试即可立即部署。比如,UI 团队可以执行 A|B 测试,并快速迭代 UI 变更。微服务架构模式使得持续部署编程可能。

微服务架构模式使得每个服务能够独立扩展

您可以仅部署满足每个服务的容量和可用性约束的实例数目。此外,您可以使用与服务资源要求最匹配的硬件。例如,您可以在 EC2 Compute Optimized 实例上部署一个 CPU 密集型图像处理服务,并且在 EC2 Memory Optimized 实例上部署一个内存数据库服务。

微服务的缺点

就像 Fred Brooks 大约在 30 年前写的《人月神话》中说的,没有银弹。与其他技术一样,微服务架构模式也存在着缺点。其中一个缺点就是名称本身。微服务这个术语的重点过多偏向于服务的规模。事实上,有些开发者主张构建极细粒度的 10 至 100 LOC(代码行)服务,虽然这对于小型服务可能很好,但重要的是要记住,小服务只是一种手段,而不是主要目标。微服务的目标在于充分分解应用程序以方便应用敏捷开发和持续部署。

微服务另一个主要缺点是由于微服务是一个分布式系统,其使得整体变得复杂。

开发者需要选择和实现基于消息或 RPC 的进程间通信机制。此外,由于目标请求可能很慢或者不可用,他们必须要编写代码来处理局部故障。虽然这些并不是很复杂、高深,但模块间通过语言级方法/过程调用相互调用,这比单体应用要复杂得多。

微服务的另一个挑战是分区数据库架构。

更新多个业务实体的业务事务是相当普遍的。这些事务在单体应用中的实现显得微不足道,因为单体只存在一个单独的数据库。在基于微服务的应用程序中,您需要更新不同服务所用的数据库。通常不会选择分布式事务,不仅仅是因为 CAP 定理。他们根本不支持如今高度可扩展的 NoSQL 数据库和消息代理。您最后不得不使用基于最终一致性的方法,这对于开发人员来说更具挑战性。

测试微服务应用程序也很复杂。

例如,使用现代框架如 Spring Boot,你需要编写一个测试类来启动一个单体 Web 应用程序并测试其 REST API。相比之下,一个类似的测试类对于微服务来说需要启动该服务及其所依赖的所有服务,或者至少为这些服务配置存根。再次声明,虽然这不是一件高深的事情,但不要低估了这样做的复杂性。

微服务架构模式的另一个主要挑战是实现了跨越多服务变更。

例如,我们假设您正在实现一个变更服务 A、服务 B 和服务 C 的需求,其中 A 依赖于 B,且 B 依赖于 C。在单体应用程序中,您可以简单地修改相应的模块、整合变更并一次性部署他们。相反,在微服务中您需要仔细规划和协调出现地变更至每个服务。例如,您需要更新服务 C,然后更新服务 B,最后更新服务 A。幸运的是,大多数变更知乎影响一个服务,需要协调地多服务相对较少。

部署基于微服务地应用程序也是相当复杂的

一个单体应用可以很容易地部署到基于传统负载均衡器的一组相同服务器上。每个应用程序实例都配置有基础设施服务的位置(主机和端口),比如数据库和消息代理。相比之下,微服务应用程序通常由大量的服务组成。例如,据 Adrian Cockcroft 了解到,Hailo 拥有 160 个不同的服务,Netflix 拥有的服务超过 600 个。

每个服务都有多个运行实例

还有更多的移动部件需要配置、部署、扩展和监控。此外,您还需要实现服务发现机制,使得服务能够发现需要与之通信的任何其他服务的位置(主机和端口)。比较传统麻烦的基于票据(ticket-based)和手动的操作方式无法扩展到如此复杂程度。因此,要成功部署微服务应用程序,需要开发人员能高度控制部署方式和高度自动化。

一种自动化方式是使用现成的平台即服务(PaaS),如 Cloud Foundry。PaaS 为开发人员提供了一种简单的方式来部署和管理他们的微服务。它让开发人员避开了诸如采购和配置 IT 资源等烦恼。同时,配置 PaaS 的系统人员和网络专业人员可以确保达到最佳实践以落地公司策略。

自动化微服务部署的另一个方式是开发自己的 PaaS。一个普遍的起点是使用集群方案,如 Kubernetes,于 Docker 等容器技术相结合。

小结

构建复杂的微服务应用程序本质上时困难的。单体架构模式只适用于简单、轻量级的应用程序,如果您使用它来构建复杂应用,您最终会陷入痛苦的境地。微服务架构模式是复杂的、持续发展应用的一个更好选择。尽管它存在着缺点和挑战。

评论