微服务架构和单体应用架构

微服务架构

微服务是一种软件架构风格,由 Martin Fowler 提出来。

软件开发领域没有银弹,一个架构或者框架有好的一面,一定也有不好的一面。

微服务架构定义

  • 开发单个应用的一种开发模式。

  • 单个应用作为小型服务套件的一部分。

  • 每个应用都运行在自己的进程中。

  • 应用于应用之间的通信,是通过轻量级的机制,通常是 HTTP 的资源 API。

  • 服务通常围绕业务能力进行构建。

  • 服务可以独立部署。

  • 服务之间没有中央化的管理模式。

  • 每个服务可以通过不同的编程语言来编写,可以使用不同的数据存储技术。

微服务变得复杂的地方

  • 事务

    事务处理会变得非常复杂。

  • 部署

    进行细粒度的功能拆分以后,会多出多个项目,每个都项目需要部署。

  • 调用链追踪

    为了快速定位可能产生的问题,需要对整个调用链非常清楚。

传统单体架构

单体应用

一个单体应用通常构建为一个独立的单元。

企业应用

企业应用通常是构建在三个主要部分之上。

  • 客户端用户界面

    包含 html、js

  • 数据库

    包含表、关系数据库、数据库管理系统

  • 服务端应用

    处理 http 的请求,执行领域逻辑,获取、更新数据库的数据,选择并且装配 html 视图,并且把视图发送给浏览器。服务端应用是一个单体的可执行的逻辑。对于系统的任何修改,都涉及到构建、部署服务端应用的一个新版本。

两种架构风格对比

这种单体的服务器,是一种这样系统自然而然的构建方式。用于处理一个请求的所有的逻辑都会运行在一个单个的进程当中,这样的话,就可以使用编程语言的基本特性,将应用分解成类、函数、命名空间。可以水平的对单体应用进行可伸缩的处理(扩容、减容),方式就是在一个负载均衡器后面运行多个实例。

单体应用非常成功,但是逐渐地人们开始对它们感受到沮丧,特别是有更多的应用被部署到云端的时候,这种变化都联系到了一起,对于一个应用任何一个非常很小的修改和改变,都需要让整个单体应用进行一次重新构建和部署。随着时间的推移,我们很难保持很好的模块化结构,这个使得保持只对一个模块的变更变得越来越困难了。可伸缩就要求整个应用进行可伸缩,而不是应用的部分进行可伸缩,这种做法就需要更多的资源。

比如:我只想对商品详情页面进行更好的可伸缩,而公告、投诉这些模块不需要,要是单体应用就只有整个应用一起可伸缩了,不能只针对一个具体的模块进行可伸缩。

单体应用的可伸缩

一个单体应用会将它所有的功能都放置在一个进程中,单体应用典型的表现形式。通过复制这个单体应用在多个机器上面,比如要部署 4 个单体应用,就需要复制成 4 份,分别放置在 4 台机器上。通过在多个服务器上去复制一个单体应用的实例来完成可伸缩,而且每一台机器的实例内容都是一样的。

微服务应用的可伸缩

微服务架构会将每一个功能元素放置在单独的服务当中,服务与服务之间是完全独立的。通过跨服务器来分发这些服务,在需要的时候才进行复制。非常的灵活,完全根据需要来复制。而且每一台机器的实例内容可以一样,也可以完全不一样。

可伸缩对比

如下图所示(左边为单体应用,右边为微服务应用):

这些沮丧导致了微服务架构风格的出现,构建应用做为服务的套件,服务是独立的、可部署的、可伸缩的。每一个服务都提供了一个坚实的模块边界,甚至允许不同的服务可以用不同的编程语言来编写,它们还可以由不同的团队来进行管理。

我们不会去表明微服务架构风格是非常创新卓越的,它可以追溯到 Unix 的设计原则。但是我们认为,并没有太多的人去考虑过这种微服务架构。并且我们也会认为,很多软件开发如果使用了微服务架构,都会从中获益匪浅。

参考资料

Martin Fowler

Last updated