手记

微服务进程间通信之REST

微服务进程间的通信可以是同步的消息调用,也可以是异步的.
异步的调用,我们一般使用消息队列
那么同步的调用中, 比较流行的解决方案是 REST和Thrift

下面介绍下REST:

REST是一种(几乎总是)使用HTTP的IPC机制。REST中的一个关键概念是资源,它通常表示业务对象,比如客户或产品,或者业务对象的集合。REST使用基于HTTP操作资源,这些资源使用URL引用。例如,GET请求返回资源的表示形式,它可能是XML文档或JSON对象的形式。POST请求创建一个新资源,PUT请求更新一个资源。

借用REST创始人的话来说:“REST提供了一组体系结构约束,当作为一个整体应用时,这些约束强调组件交互的可伸缩性、接口的通用性、组件的独立部署和中介组件,以减少交互延迟、加强安全性和封装遗留系统。”

下面是一个使用REST的微服务的示例:

许多开发人员声称他们基于HTTP的api是RESTful的。
然而,并不是如此,

Leonard Richardson定义了一个非常有用的REST成熟度模型,该模型由以下级别组成。

0级API的客户端通过向其唯一URL端点发出HTTP POST请求来调用服务。每个请求指定要执行的操作、操作的目标(例如业务对象)和任何参数。使用HTTP作为远程交互的传输系统,但不使用web的任何机制。通常基于远程过程调用。

级别1—级别1 API支持资源的概念。要在资源上执行操作,客户机发出POST请求,指定要执行的操作和任何参数。

级别2 -级别2 API使用HTTP谓词执行操作:GET检索、POST创建和PUT更新。请求查询参数和主体(如果有的话)指定操作的参数。这使服务能够利用web基础设施,例如缓存GET请求。

级别3 -级别3 API的设计是基于非常有名的HATEOAS(超文本作为应用程序状态引擎)原则。基本思想是,GET请求返回的资源的表示包含用于在该资源上执行允许操作的链接。例如,客户端可以使用order表示形式中返回的链接取消订单,该链接用于响应发送来检索订单的GET请求。HATEOAS的好处包括不再需要将url硬连接到客户机代码中。另一个好处是,由于资源的表示包含允许操作的链接,客户端不必猜测在当前状态的资源上可以执行什么操作。

例如:
请求:

GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1
Host: royalhope.nhs.uk

得到的响应是:

HTTP/1.1 200 OK
[various headers]

<openSlotList>
  <slot id = "1234" doctor = "mjones" start = "1400" end = "1450">
     <link rel = "/linkrels/slot/book" 
           uri = "/slots/1234"/>
  </slot>
  <slot id = "5678" doctor = "mjones" start = "1600" end = "1650">
     <link rel = "/linkrels/slot/book" 
           uri = "/slots/5678"/>
  </slot>
</openSlotList>

在响应的list中, 每一项中包含了URI来告诉我们怎么进行下一步的操作.
我们从REST的分级中,可以得到REST的一些设计思想:
第1级通过分治来处理复杂性问题,将大型服务端点分解为多个资源。
第2级引入了一组标准的动词,这样我们就可以用同样的方式处理类似的情况,消除不必要的变化。
级别3引入了可发现性,提供了一种使协议更加自文档化的方法。

使用基于HTTP的协议有很多好处:

HTTP简单而熟悉。
您可以使用诸如邮递员之类的扩展在浏览器中测试HTTP API,或者使用curl在命令行中测试HTTP API(假设使用JSON或其他文本格式)。
它直接支持请求/响应式通信。
当然,HTTP是防火墙友好的。
它不需要中间代理,这简化了系统的体系结构。

使用HTTP有一些缺点:

它只直接支持交互的请求/响应样式。您可以使用HTTP进行通知,但是服务器必须始终发送HTTP响应。
因为客户机和服务直接通信(没有缓冲消息的中介),所以它们必须在交换期间同时运行。
客户端必须知道位置(即,每个服务实例的URL)。正如在上一篇关于API网关的文章中所描述的,这在现代应用程序中是一个非常重要的问题。客户端必须使用服务发现机制来定位服务实例。

开发人员社区最近重新发现了RESTful api的接口定义语言的价值。有几个选择,包括RAML和Swagger。一些idl(比如Swagger)允许定义请求和响应消息的格式。其他一些规范(如RAML)要求使用单独的规范(如JSON模式)。除了描述api之外,idl通常还具有从接口定义生成客户机存根和服务器骨架的工具。

以上就是Rest的介绍 下节介绍Thrift。

1人推荐
随时随地看视频
慕课网APP