微服务简介

  • 单体应用

尽管有一个逻辑模块化架构,但应用程序被作为一个单体进行打包和部署。实际格式取决于应用程序的语言和框架。例如,许多 Java 应用程序被打包成 WAR 文件部署在如 Tomcat 之类的应用服务器上。其他 Java 应用程序被打包成自包含 (self-contained) 的可执行 JAR。

在软件开发早期,许多软件开发是面向于企业级的开发,即供企业内部人员使用,此类项目规模较小,用户较少,项目的吞吐量小,需要处理的并发问题少,此时构建单体应用是非常适合的,此时并不适用于微服务架构。

在一个项目早期,用户量较小,项目结构功能较为简单,单体模型可以得到良好的运作。

  • 单体“地狱”

但是,这种简单的方法有着很大的局限性。因为随着时间的推移,一个成功的项目总是变得越来越臃肿,此时随着用户量的增大,项目团队人员不得不满足更多用户的需求,此时意味着更多的代码量。简单的应用最终会成长为一个庞大复杂的单体。

一旦应用程序成为了一个庞大、复杂的单体,开发者们可能会陷入了一个痛苦的境地,敏捷开发和交付的任何一次尝试都将原地徘徊。一个主要问题是应用程序实在非常复杂。对于任何一个开发人员来说显得过于庞大,这是可以理解的。最终,正确修复 bug 和实现新功能变得非常困难而耗时。

应用程序的规模也将减缓发展。应用程序越大,启动时间越长。如果开发人员经常要重启应用服务器,那么很大一部分时间都是在等待中度过,他们的生产力将受到限制。

复杂的单体应用本身就是持续部署的障碍。一方面,如今, SaaS(Software-as-a-Service)应用发展到了可以每天多次将变更推送到生产环境中。这对于复杂的单体来说非常困难,因为您需要重新部署整个应用程序才能更新其中任何一部分。 因为上面提到的启动时间,这成为了软件持续发展进步障碍。另一方面,因变更对项目产生的影响并不明确,这可能需要大量的手工测试。

当不同模块存在资源需求冲突时,单体应用可能难以扩展。例如,一个模块可能会执行 CPU 密集型图像处理逻辑,另一个模块可能是一个内存数据库,此时还要考虑到其他的模块对资源的需求,所以说存在资源需求冲突。然而, 由于这些模块被部署在一起,您必须在硬件选择上做出妥协。

单体应用的另一个问题是可靠性。因为所有模块都运行在同一进程中。任何模块的一个 bug,比如内存泄漏,可能会拖垮整个进程。此外,由于应用程序的所有实例都是相同的,该错误将影响到整个应用的可用性。

最后,单体应用使得采用新框架和语言变得非常困难。如果使用较新的框架来重写整个应用,成本将非常昂贵。因此,这对于采用新技术是一个非常大的障碍。在项目开始时, 您无论选择何种新技术都会感到困扰。

总的来说,如果一个成功的关键业务应用程序,它已经发展成为一个只有少数开发人员(如果有的话)能够理解的巨大单体。它使用了过时、非生产性技术编写,这使得招聘优秀开发人员变得非常困难。应用程序变得难以扩展,不可靠。因此敏捷开发和应用交付是不可能的。

  • 微服务——“应运而生”

微服务的思路是将应用程序分解成一套较小的互连服务。一个服务通常实现了一组不同的特性或功能,例如订单管理、客户管理等。每一个微服务都是一个迷你应用,它自己的架构,其中包括了业务逻辑以及多个适配器。

一些微服务会提供一个供其他微服务或应用客户端消费的 API。其他微服务可能实现了一个 web UI。在运行时,每个实例通常是一个云虚拟机或者一个 Docker 容器。

应用程序的每个功能区域现在都由自己的微服务实现。此外,Web 应用程序被划分为一组更简单的 Web 应用程序。例如,以我们的打车应用为例,一个是乘客的应用,一个是司机的应用。这使得它更容易地为特定的用户、司机、设备或者专门的用例部署不同的场景。每个后端服务提供一个 REST API,大部分服务使用的 API 由其他服务提供。例如, Driver Management 使用了 Notification 服务器来通知一个可用司机一个可选路程。UI 服务调用了其他服务来渲染页面。服务也可以使用异步、基于消息的通信。

一些 REST API 也暴露给移动端应用以供司机和乘客使用。然而,应用不能直接访问后端服务。相反,他们之间的通信是由一个称为 API 网关 (API Gateway) 的中介负责。 API 网关负责负载均衡、缓存、访问控制、 API 计量和监控, 可以通过使用 NGINX 来实现。

使用 Docker 部署一个名为 Trip Management 微服务:

负载均衡

在运行时,Trip Management 服务由多个服务实例组成,每个服务实例是一个 Docker容器。为了实现高可用,容器是在多个云虚拟机上运行的。服务实例的之前是一个类似 NGINX 的负载均衡器(load balance),用于跨实例分发请求。负载均衡器也可以处理其他问题,如缓存、访问控制、API 度量和监控。

微服务架构模式明显影响到了应用程序与数据库之间的关系。与其他共享单个数据库模式服务有所不同, 其每一个服务都有自己的数据库模式。一方面,这种做法与企业级数据库数据模型的想法相悖,而且,它经常导致部分数据冗余。然而,如果您想从微服务中受益,每一个服务都应该有自己的数据库模式。因为它能实现松耦合。此外每个服务都拥有各自的数据库。这样可以使得面向不同需求的微服务使用最适合自己的数据库模式(MySQL,Redis等)。

  • 微服务的优点

  1. 它把可能会变得庞大的单体应用程序分解成一套服务。虽然功能数量不变,但是应用程序已经被分解成可管理的块或者服务。每个服务都有一个明确定义边界的方式,如远程过程调用(RPC)驱动或消息驱动 API。微服务架构模式强制一定程度的模块化,因此,使用微服务架构模式,个体服务能被更快地开发,并且更容易理解与维护。
  2. 这种架构使得每个服务都可以由一个团队独立专注开发。开发者可以自由选择任何符合服务 API 契约的技术。此外,由于服务较小,使用当前技术重写旧服务将变得更加可行。
  3. 微服务架构模式可以实现每个微服务独立部署。开发人员根本不需要去协调部署本地变更到服务。这些变更一经测试即可立即部署。比如,UI 团队可以执行测试,并快速迭代 UI 变更。微服务架构模式使得持续部署成为可能。
  4. 微服务架构模式使得每个服务能够独立扩展。您可以仅部署满足每个服务的容量和可用性约束的实例数目。此外,您可以使用与服务资源要求最匹配的硬件。
  • 微服务的缺点(没有银弹)

首先,微服务这个术语的重点过多偏向于服务的规模。事实上,有些开发者主张构建极细粒度的 10 至 100 LOC(代码行) 服务,虽然这对于小型服务可能比较好,但重要的是要记住,小型服务只是一种手段,而不是主要目标。微服务的目标在于充分分解应用程序以方便应用敏捷开发和部署。

微服务另一个主要缺点是由于微服务是一个分布式系统,其使得整体变得复杂。开发者需要选择和实现基于消息或者 RPC 的进程间通信机制。此外,由于目标请求可能很慢或者不可用,他们必须要编写代码来处理局部故障。

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

测试微服务应用程序也很复杂。例如,使用现代框架如 Spring Boot,只需要编写一个测试类来启动一个单体 web 应用程序并测试其 REST API。相比之下,一个类似的测试类对于微服务来说需要启动该服务及其所依赖的所有服务。

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

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

每个服务都有多个运行时实例。还有更多的移动部件需要配置、部署、扩展和监控。此外,您还需要实现服务发现机制,使得服务能够发现需要与之通信的任何其他服务的位置(主机和端口)。传统方式无法扩展到如此复杂程度。因此,要成功部署微服务应用程序,需要开发人员能高度控制部署方式和高度自动化。(需要PaaS)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值