一、前言

   凤凰架构:构建可靠的分布式系统,本书对系统的服务架构的演进比较详细的描述,介绍了单体系统时代、原始的分布式时代、SOA时代、微服务时代、后微服务时代、无服务时代。后续章节的内容是围绕着,1、架构师的视角,包括服务进程间访问、事务一致性、缓存、负载均衡、安全性等架构师在设计阶段必须要考虑的问题;分布式的基石,包括服务的注册与发现、网关意义、流量治理容错策略,限流设计,服务安全授权与认证、可观测性的日志收集,存储与加工可视化、链路追踪数据收集与聚合、存储查询、监控预警等;不可变基础设施,包括容器崛起使用容器部署服务、虚拟化网络设备,K8S容器编排和调度,服务网格化等。该书详细介绍了服务间的远程访问RpcRESTful的发展,对其内容进行总结。

二、RPC

  1、什么是远程服务调用(RPC),远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。由单机扩展到网络,本地到远程,使用于构建分布式系统到现在的浏览器、移动设备、桌面应用和服务端程序的交互。

  2、远程服务调用的起源,IPC(进程间通信),为解决不同进程间通信提出了几种解决办法比如管道(Pipe)或者具名管道,管道应用于亲缘关系的进程而具名管道则可以使用于非亲缘关系管道,传递少量字符流或者字节流;信号机制,给进程间发送信号;信号量;消息队列,构建生产和消费消息的消费者模式,实现进程间通信;共享内存,如果进程间可以访问同一块内存区域,也可以实现通信,加入互斥和协同的机制;本地套接字接口(IPC Socket),套接字(Socket)的出现不仅限于本机通信,还可以网络通信。

  3、远程服务调用的基本问题,如何表示数据,不同的进程、不同系统、或者硬件使得发送方和接受方如何统一数据即序列化和反序列化的问题,出现如XDR、CDR、Java RMI对象序列化流协议、Grpc的Protocol Buffers、WebService的XML序列化、轻量级的JSON序列化;如何传递数据,在网络中怎么传递数据,使用传输层的TCP或者UDP协议、还是应用层的HTTP协议、或者其他传输层,应用层的协议,要实现的异常、超时、安全、认证、授权、事务等内容。比如JRMR、IIOP、DDS、WebServiceSOAP(简单对象访问协议)、直接使用HTTP;如何表示方法,访问远程的方法,如何找到对应的方法需要一套描述性的语言在进程间起到桥梁的作用,比如Android的AIDL、OMG IDL、WebServiceWSDL、JSON,定义一套与语言无关的接口描述语言。

  4、RPC的发展过程,统一的RPC,在发展中一直想提出一个统一RPC,但是统一带来的是复杂性、性能问题、语言的兼容性等,所以Web Service出现打破这一统一,基于XML作为远程过程调用的序列化、接口描述、服务发现慢慢广泛使用。但是WebService的XML一样存在严格的数据和接口定义带来的性能问题。分裂的RPC,因为早期的RPC的过于标准化和复杂性带来的不易使用,虽然WebService的特性相对于早期RPC改善很多但是一样有局限性,所以慢慢出现各种各样自定义的RPC,比如Facebook的Thrift、阿里的Dubbo、谷歌的gRPC、微软的.NET Remoting、WCF等。使用者选择RPC也是在三个问题上进行行取舍,要易用性、要效率还是通用性。

  5、RPC与REST(表征状态转移),REST是基于HTTP协议的与HTTP的关系如抽象接口和实现的关系,涉及的概念资源,资源是包括数据和信息,抽象的内容类似于操作系统中将硬件抽象成文件一样;表征是访问资源时候通过什么形式表达出来,比如HTML、PDF、MarkDown、RSS等;状态是上下文信息,分为有状态和无状态,有状态是用户记住用户状态,无状态是由服务端记录。转移是基于当前的资源获取下一个资源服务;统一接口是在HTTP(REST与HTTP的紧密关系)中定义好一套“统一接口”包括POST、GET、DELETE、PUT等七个基本操作;超文本驱动;自描述信息由于表征状态的多样通过请求头Content-Type定义请求的数据格式和返回的数据格式。REST是面向资源编程的思想,将提供的服务看成一种资源然后基于资源使用基本操作提供功能,而RPC则是面向过程或者面向对象编程,通过远程服务定义聚合在一起的复杂的业务逻辑,当然REST可以自定义操作来提供服务。

三、总结

  基于RPC的远程服务调用对于分布系统和微服务都是很重要的一环,通过RPC提供安全、高效的远程服务能力才能更好服务于分布式服务或微服务。目前的RPC处于多样化的阶段,因为传输的协议(UDP/TCP、HTTP、Socket)、传输的数据格式、系统语言、数据安全性和性能要求让使用者依据具体情况选择合适的RPC实现远程服务调用。

  读完这一章节关于RPC和REST的介绍使用清晰了很多,对于REST很多时候我们就是简单创建一个WebApi接口程序,然后定义、使用接口,并不清楚其面向资源编程、表征状态转移、统一接口的特性,不过在使用中也是依据实际情况使用。REST和RPC相比还是不一样的只是存在部分内容重合,相比较RPC定义了协议、数据格式、事务的支持、传输的可靠性等要求,REST定义自然不一样其用途也不一样。