Martin Fowler关于微服务的原文翻译(一)

原文如下:http://martinfowler.com/articles/microservices.html

微服务

一个新的架构术语

“微服务架构”一词是在过去几年里涌现出来的,它用于描述一种独立部署的软件应用设计方式。这种架构方式并没有非常明确的定义,但有一些共同的特点就是围绕在业务能力、自动化布署、端到端的整合以及语言和数据的分散控制上面。

“微服务”- 这是在软件架构领域这个非常拥挤的街道上,冒出的一个新名词而已。虽然我们对这个新出的名词不屑一顾,但是它所描述的软件系统的风格越来越吸引我们的注意力。在过去的几年里,我们发现越来越多的项目开始使用这个风格,并且到目前为止得到的反馈都是积极的,以至于我身边的许多同事在设计企业架构时,都把它作为默认的构建方式,然而很不幸,到底什么是微服务,我们又如何来使用它,外界并没有太多的信息可供参考。

总之,微服务这种架构风格就是把一组小服务演化成为一个单一的应用的一种方法。每个应用都运行在自己的进程中,并通过轻量级的机制保持通信,就像HTTP这样的API。这些服务要基于业务场景,并使用自动化布署工具进行独立的发布。可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

在开始解释什么是微服务之前,先介绍一下单体应用还是很有用的:把一个单体应用构建成为一个部分。企业应用通过是由三个重要部分组成:客户端界面(由HTML、Javascript组成,使用浏览器进行访问)、数据库(由许多的表组件构成一个通用的、相互关联的数据管理系统)、服务端应用。服务端应用处理HTTP请求、执行领域逻辑、检索并更新数据库中的数据、选择和填充HTML视图发送给客户端。这个服务端应用是一个单块结构也就是一个整体,这是一个可执行的单一逻辑,系统中的任何修改都将导致服务端应用重新编译和布署一个新版本。

就这样一个单体应用很自然的被构建成了一个系统,虽然可以使用开发语言基本特性会把应用封装成类、函数、命名空间,但是业务中所有请求都要在单一的进程中处理完成,在某些场景中,你可以在开发人员的笔记本电脑中运行和测试,并且通过布署通道将测试通过的程序布署到生产环境中,你还可以水平扩展,利用负载均衡将实例布署到多台服务器中。

的确,单体应用也是很成功的,但是越来越多的人感觉到了不妥,特别是应用程序被发布到了云的时候,变更发布周期被绑定了 —- 原来可以划分成小的应用、小的需要的变更,需要统一的进行编译和发布。随着时间的推移,软件开发者很难保持原有好的模块架构,使得一个模块的变更很难不会影响到其它的模块,而且在扩展方面也只能进行整体的扩展,而不能根据进行部分的扩展。
这里写图片描述

这些原因导致了微服务架构风格的出现:以服务构建应用。这些服务还可以被独立布署、独立扩展,每个服务也都提供了清晰的模块边界,甚至不同的服务都可以使用不同的编程语言来实现,也可以由不同的团队进行管理。

微服务的概念不是我们发明的,它至少起源于Unix时代的设计原则,我们认为这种风格所带来的好处,并没有引起足够多人的重视。

微服务架构特征

我们没有办法对微服务有一个正式的定义,但我们可以尝试表述适合这种架构的共同特征来给它打上特性标签,共同特性并不代表每个服务都具备这些特点,但是我们真的期望大多数微服务架构能具备其中大部分特点。虽然我们的作者已经是松散社区的核心成员,但是我们也在尝试描述我们工作中或者我们了解的组件中所理解的微服务。我们并不依赖于那些已经明确过的定义。

组件化与服务

只要我们一直在从事软件行业,我们的愿望就是,软件由很多组件组装在一起,如同物理现实世界中类似的构造方式。在过去的几十年里,我们已经看到了大部分语言平台公共库有了长足的进步。

当我们在谈论组件时,我们遇到了组件定义方面的困难,我们给定的定义是:一个组件是软件中的一个部分,可以独立的替换和升级。

微服务也会使用组件库,将一个软件组件化的主要方式就是将其分解成服务,我们定义的库是可以连接到程序并使用内存函数的的组件库,服务是进程外的组件,如Web请求服务或者远程调用来相互通信的组件。(这种定义的方式与其它面向对象程序中服务对象的概念是不一样的。)

把服务当成组件(而不是组件库)的一个原因是服务可以独立布署,如果你有一个应用是由多个库组成并且运行在一个进程中,那么任何一点的改变都会引起整个应用的重新发布,但是将这个应用拆解为多个服务,你可以期待每个服务的变更仅需要发布相应的服务就可以,当然这也不是绝对的,比如导致服务接口变更的更新就需要相应服务的变化,但是良好的架构设计是通过聚合服务边界并且按照合约实现服务演化,最大限度地减少因为改变影响其他地方。

