微服务架构 : 在微服务的架构中, 也许不需要 Integration Hub ( 三 )

导语

在过往的服务型的架构下, 我们都会采用如 Mule, Camel...等等, 来进行服务间的合约变换 (contract transformation), 服务编排 (service orchestration), 以及服务与第三方软件间的整合。 而在微服务的架构下, 我们是否应该继续采用如 Mule, Camel...等等 ?

前言

在微服務的核心概念中, api layer 主要是在微服务与微服务外部的使用者界面、系统或设备之间构建 endpoint proxy 与 load balancer。

所以, 在微服务的架構中, 架构师规划 Integration Hub; 如: Mule,Camel, ESB…等等, 以使微服務間可进行 , 合约变换 (contract transformation), 服务编排 (service orchestration), 并使微服务可整合第三方软件 (integration with third-party apps) 应该是个合理且正确的架构方案。

[图一: api layer 主要是在微服务与微服务外部的使用者界面、系统或设备之间构建 endpoint proxy 与 load balancer]

本文

但是, 在微服务的架构中, 规划所谓的 Integration Hub, 往往却会为微服务的架构, 引入下列的问题:

1. 性能:

微服务架构最主要的特点便是: 能使产品的架构能够 “水平扩展”。所以, 架构师应将不论是微服务之间的调用或是来自微服务外部的使用者界面、系统或设备的调用, 都应当成是 “分布式远程调用”。

因此, 假如, 在已是 “分布式远程调用” 的微服务架构下, 再置入个 “远程调用” 的 Integration Hub, 则产品的整体性能将会受到某种程度负面的影响。

2. 复杂度:

微服务的分布式架构的复杂度是相当高的。所以, 架构师在微服务的架构下, 置入 Integration Hub 时, 则会使原先只会发生的微服务的分布式远程调用, 便会需先发生 Integration Hub 的远程调用, 然后, 才会发生微服务的分布式远程调用。毫无疑问的, 这将使当发生运维问题时; 如: 某笔交易的资料丢失时; 增加问题定位的难度与时间。因为, 整体架构的复杂度已因 Integration Hub 的置入, 而更往上提升。

3. 边界上下文 (Bounded Context) :

当架构师在微服务的架构中置入 Integration Hub 时, 则表示各微服务都可将自身部分的功能 (业务流) 上升至 Integration Hub 中做处理。如此的作法, 将使各微服务可能会在 Integration Hub 中, 发生共享。也就是说, 当各微服务的边界上下文 (Bounded Context) 不仅包含了各自的某一端到端的业务场景 (功能) 、数据 (数据库) 外, 更包含了Integration Hub 时, 将使得微服务的边界上下文 (Bounded Context) 的界定, 变得相当的棘手, 甚至不可行。也就是说, 各微服务的边界上下文 (Bounded Context) 将因包含了 Integration Hub, 而使得各微服务间会发生共享; 使得各微服务, 很难再维持完全自主性的运作。

4. 部署流水线 (Deployment Pipeline):

当各微服务都可将自身部分的功能 (业务流) 上升至 Integration Hub 中做处理时, 则表示当部署某一微服务时, 也需同时部署 Integration Hub; 而部署与配置 Integration Hub 往往需耗时整晚, 甚至是数天。

5. 开发与测试:

当架构师在微服务的架构中置入 Integration Hub 时, 则表示不论是开发或测试人员都必需花费时间去学习 Integration Hub; 如: Mule, Camel, ESB…等等。

6. 可靠性与坚固性:

当来自微服务外部的使用者界面、系统或设备的调用, 都需经过 Integration Hub 时, 则就意味著当 Integration Hub 无法运作时, 则将使得微服务都将无法被调用。

既然, Integration Hub 会为微服务的架构引入上述的问题, 则身为个架师, 在微服务的架构下, 针对合约变换 (contract transformation), 服务编排 (service orchestration), 整合第三方软件 (integration with third-party apps) 的设计原则、方法是什么?

I. 设计原则:

不置入 Integration Hub, 而完全以可独立自主的微服务, 个别处理合约变换 (contract transformation), 服务编排 (serviceorchestration), 整合第三方软件 (integration with third-partyapps) 。

II. 设计方法:

合约变换 (contract transformation):

微服务 X 只能接受 XML。所以, 当外部的使用者界面、系统、设备或其他微服务传送 JSON 至微服务 X 时, 微服务 X 便需所谓的合约变换 (contract transformation); 将 JSON 转换为 XML 或将 XML 转换为 JSON。

合约变换 (contract transformation) 有两种作法:

  1. 由另一个微服务 Y 专注将合约变换 (contract transformation) 做到最好。当整个产品中, 多数的微服务都需合约变换 (contract transformation) 时, 便需采用此方案。
    1. 在既有微服务 X 新增一新的 endpoint, 处理合约变换 (contract transformation) 。当采用此方案时, 需注意: 原微服务 X 是否会因为新增此合约变换 (contract transformation), 而变的过于复杂。

