写点什么

微服务的漫长历史

2016 年 11 月 28 日

与许多人认为的不同,微服务的概念已有相当长的历史,SOA(面向服务的体系架构)也不是 90 年代才被提出的。在最近举办的伦敦微服务大会上, Greg Young 就微服务核心概念的前世今生进行了演讲。其中他表示,在过去的50 年间,我们一直在使用服务这一概念背后的核心思想。

Young 引用了 Martin Fowler 微服务主要特性的描述,最重要的是其独立替换系统中单个服务的能力、对业务能力的组织以及智能端点(smart endpoint)与哑管道(dumb pipes)的使用,Young 提到的这些特性SOA 也同样具备。

Young 提及,在 1970 年代最初提出的面向对象模型中,可以将一个对象理解为一个小型的计算机,用户通过向它发送信息使其工作。同时期的参与者(Actor)模式也是基于相似的概念,将参与者作为一个小计算机,用户向参与者的邮箱发送信息。它们都是微服务核心概念的前身,虽然使用的工具或消息传递方式不尽相同,但是内在的思想并没有改变。如今我们认为SOA 已经失败了,而微服务将会成功,但Young 表示SOA 的基础概念并没有任何错误,微服务的优点在SOA 架构中也早已存在。

回顾近50 年的经验教训,Young 引用了分布式计算第一定律来概括:如果不是真正需要就不要让系统分布式。将应用分成多个服务,再将它们部署在同一台服务器上,甚至在同一个进程上,这样做并没有不对。Young 表示,大部分系统,尤其是小型业务系统,并不需要分布式来提供可伸缩性,但是可以通过分布式来提升可用性。

我们真正需要的是服务间的隔离。当各个服务在同一服务器的各自进程中运行时,我们可以确保服务间遵循相互的协议。进一步隔离的方式是将各个服务运行在独立的Docker 容器中。这样减少了各服务间内容的共享,从而达到更好的隔离性。再进一步可以将每个服务运行在独立的节点上。

选择一定层级隔离的原因之一是为了处理相关的错误。当在同一个进程中运行所有的微服务时,如果进程重启,所有的服务会被停止。而将服务运行在各自的进程中的话,单个进程重启只会影响一个服务。当然重启服务器会停止所有服务,所以将各个服务部署在独立的服务器上或双服务器双实例,会大大减少重启给服务可用性带来的影响。

当然每一种隔离层级都伴随着相应的成本。使用一台服务器多个进程相对于每个服务一个节点更容易实现。这其中并没有谁对谁错,有的只是各因素间的权衡。在提升系统的隔离级别的同时,你也会相应增加系统的成本和复杂度。Young 同时引用 Simon Brown 的话:

如果你无法在单进程的独立应用上实现构建,那你如何确信在引入网络通信后问题可以得到解决?

Young 认为,使用不同的隔离策略的一个优势是我们不需要提前做出一些决定,我们也不需要保持生产环境和开发环境使用一样的隔离级别。他表示这也是使用微服务架构的一个主要好处。

明年的伦敦微服务大会将与2017 年11 月6 至7 日举办。

查看英文原文: The Long History of Microservices

2016 年 11 月 28 日 18:008646
用户头像