把服务当成组件的另一个考虑是这会拥有更加清晰的接口,大多数的语言并没有一个很好的机制来定义一个明确显式的发布接口,通常只有文档和规范说明,让用户避免组件间过度紧密而导致高耦合,通过显示的远程调用机制,可以避免这种情况。

使用服务也有其自身的缺点,远程调用比进程内部调用更加消耗性能,而且远程的API往往是粗粒度的,用起来不是很友好,对组件的职责进行变更,也会影响到进程间的交互,那么操作起来也比较困难。

第一个可能性,我们看到每个服务是运行在独立的进程上的。注意,这只是第一个可能性。服务也可以由多个进程组成,它们是同时开发和部署的,如果一个应用进程和一个仅由该服务使用的数据库。

围绕业务能力进行组织

当我们把一个大的应用拆分成小的部分时,我们的注意力主要集中在技术层面,拆分成UI团队、服务端的逻辑团队和数据库团队。当使用这种标准对团队进行划分时,甚至一个非常小的更变都将导致跨团队间项目协作,从而消耗时间和预算审批。一个高效的团队会针对这种情况进行改善,关注它们所涉及的应用逻辑,并从中做出较好的选择。换句话说,逻辑无处不在。康威定律就是一个例子。

一个组织的沟通结构反映了其设计的系统的结构

-- Melvyn Conway, 1967

这里写图片描述

微服务的划分方法有所不同,它更倾向于围绕业务功能对服务结构进行划分、拆解,这些服务可以采用不同的技术栈来实现,包括用户界面,持久层存储,或任何对外协作,因此团队应该是跨职能的,包括开发所需要的全部技术:用户体验、数据库和项目管理。

这里写图片描述

按照这种方式组织的公司是 www.comparethemarket.com,跨职能团队负责建立和操作每个产品并且每个产品都被分成若干单独的服务通过消息进行通信。

大型的单体应用也可以按照业务功能进行模块化的,尽管这种例子不常见。当然,我们也会敦促一个大型团队在构建一个单体应用时按照业务线来进行划分,我们能看到主要问题在于,这种组件形式会导致很多的上下文依赖,如果这个系统跨越很多模块边界,对于一个单独团队是很难在短时间解决问题的。此外,我们发现模块化方式需要大量的规范去强制执行,而服务组件明确的划分,使得团队间的边界也变得清晰起来。

产品不是项目

大多数的开发工作是使用这样一种模型:其目的是完成可以交付的软件,软件开发完成就交给了维护团队,该项目组也就解散了。

微服务的支持者建议避免这种模型,认为一个团队应该负责产品的整个生命周期,一个很通用的概念就是Amazon’s的“you build, you run it”,它要求开发团队对软件产品的整个生命周期负责,这使得开发人员可以每天都关注产品的运行情况,而且也能够与用户保持紧密的联系,做一些必要的支持工作。

产品方式开发意味着与业务能力紧紧捆绑在一起,而不是将软件看成是一系列完成的功能,他们会关注如何让软件帮助其用户提升业务能力。

单体应用也可以采用上述产品的理念,但是更小粒度的服务可以更容易的创建开发者与用户之间的关系。

智能终端与弱管道

当在不同的进程之间构建各种通信结构时,我们已经看到许多产品和方法,来强调将大量的智能特性融入到通信机制本身,这种情况的一个典型例子就是“企业服务总线”(Enterprise Service Bus,ESB)。ESB产品经常包括高度智能的设施来进行消息的路由、编排、转换,并应用业务规则。

微服务社区主张采用另一种做法:智能终端和弱管道。使用微服务所构建的各个应用的目标都是尽可能实现“高内聚和低耦合”–他们拥有自己的领域逻辑,并且更多的是经典的UNIX的“过滤器”那样工作–即接收请求、处理逻辑、返回响应,这些应用通过使用简单的REST风格的协议来进行编排,而不去使用复杂的协议,比如:WS、BEPL或者集中式工具进行编排。

有两种协议最经常被使用到:包含资源API的HTTP的请求-响应和轻量级消息通信协议。最为重要的建议为:

微服务团队采用这样的原则和规范:基于互联网(广义上,包含Unix系统)构建系统。这样经常使用的资源几乎不用什么的代价就可以被开发者或者运行商缓存。

第二种做法是通过轻量级消息总线来发布消息。这种的通信协议非常的单一(单一到只负责消息路由),像RabbitMQ或者ZeroMQ这样的简单的实现甚至像可靠的异步机制都没提供,以至于需要依赖产生或者消费消息的终端或者服务来处理这类问题。

