特性一 组件化和多服务

特性一 组件化和多服务

00:00
05:19

微服务架构的九大特性


虽然不能说存在微服务架构风格的正式定义,但是可以尝试描述我们所见到的能够被贴上微服务标签的那些架构的共性。下面所描述的所有这些共性,并不是所有的微服务架构都完全具备,但是我们确实期望大多数微服务架构都具备这些共性中的大多数特性。尽管我们两位作者已经成为这个相当松散的社区的活跃成员,但我们的本意还是试图描述我们两人在自己和自己所了解的团队的工作中所看到的情况。特别要指出,我们不会制定大家需要遵循的微服务的定义。


特性一:“组件化”与“多服务”


自我们开始从事软件业已来,发现大家都有一个把组件插在一起来构建系统的愿望,就像在物理世界中所看到的那样。在过去几十年中,我们已经看到,在公共软件库方面已经取得了相当大的进展,这些软件库是大多数编程语言平台的组成部分。


当谈到组件时,就会碰到一个有关定义的难题,即什么是组件?我们的定义是,一个组件就是一个可以独立更换和升级的软件单元。


微服务架构也会使用软件库,但其将自身软件进行组件化的主要方法是将软件分解为诸多服务。我们将软件库(libraries)定义为这样的组件,即它能被链接到一段程序,且能通过内存中的函数来进行调用。然而,服务(services)是进程外的组件,它们通过诸如web service请求或远程过程调用这样的机制来进行通信(这不同于许多面向对象的程序中的service object概念[3])。


以使用服务(而不是以软件库)的方式来实现组件化的一个主要原因是,服务可被独立部署。如果一个应用系统[4]由在单个进程中的多个软件库所组成,那么对任一组件做一处修改,都不得不重新部署整个应用系统。但是如果该应用系统被分解为多个服务,那么对于一个服务的多处修改,仅需要重新部署这一个服务。当然这也不是绝对的,一些变更服务接口的修改会导致多个服务之间的协同修改。但是一个良好的微服务架构的目的,是通过内聚的服务边界和服务协议方面的演进机制,来将这样的修改变得最小化。


以服务的方式来实现组件化的另一个结果,是能获得更加显式的(explicit)组件接口。大多数编程语言并没有一个良好的机制来定义显式的发布接口(Published Interface,http://martinfowler.com/bliki/PublishedInterface.html)。通常情况下,这样的接口仅仅是文档声明和团队纪律,来避免客户端破坏组件的封装,从而导致组件间出现过度紧密的耦合。通过使用显式的远程调用机制,服务能更容易地避免这种情况发生。


如此这般地使用服务,也会有不足之处。比起进程内调用,远程调用更加昂贵。所以远程调用API接口必须是粗粒度的,而这往往更加难以使用。如果需要修改组件间的职责分配,那么当跨越进程边界时,这种组件行为的改动会更加难以实现。


近似地,我们可以把一个个服务映射为一个个运行时的进程,但这仅仅是一个近似。一个服务可能包括总是在一起被开发和部署的多个进程,比如一个应用系统的进程和仅被该服务使用的数据库。



[3]许多面向对象的设计者,包括我们自己,都使用领域驱动设计中service object这个术语,来描述那种执行一段未被绑定到一个entity对象上的重要的逻辑过程的对象。这不同于本文所讨论的"service"的概念。可悲的是,service这个术语同时具有这两个含义,我们必须忍受这样的多义词。

[4]我们认为一个应用系统是一个社会性的构建单元(http://martinfowler.com/bliki/ApplicationBoundary.html),来将一个代码库、功能组和资金体(body of funding)结合起来。



以上内容来自专辑
用户评论
  • k2jukm3pcbp6z93k2j8g

    读得真他X傻,特地关注一下来吐槽

  • 春困_gz

    这集的英文有待提高,加油