微服务架构 : 在微服务的架构中, 也许不需要 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 条评论
登录 后参与评论

相关文章

来自专栏Java Edge

SpringBoot+Security 发送短信验证码在core模块下properties包中创建SmsCodeProperties在ValidateCodeProperties中new一个SmsCo

2716
来自专栏DT乱“码”

Java知识图谱收集整理

1、Java学习路径1 ? 2、Java学习路径2 ? 3、Java Web学习路径 ? 4、Java编程所需的工具及知识 ? 5、Java集合类 ? 6、Ja...

2269
来自专栏web编程技术分享

第七节 - 部门管理模块(画一个datagrid表格)

3277
来自专栏GreenLeaves

JavaScript之将JS代码放在什么位置最合适

1.放到<head></head>标签里面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/...

1937
来自专栏社区的朋友们

react 渲染性能优化

react 性能提升的方法之一是尽量减少 DOM 对比和冗余操作,从而减少组件重复渲染;刚开始使用 react 的时候只专注于对于逻辑的处理,导致很多地方会出现...

7950
来自专栏Cloud Native - 产品级敏捷

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

2016.8.12, 深圳, Ken Fang  在微服务的核心概念中, api layer 主要是在微服务与微服务外部的使用者界面、系统或设备之间构建 end...

1788
来自专栏蓝天

多写引发的思考

如果是3个Master,采用2PC保证一致性,单个Master故障,会导致不可写。如果正提交的是一个大数据,会造成较大影响。实际上,这个时候可以允许提交,在故障...

581
来自专栏叔叔的博客

SpringCloud服务比较快的下线配置

一、前言 想实现热部署,需要服务很快的上下线,所以需要修改相关配置。 二、配置 Eureka Server配置 # eureka server刷新readCac...

8476
来自专栏Clive的技术分享

PHP高并发大流量常规处理

增加服务器,提升服务器性能; nginx负载均衡; php、html静态化; 优化mysql,优化索引,mysql查询缓存; 引入redis、memcache;...

3586
来自专栏xingoo, 一个梦想做发明家的程序员

Kibana中doc与search策略的区别

在kibana中包含两种策略:doc和search。使用了两个循环队列来获取请求,并进行响应。 doc的代码如下: clientMethod: 'mget' ...

21810

扫码关注云+社区