主要解释一下关于客户端与服务器交互的一些概念,纯属个人学习笔记,欢迎指正
关于分布式系统的设计,不可避免的会遇到这样一个问题,客户端如何获取服务器资源。从这个角度来说,我认为有两种方式,一种叫RPC,另一种叫REST。
RPC,我的理解是面向动作,即客户端调用服务器的某个方法来获取资源,比如XXX.get_xxx()
。而REST,面向资源,通常是利用一个URL,一般是HTTP协议以及对应的put,get,post,delete方法来获取资源,比如http:xxx.xx/a/b/c
。它不考虑具体的方法名称,只关心资源的位置。由此又产生了一个新的问题,用什么协议或者说用什么格式来表示双方通信的过程呢,还得利于不同语言的扩展。
最常见的表示格式是XML,JSON这两个基于文本的消息表示格式,RPC和REST都可以用这两种表示方法,soap就是XML-RPC的一个扩展。
但是XML太笨重,解析能力差,JSON呢有时又表达能力不够。于是就想有没有其他通用的表示格式。二进制消息往往性能好,效率高,但是不同的语言对应的二进制消息不一样,这就带来了序列化和反序列化的问题。通常的做法是用一个中间定义语言来描述,比如thrift的IDL,其他的还有Google protobuf(只涉及序列和反序列问题,类似xml/json),apache avro。thrift和avro都提供了全套的RPC解决方案。