微服务容器化实践——数据通信模式


目前的数据通信模式/协议主要包含了三个大类:

  • REST
  • RPC
  • MQ

REST

要了解REST,首先必须明确HTTP的运作方式。但实现REST并非是一定要使用HTTP,REST规范中并没有HTTP、JSON、XML等相关约束,它描述的是互联网软件架构的一种风格。

那为什么提及REST的时候总会附带上HTTP呢?这件事要从互联网说起,万维网本身是在HTTP协议上运行的,导致大多数的网络应用都基于HTTP做传输HTTP协议的服务端和客户端库广泛使用,而且HTTP协议的完善性加上其协议内容较适合REST架构风格的约定,绝大多数的RESTful应用都使用HTTP构建。

HTTP
HTTP,即超文本传输协议,是一个属于应用层的面向对象的协议。

HTTP的特点:

  • 基于C/S模式,客户端通过URL向服务端发送请求,其信息交换过程为:建立连接、发送请求信息、发送响应信息、关闭连接
  • 无连接,指 限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。这样可以节省传输时间。
  • 无状态,指协议对于事务处理没有记忆能力

REST
REST架构风格的约束如下:

  • 客户端-服务端
    将客户端和服务端的关注点分离,将用户界面所关注的逻辑和数据存储所关注的逻辑分离,有助于用户界面的跨平台可移植性,简化服务器模块也有助于服务器模块的可扩展性。
  • 无状态
    服务器不保存客户端的信息,每次客户端请求中要包含所必须的状态信息,会话信息由客户端保存,服务端根据这些状态信息进行请求处理。
  • 可缓存
    客户端和中间的通讯传递者可以将响应缓存起来,响应必须显式或者隐式的表明自己是否可以缓存,以预防客户端在将来请求时得到陈旧或者不恰当的数据。良好的缓存机制可以提高性能和可扩展性。
  • 分层系统
    客户端一般不知道是否连接到了最终的服务端,或是路径上的中间服务器。中间服务器可以通过负载均衡和共享缓存的机制提高系统的可扩展性,便于安全策略的部署。
  • 按需代码
    服务器可以发送可执行代码给客户端的方式临时性的扩展功能或者定制功能。
  • 统一接口
    统一接口是REST架构风格最为著名的约定,简化了系统架构,减少耦合性,可以让所有模块都各自独立进行改进。统一接口的示例如下:
    微服务容器化实践——数据通信模式

RPC

RPC(Remote Procedure Call,远程过程调用) ,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式程序就像开发本地程序一样简单。

RPC采用服务调用方/服务提供方模式, 都运行在自己的进程中。客户端只需要引入要使用的接口,接口的实现和运行都在服务器端。RPC主要依赖的技术包括序列化、反序列化和数据传输协议,这是一种定义与实现相分离的设计。
微服务容器化实践——数据通信模式
完整的 RPC 框架
在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化。

RPC与REST的比较

RPC可以通过HTTP来实现,也可以通过Socket来实现。为何RPC还有除HTTP 之外的实现法,有何必要.毕竟除了HTTP实现外,私有协议不具备通用性。

http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。

但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长连接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑

服务内部:首要使用RPC,RPC适合内部间,高效,快速通信。
服务外部:首要使用RESTful,REST适合外部间,简单易用。

如何选择RPC框架

RPC框架众多,比如dubbo、motan、thrift、grpc。选择哪一款RPC需要根据业务需求作出如下考量:

  1. I/O方式。
    同步阻塞、同步非阻塞(Netty)还是异步阻塞
  2. 连接方式
    长连接还是短连接
  3. 线程调度模型
    是单线程还是多线程,线程调度算法性能等。
  4. 序列化的方式
    是可读的(比如JSON,XML)还是二进制传输,以及序列化/反序列化的效率(序列化的效率直接影响了RPC通信的效率)。
  5. 多语言支持
  6. 服务治理方式
    集群的部署,服务的高可用,服务的发现。

Dubbo: 阿里开源
微服务容器化实践——数据通信模式
Motan: 新浪开源
微服务容器化实践——数据通信模式
Thrift: apache开源
微服务容器化实践——数据通信模式
gRPC: google开源
微服务容器化实践——数据通信模式

微服务容器化实践——数据通信模式

MQ

MQ,即消息队列,是一种 跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种 上下游"逻辑解耦+物理解耦"的消息通信服务。使用MQ后,消息发送上游只需依赖MQ,逻辑上和物理上都不用在依赖其他服务。另外,MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据。

主要框架有:

  • Kafka
  • RabbitMq

MQ与RPC/HTTP的选用

上游实时关注执行结果时,一般选用RPC/HTTP。
数据驱动的任务依赖、上游不关心下游执行结果、异步返回执行时间长的时候,使用MQ。

Socket

socket由 网络层的ip地址 和 运输层的 端口号 组成,可以 唯一标示 网络 中的一个进程。socket是在应用层 和 运输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

Socket 的连接是有状态的,一旦两边连接上了,将一直保持连接,除非人为断开。一般用于游戏,需要持续的网络畅通

其他可以参考: