初识RPC

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学习)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值