发布了 41 篇内容, 共 11.1 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
  • 在微服务中如何管理数据

    来自Stitch Fix团队的Randy Shoup在QCon纽约2017上讨论了如何在基于微服务的应用中管理数据和隔离持久化。他还介绍了将事件作为微服务的第一类构造。

  • 代理对象创建基础类 - ProxyCreatorSupport

    2021 年 2 月 18 日

  • 构建和部署微服务的模式

    在微服务管理中,基础设施自动化极其重要,James Lewis在一次技术与实践分享活动中介绍了一些有用的模式和方法,这些模式和方法可以应用于自动化构建和部署微服务的活动之中。

  • 论 SOA 中仲裁的价值

    Nick Malik的文章“仲裁在SOA中的价值”引发了一起有趣的讨论。在关于这个主题的第一篇博客帖子中,他问道:“如果消息不能被仲裁,那它还是面向服务的吗?”。

  • GOTO Berlin: 使用微服务分拆巨型系统

    James Lewis在GOTO Berlin大会上谈论了一种新的系统构建方式,他认为传统的系统构建方式把所有的功能放到一个大的应用程序中,使用一个大的数据库,这样会产生很多问题;相反的,将业务功能完全分离,各自使用自己的数据,每一部分作为一个微服务则能够避免不少问题并带来了很多好处。

  • Queryable State 介绍与使用

    2020 年 10 月 22 日

  • 微服务架构会和分布式单体架构高度重合吗

    对于网络服务来说,首先,前提条件就是要有一个由100+共享库组成的企业级平台,才能确保有能力来运行网络服务,还能够让有权限的网络客户共同讨论构建更强大的微服务。

  • 不要在微服务之间共享代码

    通常来说,构建微服务是为了能够将隔离作为一种应对变化的方法。在服务之间共享代码会增加服务之间的相互耦合,导致隔离有效性和变化应对能力的减弱,David Dawson发表了一系列博文质疑不要重复劳动(DRY)原则和微服务之间的联系。

  • 复合服务的设计和实现

    在本文中,Boris Lublinsky分别从设计和实现两方面讨论了复合(Composition)服务的主要方式,并勾勒了采用编制(Orchestration)的优势。讨论的主题涵盖了分层(Hierarchical)复合与会话(Conversational)复合的对比、复合的拓扑、以及不同实现方式的优缺点。

  • Michael Poulin 炮轰 SoaML

    Michael Poulin对SoaML规范提出了批评,认为它是一个以角色/参与者为中心的模型,不是一个以服务为中心的模型。在他看来,SoaML搞的就是一种权力、责任和义务的结构,以该结构而非业务需求作为企业服务架构的基础将有损于面向服务的精神。

  • 业务及系统架构对发布的影响

    发布系统最终要服务的对象是业务应用,而业务应用又和业务、企业的系统架构有紧密的联系,所以要做好一套发布系统,我们还要考虑其要服务的业务及系统架构的需要。

    2018 年 8 月 25 日

  • Apache Hadoop YARN: State of the Union

    2019 年 1 月 2 日

  • 适合于云端部署的应用架构

    云提供了按需扩展的能力,能够根据负载的波动对应用进行扩展和收缩。但是传统应用要充分利用云的优势,并不是简单地将应用部署到云上就万事大吉,而是需要根据云的特点重新进行架构设计,近日AppDynamics的开发布道者Dustin.Whittle撰文阐述了适合云端部署的应用架构,对传统应用往云端迁移有很大的启发和借鉴意义。

  • 设计事件驱动的微服务

    事件驱动的微服务是一个未受到应有探讨的领域,在近日举行的µCon伦敦2017微服务大会上,Greg Young表达了这样的观点。同时,他还特别强调,不应该对所有的微服务都使用事件驱动模式。相反,他建议逐个服务进行考察,并将事件驱动模式运用到真正能从中受益的服务上。

  • 答疑篇:如何判断并解决网络分区问题?

    今天,我将会与你深入探讨网络分区问题,帮助你解决业务场景中的网络分区如何判断,以及如何解决的问题。

    2019 年 12 月 11 日

  • 来自微服务实践受挫后的一些经验

    在对微服务架构与一个更加传统的单片架构的利弊权衡问题上,团队中成员的观点并不一致,这是我们在实践微服务中受挫的主要原因之一。Richard Clayton就他在实现和维护一个微服务架构中经历挫折的经验和原因进行了分享。

  • Stefan Tilkov:跳过单体应用,从微服务开始

    在过去的几个月中,许多人都宣称微服务架构应该总是从单体应用开始,其中包括Martin Fowler和Sam Newman,但Stefan Tilkov认为,那经常是错误的,构建一个模块边界清楚、结构良好的单体应用然后再迁移到微服务在大多数情况下都非常困难,几乎不可能。

  • 实体服务是一种反模式

    在微服务架构中,最重要的是要保持服务间的隔离。实体服务(Entity Service)是被广泛应用于微服务架构上的一种模式,但其实它是一种反模式,因为它背离了服务隔离的原则。

  • WhoAmI 服务

    2019 年 9 月 25 日

发现更多内容

关于区块链的学习笔记(三)

姬翔

阿里P8教你Java注解与反射

陈皮的JavaLib

Java 面试 8月日更 java注解 反射机制

Grafana 配置 Thanos 查询历史数据

耳东@Erdong

Grafana Prometheus Thanos 8月日更

【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存

编程三昧

面试 8月日更 HTTP缓存

写作 7 堂课——【4. 联机式写作】

LeifChen

素材 写作技巧 8月日更 联机 写作网感

Node.js 实现存储服务的上传功能【包含前后端代码】

liuzhen007

8月日更

Linux之ping命令

入门小站

Linux

关于区块链技术的学习笔记(一)

姬翔

JavaScript中的 async 和 await

devpoint

Promise Async await 8月日更

关于区块链的学习笔记(二)

姬翔

【Vue2.x 源码学习】第三十篇 - diff算法-比对优化(上)

Brave

源码 vue2 8月日更

白话机器学习:什么机器学习模型?

杜吉普

机器学习 数据分析 数字化转型

【架构实战营】毕业总结

Geek_2e7dd7

网络攻防学习笔记 Day100

穿过生命散发芬芳

态势感知 网络攻防 8月日更

有什么理由将代码保存为 GBK 编码

HoneyMoose

Java 面试都只是背答案不

HoneyMoose

【Mybatis-Plus 学习笔记】2、日志配置及常用 CRUD

村雨遥

Java 8月日更 Mybatis-Plus

绝绝子!腾讯大牛1909页的leetcode刷题笔记,细节满满

Java 白

Java 编程 架构 面试 程序人生

负载均衡的原理与设计

海明菌

负载均衡 负载均衡算法 负载均衡架构

“善于治”和“以善治”:华为云Stack在智慧城市的十年踪迹十年心

脑极体

jackson解析泛型的正确写法

4ye

Java Jackson 8月日更

【LeetCode】超级丑数Java题解

HQ数字卡

算法 LeetCode 8月日更

python-抽象

加哥

架构训练营模块四作业

Lemon

分布式系统改造方案——数据篇

普普通通程序员

“@Value 注入失败”引发的一系列骚操作

互联网架构师小马

奥运背后的5G赛场,竟然也这么激烈?

脑极体

趁着课余时间学点Python(八)函数的简单理解

ベ布小禅

8月日更

不装了、摊牌了,我们要搞事情

不脱发的程序猿

程序员 技术 程序人生

【设计模式】外观模式

Andy阿辉

C# 后端 设计模式 8月日更

占楼

IT蜗壳-Tango

8月日更

去哪儿网订单中心高并发实践

去哪儿网订单中心高并发实践

微服务的漫长历史-InfoQ