在一个单块系统中,各个组件在同一个进程中运行。它们相互之间的通信,要么通过方法调用,要么通过函数调用来进行。将一个单块系统改造为若干微服务的最大问题,在于对通信模式的改变。仅仅将内存中的方法调用转换为RPC调用这样天真的做法,会导致微服务之间产生繁琐的通信,使得系统表现变糟。取而代之的是,需要用更粗粒度的协议来替代细粒度的服务间通信。

  • 18
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Martin Fowler是一位资深的软件工程师和重构领域的权威,他是《重构:改善既有代码的设计》的作者。他的这本书是现代软件开发中关于重构的经典之作,演示了如何通过重构提高代码质量和可维护性。 针对Martin Fowler重构的epub版本,我认为由于电子书可以方便地进行修改和更新,可以通过重构来改进书籍的质量和阅读体验。具体来说,以下是一些可能的重构方法和目标: 1. 改善代码结构:通过调整章节和段落的顺序,优化内容的逻辑结构,使读者能更容易地理解和消化书中的知识。 2. 优化代码风格:检查并统一使用一致的格式和命名规范,使整个电子书的风格统一、易读。 3. 提升可维护性:识别和重构书中重复的内容或主题,并将其合并或抽取为可重复使用的模块,以减少冗余并改进维护效率。 4. 增加交互性:通过添加链接、图表、代码片段等元素,提供更多参考和实例,使读者能更直观地理解和应用重构技巧。 5. 修复错误和不精确的描述:通过修复错误和澄清模糊的描述,提升书籍的准确性和可靠性。 总之,将Martin Fowler的重构书籍转换为epub格式并进行重构有助于改进读者的阅读体验,并使书籍更加易读、易懂和易用。重构不仅仅是应用于代码,它也适用于提升文档和书籍的质量,使其能够更好地满足读者的需求。 ### 回答2: Martin Fowler是软件开发领域的知名专家,他对重构方法论的贡献得到了广泛的认可和赞赏。他的著作《重构——改善既有代码的设计》是软件开发领域得一本经典之作,是指导开发人员如何改进既有代码质量的重要参考资料。今年,Martin Fowler将他的《重构》一书发布为epub格式,这将为读者提供更方便的阅读方式,并且可以在不同的电子阅读设备上进行阅读。 这本epub版的《重构》将保留原书中的核心理论和实践原则,同时结合电子书的优势,添加了更好的排版和导航功能。读者在使用电子阅读设备阅读时,可以根据自己的喜好调整字体大小和样式,从而提升阅读的舒适度。此外,epub版还可以自动调整页面布局,适应不同尺寸的屏幕,使得阅读体验更加便捷。 另外,这个epub版的《重构》还将添加更多的交互和导航功能。比如,读者可以通过目录快速跳转到感兴趣的章节或小节,也可以在书中进行全文搜索,方便查找相关内容。书中还将包含丰富的示例和案例,以帮助读者更好地理解重构的概念和应用。 总之,Martin Fowler发布的epub版《重构》将为读者提供更加便利和丰富的阅读体验。不仅可以随时随地地进行阅读,同时还可以利用其交互和导航功能更好地学习和实践重构方法。无论是软件开发人员还是对软件设计感兴趣的读者,这本epub版的《重构》都将成为他们不可或缺的学习资料。 ### 回答3: 马丁·福勒(Martin Fowler)是一位知名的软件开发专家和架构师,他是《重构》这本经典著作的作者之一。他在书中详细介绍了软件开发中的重构概念和技术,并为开发人员提供了一套实用的方法和技巧,使得他们能够改善现有代码的质量和可维护性。 重构是指在不改变现有功能的情况下,通过修改代码的内部结构和设计来提高代码的质量和可读性。福勒提出了一系列的重构方法,包括提取方法、内联方法、重命名变量等等。他强调通过频繁的重构来保持代码的整洁和可维护性,从而降低开发过程中的风险和成本。这些重构方法在业界得到广泛的应用,并被视为提高代码质量的重要工具。 福勒选择将《重构》这本书制作成EPUB格式,使得读者可以在电子设备上方便地阅读。EPUB是一种常见的电子出版格式,可以自适应不同设备的屏幕大小,并支持字体、图像和布局等多种自定义设置。这使得读者可以根据自己的喜好和需求来调整阅读体验,提高学习效果。 通过将《重构》制作成EPUB格式,福勒希望更多的开发人员和软件架构师能够方便地获取这本信息丰富的书籍。EPUB格式的优点在于其便携性和可定制性,读者可以随时随地地学习和实践重构技术。这对于推动软件行业的技术进步和质量提升有着积极的影响。 总的来说,福勒将《重构》制作成EPUB格式是为了更好地传播重构的理念和方法。这种格式的选择使得读者能够更便捷地学习和应用重构技术,提高软件开发的效率和质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值