RPC(Remote Procedure Call)
远程过程(方法)调用,实现RPC这个概念有多种方式,“client访问server上的函数”。
最开始为的就是满足分布式通信,根儿上是二进制数据传输 TCP/IP
步骤演进
V1 最简单的c/s通信,套接字等
V2 相当于把网络和读写数据的活抽象到stub类里去做,程序员只调stub类提供的方法就行,屏蔽了网络的具体实现细节
V3 stub只提供一个方法?代理模式——动态代理
V4 客户端往服务端传方法名、方法类型、方法参数,服务端去调用指定方法
RPC序列化框架
java.io.Serializable
Hessian
google protobuf
facebook thrift
google Gson
Ali FastJson
序列化:把一个对象转换为二进制数组 hessian的字节数组长度小,比jdk快
一些名词
CORBA:古老复杂的支持面向对象的通信协议,互联网公司不用
Web Service(SOA SOAP RDDI WSDI):基于http+xml的标准化web API,效率低
RestFul(Web Service的简单化):通过URL地址拿到对象,JSON格式比xml小很多,http+json
RMI(Remote Method Invocation):Java内部的分布式通信协议
JMS(Java Message Service):JavaEE中的消息框架标准,为很多MQ所支持
RPC:分布式通信方式的一种,服务器集群之间通信一般使用thrift hessian protobuf
一些问题和对应解答(摘自:https://github.com/apache/incubator-brpc/blob/master/docs/cn/overview.md)
1、数据以什么格式传输?不同机器间,网络间可能是不同的字节序,直接传输内存数据显然是不合适的;随着业务变化,数据字段往往要增加或删减,怎么兼容前后不同版本的格式?
- 数据需要序列化,protobuf在这方面做的不错。用户填写protobuf::Message类型的request,RPC结束后,从同为protobuf::Message类型的response中取出结果。protobuf有较好的前后兼容性,方便业务调整字段。http广泛使用json作为序列化方法。
2、一个TCP连接可以被多个请求复用以减少开销么?多个请求可以同时发往一个TCP连接么?
- 用户无需关心连接如何建立,但可以选择不同的连接方式:短连接,连接池,单连接。
3、如何管理和访问很多机器?
- 大量机器一般通过命名服务被发现,可基于DNS, ZooKeeper, etcd等实现。在百度内,我们使用BNS (Baidu Naming Service)。brpc也提供"list://"和"file://"。用户可以指定负载均衡算法,让RPC每次选出一台机器发送请求,包括: round-robin, randomized, consistent-hashing(murmurhash3 or md5)和 locality-aware.
4、连接断开时应该干什么?
- 连接断开时可以重试。
5、万一server不发送回复怎么办?
- 如果server没有在给定时间内回复,client会返回超时错误。
TOSTUDY
https://github.com/button-chen/buttonrpc_cpp14(c++14的rpc实现)
https://blog.csdn.net/wxj1992/article/details/95249044(brpc学习)