深入讨论微服务间的通讯方式

讨论微服务的通讯方式

在微服务体系下,通讯分为两部分:

  1. 客户端与微服务之间的通讯
  2. 微服务之间的通讯

两个层面的通讯都很重要。下面我们分别展开讨论。

第一部分:客户端与微服务之间的通讯

如果有四个微服务,都提供restful API访问,那么,客户端的应用是否可以直接、随意地访问后端这四个应用呢?

这样当然是不合理的。客户端直接调用微服务的问题是,部分服务使用的协议不是Web友好协议。一个服务可能使用Thrift二进制RPC,而另一个服务可能使用AMQP消息传递协议。不管哪种协议都不是浏览器友好或防火墙友好的,最好是内部使用。在防火墙之外,应用程序应该使用诸如HTTP和WebSocket之类的协议。

此外,客户端直接访问微服务的API,会使得微服务难以重构。随着时间推移,我们可能想要更改系统划分成服务的方式。例如,我们可能合并两个服务,或者将一个服务拆分成两个或更多服务。然而,如果客户端与微服务直接通信,那么执行这类重构就非常困难了。

因此,需要使用API网关。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、“请求整形(request shaping)”与管理、静态响应处理。

API Gateway可以提供给客户端一个定制化的API。它暴露一个粗粒度API给移动客户端。以产品最终页这个使用场景为例。例如,在亚马逊购买手机,其展现界面就是API Gateway通过调用多个服务来处理这一个请求并返回结果,涉及产品数量、颜色、价格、评论等。

用一个实验举例

通过Openshift 3.6的实验环境,笔者通过容器实现API网关:

先看AI网关容器,再看应用(本实验之所以有两个API网关,是因为笔者在其它实现中通过API网关模拟了蓝绿发布)。

最后查看API网关的FQDN:

而API网关对外提供的也是restful API:

我们继续看实验环境的浏览器展现:

客户端通过互联网微服务的时候,先请求先到API网关,然后按照如下顺序:

API Gateway是否天下无敌? 在IT圈,任何一项技术,都有其创长短处。只是很多时候,我们对于新技术,更加关注其长处。

API Gateway的一个最大好处是封装应用内部结构。相比起来调用指定的服务,客户端直接跟gateway交互更简单。API Gateway提供给每一个客户端(如PC客户端或者手机客户端)一个特定API,这样减少了客户端与服务器端的通信次数,也简化了客户端代码。 API Gateway的缺点在于:它是一个高可用的组件,必须要开发、部署和管理。还有一个问题,它可能成为开发的一个瓶颈。开发者必须更新API Gateway来提供新服务提供点来支持新暴露的微服务。更新API Gateway时必须越轻量级越好。否则,开发者将因为更新Gateway而排队列。

API Gateway的性能扩展

保证API Gateway的性能,有多种方式,如:

  1. 在API Gateway前面加NGINX反向代理。
  2. 采用反应编程方法
  3. 引入线程间通讯机制。有两种方法(1)基于消息队列的异步通讯,如使用JMS和AMQP。(2)同步机制,使用Thrift和 HTTP。

第二部分:微服务之间的通讯

关于微服务之间的通讯,大卫根据“微服务实战(三):深入微服务架构的进程间通信”,花了两张图张图。这样看起来会比较清爽。

微服务之间的通讯方式,可以从两个维度进行划分,第一个维度是同步或异步。第二个维度是一对一还是一对多。我们先看第一个维度。

第一个维度:从同步/异步通讯方式,看微服务之间的通讯

上面的图中,我们从左往右看:

1.一个微服务实例,通常是一个进程,而进程之前的通讯,需要遵循IPC(Inter-Process Communication,进程间通信)。

2.在使用IPC编程接口的前提下,微服务之间的通讯,有同步和异步两种。

2-1.同步通讯有 两种方式:2-1-1基于http的Rest方式;2-1-2基于文本和二进制方式的Thrift。

2-2.异步方式的实现也有两种方式:

2-2-1:第一种是使用标准的消息队列,如AMQP、STOMP;

2-2-2:第二种是使用一些开源的方案,如Kafka、RabbitMQ等。

接下来,我看先看一张同步通讯方式的图,这是一个打车软件的模型:

在上图中,乘客通过移动端向行程管理服务的/trips资源提交了一个POST请求。行程管理服务收到请求之后,会发送一个GET请求到乘客管理服务以获取乘客信息。当确认乘客信息之后,紧接着会创建一个行程,并向移动端返回201响应。

我们再看一下异步通讯方式的图:

在上图中:行程管理服务在“发布-订阅channel内”(其实就是消息队列)创建一个行程消息,并通知调度服务有一个新的行程请求,调度服务发现一个可用的司机然后向发布-订阅channel写入司机建议消息(Driver Proposed message)来通知其他服务。

第二个维度:从“一对一”或“一对多”的方式,看微服务之间的通讯

大卫根据参考的“微服务实战(三):深入微服务架构的进程间通信”一文,总结了一张图:

上面的图中,我们从左往右看:

1.一个微服务实例,通常是一个进程,而进程之前的通讯,需要遵循IPC(Inter-Process Communication,进程间通信)。

2.在使用IPC编程接口的前提下,微服务之间的通讯,有一对一和一对多两种。

2-1.在一对一的模式下,一个客户端向服务器端发起请求。

一对一的模式,也有两种方式:

2-1-1:同步模式。在此模式下,一个客户端向服务器端发起请求,等待响应。

2-1-2:异步模式。一步模式又分两种。

2-1-2-1:通知(也就是常说的单向请求):一个客户端请求发送到服务端,但是并不期望服务端立即响应。

2-1-2-2:请求/异步响应:客户端发送请求到服务端,服务端异步响应请求。客户端不会阻塞,而且被设计成默认响应不会立刻到达。

2-2.在一对多模式下,通过异步方式通讯。异步通讯方式有两种:

2-2-1: 发布/ 订阅模式:客户端发布通知消息,被一个或者多个相关联的服务消费。 2-2-2: 发布/异步响应模式:客户端发布请求消息,然后等待从相关联服务发回的响应。

参考文档:

http://www.dockone.io/article/549

http://www.cnblogs.com/cyfonly/p/6059374.html

https://www.nginx.com/blog/building-microservices-using-an-api-gateway/

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

Windows Server 2008企业64位版防火墙添加端口的方法

原始地址:http://www.veryhuo.com/a/view/48280.html

2032
来自专栏hbbliyong

用Visual Studio Code写Node.j

介绍 vsc的宣传语是: 一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。 按它说的...

38513
来自专栏DeveWork

为你的WordPress 主题添加结构化数据/丰富文本摘要,高亮搜索结果(下)

为了方便写文章与读者阅读,特将本文分为上下两个部分。上一篇请点击这里查阅,这一篇接着上一篇来。特别提醒,要查看添加后的效果,可以使用谷歌的 结构化数据测试工具 ...

2095
来自专栏个人技术分享

Android module发布管理插件

最近对发布Android SDK到jcenter的流程有点想法,历经一点点艰辛,做了一款Android Studio插件,希望能够使发布流程更简单友好。

1750
来自专栏积累沉淀

kafka学习之路(二)——提高

消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理。为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区。多个生产者和消费...

2427
来自专栏开源项目

听说,你也在做日志分析? | 码云周刊第 37 期

— 01 — 项目名称:赛克蓝德日志分析软件 seci-log ? 项目简介: 赛克蓝德日志分析软件,主要对日志进行收集,格式化,然后进行分析,日志可以是系...

4769
来自专栏FreeBuf

漏洞追踪:如何检查并修复GHOST(幽灵)漏洞

编号CVE-2015-0235的GHOST(幽灵)漏洞是Qualys研究员发现的一个Linux服务上非常严重的安全漏洞,可以被利用来远程代码执行及本地权限提升。...

19910
来自专栏从零开始的linux

PHP rabbitmq Work queues

RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看Rabbi...

3757
来自专栏编程坑太多

『中级篇』RoutingMesh之Ingress负载均衡(48)

PS:负载均衡解决了单一入口负载到多个容器上问题, 但是由于容器调度之后可能落到多个机器上, 假如某些主机上面没有工作的容器,而对外服务时候又希望服务可以被访问...

963
来自专栏JavaEdge

Tomcat集群目录1. Tomcat集群能带来什么2. Tomcat集群实现原理3. 一,二期架构对比4 Tomcat单机部署多应用-CentOS6.8Nginx负载均衡配置,常用策略,场景及特点

3236

扫码关注云+社区

领取腾讯云代金券