这几天在学习rest、rpc和thrift框架,记录一下:
文章目录
rest
Resource Representational State Transfer
URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
rpc
Remote Procedure Call Protocol
把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务
https://www.jianshu.com/p/2accc2840a1b
重要技术:序列化与反序列化
thrift
thrift协议栈
参考官方说明文档:http://thrift.apache.org/docs/concepts
参考:https://segmentfault.com/a/1190000014699502
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
Transport
传输层用于完成网络的读写功能。以字节流的方式传输。例如,TSocket对应socket传输,TFileTransport对应文件传输。
一些方法:open,close,read,write,flush。
服务器端一般用ServerTransport接口。
一些方法:open,listen,accept,close。
Protocol
协议指定了数据类型如何使用底层传输来对自身进行编码/解码。包括json、xml、纯文本、紧凑二进制等。如int32会被TBinaryProtocol编码为一个4字节数据,或TBinaryProtocol从TTransport中取出4个字节数据解码为int32。
Processor
Processor封装了从输入流读取数据和往输出流写入数据的能力。流用Protocol对象表示。
processor负责对client的请求进行响应,包括rpc请求转发,调用参数解析和用户逻辑调用,返回值写回等处理步骤。processor是服务端从thrift框架转入用户逻辑的关键流程。processor同时也负责向消息结构中写入数据或读出数据。
特定于服务的处理器实现由编译器生成。 处理器基本上从线路中读取数据(使用输入协议),将处理委托给处理程序(由用户实现)并通过线路写入响应(使用输出协议)。
Server
服务层汇聚了以上所有功能:
- 创建一个传输
- 为传输创建输入/输出协议
- 根据输入/输出协议创建处理器
- 等待传入连接并将其交给处理器
TServer主要任务是高效地接受client的请求,特别是高并发请求的情况下快速完成请求。
核心库接口
TServer
- TSimpleServer:单线程阻塞io
- TThreadedServer:多线程阻塞io
- TThreadPoolServer:多线程阻塞io,采用线程池
- TNonBlockingServer:多线程非阻塞io
TTransprort
传输层只负责将字节流按顺序发送与接收,并不关心字节流本身的内容。
- TSocket:阻塞TCP socket模式
- THttpTransport:http传输协议
- TFileTransport:文件传输
- TZlibTransport:与其他transport组合使用,将收到的数据压缩、解压缩
TProtocol
协议层负责将字节流的数据转换成数据流。按照指定类型读取与写入数据。
- TBinaryProtocol:二进制编码
- TCompactProtocol:密集型二进制编码
- TJSONProtocol:JSON数据编码协议
- TSimpleJSONProtocol:JSON只写协议
- TDebugProtocol:文本格式
TProcessor
TProcessor主要对TServer中一次请求的inputProtocol和outputProtocol进行操作,也就是从inputProtocol中读出client的请求数据,向outputProtocol写入用户逻辑的返回值。
ThriftClient
- send步骤,将用户的调用参数作为一个整体的struct写入TProtocol,并发送到TServer。
- send结束后,thriftClient便立即进入receive状态等待TServer的响应。对于TServer的响应,使用返回值解析类进行返回值解析,完成rpc调用。
下一篇打算写一下官网那个java的计算器例子。