阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

微服务通信策略

  • 2018-08-20
  • 本文字数:1996 字

    阅读完需:约 7 分钟

GeeCON 2018 大会上, Michael Plöd 在一场介绍微服务之间不同的通信策略的演讲中解释说,在从单体架构迁移到微服务架构时,暗含在单体架构中的复杂性会明确显露出来,通信挑战将呈指数级增长。

Plöd 是 InnoQ 首席顾问。他首先指出,根据他的经验,团队经常把微服务视为默认架构。他强调,分布式系统是高难度的系统;如果你不需要一个分布式系统,你就不必为了微服务而力争实现那样的架构。在这种情况下,构建良好的单体通常是更好的选择。

当单体不满足需求而使用微服务时,必须把它们集成,Plöd 指出,这不只是技术问题,还有其他方面的影响:

  • 团队之间需要通过沟通来解决集成问题,这可能会导致政治和治理问题。
  • 耦合:实现服务之间的松耦合非常重要,否则,你很容易最终得到一个分布式单体
  • 质量标准:在一致性、性能、可扩展性、健壮性方面,找出真正需要的是什么,你应该尽早评估你的应用程序。
  • 技术:虽然 REST 很常用,但那不是唯一的通信选项。

为了帮助团队通信及管理耦合,Plöd 指出,领域驱动设计(DDD)对在业务层面找出边界非常有帮助——有界上下文。这些上下文彼此之间通常以不同的方式进行交互,为了描述它们之间的关系,可以使用上下文映射。这些交互模式包括:

  • 打开主机服务:指定一个可供服务使用的协议,如 REST;
  • 共享内核:两个服务可以共享部分代码或定义交互的库;
  • 消费者 / 供应商:一个服务是另一个服务的消费者,因此,可能会影响它的实现;
  • 防腐层:消费者服务创建一个适配器,最小化它与之交互的另一个服务所带来的影响。

看下通信的技术方面,Plöd 首先介绍了通信的一般分类——Orchestration_ 和 _Choreography。使用 Orchestration,微服务知道过程,会主动调用其他服务来完成任务。使用 _Choreography_,微服务会发布一个事件,其他服务会响应事件,完成相应的动作。在 Plöd 看来,这是一个重要的区别,他认为,我们应该就系统首选的工作方式做架构决策。他还建议考虑宏架构和微架构,并指出,微服务并不是说团队可以随意选择他们喜欢的东西,因为那样做的话,你最终会陷入完全的混乱。相反,他建议采用一种有规则的宏架构,所有团队都必须遵守这些规则。在微架构中,团队有更大的自由,可以选择他们自己的实现风格。

让我们看下通信的技术选项,Plöd 指出了四种类型:

  • RESTful 资源
  • 消息传递
  • 领域事件
  • 订阅

虽然 REST 如今已经广为人知,但根据 Plöd 的经验,只有很少团队很好地实现了,尤其是在超媒体和多表示形式方面。他指出,实现一个 RESTful 资源调用非常简单,但是,实现一个可以在微服务环境中正常运行的健壮调用要困难许多。以下是需要知道的一些陷阱和挑战:

  • 服务发现:一种服务用来发现它与之通信的服务的 URL 的方式。
  • 弹性:包括如何处理错误和宕机。服务的优雅退化非常重要,可以避免异常服务使整个应用程序性能下降。
  • 负载均衡:可以处理不断增长的负载。有许多不同的实现方法,使用哪种方法取决于应用程序的运行环境。

下一个选项是消息传递,微服务发送和消费消息,通常是通过一个消息代理。下面描述的这些有关 REST 的挑战不是很切题:

  • 服务发现已经没意义,因为服务仅知道消息系统。
  • 弹性主要由消息系统处理。主要的风险是延迟因为错误或宕机增加。
  • 负载均衡是通过向上扩展消息系统或增加消息消费者数量来实现的。

Plöd 的第三个选项是领域事件。它们表示过去在业务层面上已经发生的事实。使用它们进行通信会得到事件驱动的微服务,现如今,这是一种非常流行的架构风格。当使用事件通信时,对于事件中的有效载荷,他介绍了几个可选方案:

  • 满负载模式:事件中包含处理事件所需的所有数据,例如关于客户的所有数据。这可以简化消费者的工作,但也意味着更紧密的耦合。
  • REST URL:只有一个指向代表事件的资源的 URL。
  • 空模式:仅包含关于事件本身的数据。消费者必须通过其他方式找到它需要的数据。
  • 混合模式:比如,有少量的数据和一个用于找到其他数据的 URL。在大多数情况下,这都是 Plöd 首选的方式。