[图二: 由另一个微服务 Y 专注将合约变换 (contract transformation) 做到最好]

[图三: 在既有微服务 X 新增一新的 endpoint, 处理合约变换 (contract transformation) ]

服务编排 (service orchestration):

当微服务的架构中, 没置入 IntegrationHub 时, 便没有一个指挥者会指挥著, 现在应调用微服务 A, 然后, 接下来应调用微服务 B… 等等。

微服务的特点便是每个微服务都有个明确的边界上下文 (Bounded Context), 而可自主的运作。所以, 在微服务的架构中, 可直接采用服务编舞 (Service Choreography) 的方式; 由微服务自身决定需调用那个微服务, 而不需经由某一个指挥者, 来指挥接下来应调用那一个微服务。

[图四: 服务编舞 (Service Choreography) : 由微服务自身决定需调用那个微服务, 而不需经由某一个指挥者, 来指挥接下来应调用那一个微服务]

整合第三方软件 (integration with third-party apps):

我想, 大家也许已经知道该怎么做了; 针对每一个对第三方软件的调用, 开发一个 Microservice Gateway。由 Microservice Gateway 调用第三方软件。也就是说, 第三方软件, 可藉由Microservice Gateway 所提供的单一共同的协议 (protocol); 如: REST; 进行分布式的调用。

这种架构上的作法, 也可应用在既有系统, 还没法转移到微服务的架构时; 可针对每一个对既有系统的调用, 先开发一个 Microservice Gateway。然后, 再逐步将既有系统的功能、场景转移到相对应的 Microservice Gateway 中。如此, 当既有系统的功能、场景转移到相对应的 Microservice Gateway 中后, 也不必再重新修改, 原先会调用 Microservice Gateway 的外部的使用者界面、系统、设备或是微服务。

[图五: Microservice Gateway]

结论

"轻装上阵" 一直是微服务架构下的一个核心的设计原则。

我们遵循著 "轻装上阵" 的设计原则, 针对在微服务架构下, 如何设计:

  1. 合约变换 (contract transformation)
  2. 服务编排 (serviceorchestration)
  3. 整合第三方软件 (integration with third-partyapps)

提出设计上的思路与作法。

期望大家在微服务的架构下, 当在设计合约变换 (contract transformation), 服务编排 (serviceorchestration) 与整合第三方软件 (integration with third-partyapps) 时, 能参考本文的作法, 以使自身的微服务可 "輕裝上陣"; 永保微服务的可扩展性。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏康怀帅的专栏

Mac OS X 背后的故事(下)

Mac OS X 背后的故事(九)半导体的丰收 半导体的丰收(上)   在美国宾夕法尼亚州的东部,有一个风景秀美的城市叫费城。在这个城市诞生了一系列改变世界的奇...

4367
来自专栏ATYUN订阅号

像素墨镜,大烟卷—Thug Life风格自动生成项目

AiTechYun 编辑:nanan ? 暴徒生活(Thug Life)是一款非常火热的P图特效,通过加上此特效会让用户的视频或者照片变的非常有趣好玩。其拥有大...

3535
来自专栏区块链大本营

这个女生说:弄懂本文前,你所知道的区块链可能都是错的

昨天,比特币跌破 S9 矿机的开机价,比特币全网算力陡然蒸发掉三分之一,营长着实为比特币网络的稳定性捏了一把汗。而且有传言说,比特币价格此次崩盘,只是大 BOS...

962
来自专栏微信公众号:Java团长

Java就业指导

想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面...

1412
来自专栏aCloudDeveloper

Docker 网络背后的原理探索

知其然而不知其所以然,不知也。老古人说得多好,学知识不懂得知识背后的原理,等于白学。

1190
来自专栏程序人生

Let it crash: 因为误解,所以瞎说

今天我知乎的时间线上反复出现了一个流毒甚广的帖子:「应该如何理解Erlang的“就让它崩溃”思想?」,十几个不懂装懂的回答,赞竟然都不少。 严格意义上来说,我之...

3237
来自专栏强仔仔

基于web的IT技术论坛

一.基于web的IT技术论坛设计目的及任务 利用当下流行的SSM(Spring,SpringMVC,Mybatis)框架,并运用maven进行项目管理,实现基...

26510
来自专栏魏艾斯博客www.vpsss.net

Vultr 日本 VPS 1 核心 CPU 1G 内存 网站内存使用情况

4522
来自专栏Android群英传

调教Android的打盹

902
来自专栏Albert陈凯

2018-11-06 成为一个专业的程序员前言

https://github.com/stanzhai/be-a-professional-programmer

3522

扫码关注云+社区