RPC基础以及造一个RPC的轮子需要注意些什么

RPC基础以及造一个RPC的轮子需要注意些什么

前言

rpc即远程过程调用,是分布式系统常用的通信方法。远程可以是在一台机器上的不同进程或在不同一个机器上的不同进程。rpc更看重速度,像调用本地方法一样调用远程方法。除 RPC 之外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等

如果两个子系统没有在网络上进行分离,而是运行在同一个操作系统实例之上的两个进程时,它们之间的通信手段还可以更加丰富。除了以上提到的几种分布式解决方案之外,还有共享内存、信号量、文件系统、内核消息队列、管道等,本质上都是通过操作系统内核机制来进行数据和消息的交互而无须经过网络协议栈。

rpc框架对比

RPC基础以及造一个RPC的轮子需要注意些什么_第1张图片

开发语言:借助代码生成工具根据服务描述文件生成不同的client server端的代码。

跨语言:server和client是否可以使用不同语言
服务治理:对服务进行管理,监控,降级,权限控制
注册中心:client端能够通过注册中心找到server,是锦上添花的作用。当不使用注册中心时。client可以在本地存储server端地址,采用直连的方式通信。

rpc 交互的流程

RPC基础以及造一个RPC的轮子需要注意些什么_第2张图片

RPC基础以及造一个RPC的轮子需要注意些什么_第3张图片

首先服务端创建socket绑定端口号,监听请求。

客户端创建socket,将rpc指令(客户端进行编码)写到到内核的发送缓存中,内核将发送缓存中的数据传送到物理硬件 NIC,也就是网络接口芯片 (Network Interface Circuit)。NIC 负责将翻译出来的模拟信号通过网络硬件传递到服务器硬件的 NIC。

服务器的 NIC 再将模拟信号转成字节数据存放到内核为套接字分配的接收缓存中,最终服务器进程从接收缓存中读取数据即为源客户端进程传递过来的 RPC 指令消息。

然后服务端再对RPC指令消息进行解码,找到客户端想要调用服务(类,方法)。进行调用后将数据返回。

返回则是逆向的过程,服务端将数据写回内核为socket分配的发送缓存,将nic发送到客户端,客户端经nic接受到接收缓存,进行解码,拿到数据。

socket 是对tcp udp协议进行封装。http是对socket进行封装
tcp udp =》 socket =》 http websocket

rpc 通信使用了哪种协议?

rpc序列化后传输内容可以是文本形式,也可以是二进制的形式。

文本格式可读性很强,但是缺点会传递太多的冗余信息,比如json格式中过多:,"",仅仅只是 value 的值不一样,也需要发送同样的 key 字符串信息。redis中的协议也是文本协议,也会传递大量\r\n 。浪费流量。

二进制的形式可读性差,但是对计算机友好。

造一个rpc轮子需要考虑那些方面?

博主在根据网上教程造rpc轮子时,总结了一下需要注意的点。经过造轮子可以更加深入的学习rpc,考虑不全是必定的。并且没有考虑有注册中心的方式,仅仅是两端进行调用。其中服务端有两种实现方式,采用jetty服务器开启服务监听,或者使用netty。

client端:

保留服务存根,也就是知道服务端提供了那些服务的接口。

配置服务端服务的地址,ip。当有多个时,可以考虑负载均衡,进行选择。

网络部分:如何请求服务端的地址。简单实现可通过http请求。或者和服务端的netty进行连接后,往通道中写入数据。

server端:

监听端口,等待客户端连接。可以使用jetty,使用netty 监听也可。netty的方式性能更高。

根据客户端的请求找到相应的服务进行执行。此处可以反射的方式找到。服务端可缓存一个注册中心map,便于通过名称找到相应的服务。

公共部分:

序列化的部分:rpc 中的协议。例如对消息(传输的对象)进行编码解码成相对应的byte数组。

请求的格式,返回的格式。规定好传输的对象形式。请求格式比如请求id,请求的服务名称(或者类名,方法名),请求的参数。返回格式比如请求id,返回的数据,状态码等。

rpc和其他分布式交互方式对比有哪些不同?

其中 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互。HTTP 调用其实也可以看成是一种特殊的 RPC,只不过传统意义上的 RPC 是指长连接数据交互,而 HTTP 一般是指即用即走的短链接。

其中使用中间件可以对数据进行存储 如消息队列,数据库的方式。

HTTP 调用其实也是一种特殊的 RPCHTTP1.0 协议时,HTTP 调用还只能是短链接调用,一个请求来回之后连接就会关闭。HTTP1.1 在 HTTP1.0 协议的基础上进行了改进,引入了 KeepAlive 特性可以保持 HTTP 连接长时间不断开,以便在同一个连接之上进行多次连续的请求,进一步拉近了 HTTP 和 RPC 之间的距离。

当 HTTP 协议进化到 2.0 之后,Google 开源了一个建立在 HTTP2.0 协议之上的通信框架直接取名为 gRPC,也就是 Google RPC,这时 HTTP 和 RPC 之间已经没有非常明显的界限了。

参考资料

  • https://www.zhihu.com/question/25536695/answer/417707733
  • https://juejin.im/book/5af56a3c518825426642e004

你可能感兴趣的:(RPC基础以及造一个RPC的轮子需要注意些什么)