Plöd 最后的选项是使用 Atom Feeds 组合 REST 和事件。现在,服务会利用事件发布推送信息,消费者订阅并异步读取。在大多数环境中,使用 HTTP 都非常容易通信,而且可以利用像 ETags 最后修改时间、分页和链接这样的特性。另外一个好处是,服务发布推送信息,可以从消费者完全解耦。推送消息的读取完全是由消费者按照它们认为恰当的方式进行的,而且,已消费事件的跟踪也是由消费者完成的。

为了提供推送消息,事件必须持久化,这就轮到事件源登场了。我们可以使用这些事件作为我们主要的持久化模型,这还使得我们可以使用 CQRS 来获得视图,这些视图是经过优化的事件读取模型。Plöd 特别指出,CQRS 和事件源只是系统特定部分的解决方案,而不代表系统中随处都在使用的架构。

要了解更多有关集成的信息,Plöd 强烈推荐由 Gregor Hophe 和 Bobby Wolf 所著的 _ Enterprise Integration Patterns _ 一书。

查看英文原文: Strategies for Microservices Communication

2018-08-20 13:3510819
用户头像

发布了 1008 篇内容, 共 373.8 次阅读, 收获喜欢 340 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第十周作业 - 命题作业

阿德儿

一分钟了解EFT公链新一代超级DeFi公链——EGG超级公链

币圈那点事

区块链 公链 挖矿

恭喜自己2021金三银四收到的第五个Offer:字节跳动Java研发岗

比伯

Java 编程 架构 面试 程序人生

华为18级工程师总结的50W字算法、LeetCode、操作系统、计算机底层刷题必备笔记

Java架构之路

Java 程序员 架构 面试 编程语言

PBAC相对于传统ABAC的优势

龙归科技

IT 架构师 权限 ABAC PBAC

Python 初学者必看:Python 异常处理集合

华为云开发者联盟

Python 异常 代码 程序 错误

融云聊天室属性 kv

融云 RongCloud

音视频

如何写好操作类说明文档

lenka

3月日更

面试字节跳动定级2-2,拿32*16offer,P8大佬的算法教程给了我春天!

Java架构之路

Java 程序员 架构 面试 编程语言

GitHub Action + ACK:云原生 DevOps 落地利器

阿里巴巴云原生

容器 运维 云原生 k8s 应用服务中间件

翻译:《实用的Python编程》06_01_Iteration_protocol

codists

Python

腾讯高级工程师保姆级“Java成长手册”,层层递进,全是精华

Java架构追梦

Java 腾讯 面试 架构师

【死磕JVM】一道面试题引发的“栈帧”!!!

牧小农

JVM Java虚拟机 运行时数据区 Java虚拟机栈 栈帧

邀请领好礼!米家显示器挂灯、雷蛇烈焰神虫送给你!

滴滴云

Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

数据库 redis 架构

TCP拥塞控制四种算法

赖猫

TCP 网络协议

架构师训练营第六周作业 - 命题作业

阿德儿

使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

阿里巴巴云原生

Java 开发者 云原生 中间件 Arthas

openpyxl 对Excel的基础操作

IT蜗壳-Tango

办公自动化 3月日更 IT蜗壳教学

Wireshark 数据包分析学习笔记Day12

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

三步上线自己的在线监考系统

融云 RongCloud

中台还没建就开始拆中台了?医疗中台何去何从?

菜根老谭

中台 医疗中台

BOE(京东方)物联网解决方案让会议更“智慧”

爱极客侠

本科毕业,六年Java开发经验,阿里技术三面+HR面,拿下38*16薪资P7offer

Java架构之路

Java 程序员 架构 面试 编程语言

HECO火币生态链挖矿系统开发搭建技术

薇電13242772558

数字货币 区块链生态

《精通比特币》学习笔记(第十一章)

棉花糖

区块链 学习 3月日更

【科创人】维格表创始人陈霈霖:喜茶数字化转型的结晶是vika维格表

科创人

第八章作业

Kalman

产品经理 产品经理训练

第八章学习总结

Kalman

产品经理 产品经理训练

Redis 在项目中合理使用经验总结

Java小咖秀

redis

教你如何在Centos配置Oracle客户端运行时

happlyfox

28天写作 3月日更

微服务通信策略_REST_Jan Stenberg_InfoQ精选文章