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

前言

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

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

rpc框架对比

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

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

rpc 交互的流程

首先服务端创建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 之间已经没有非常明显的界限了。

参考资料

RPC基础以及造一个RPC的轮子需要注意些什么的更多相关文章

  1. hadoop rpc基础

    第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...

  2. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  3. 如何设计一个 RPC 系统

    本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型 ...

  4. 大数据入门第四天——基础部分之轻量级RPC框架的开发

    一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...

  5. 从0 开始手写一个 RPC 框架,轻松搞定!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:juejin.im/post/5c4481a4f265da613438aec3 之前在 RPC框架底层到底什么原理得知 ...

  6. dva的effect那么难用,自己造一个轮子吧

    背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...

  7. [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础

    [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 目录 [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 0x00 摘要 0x0 ...

  8. 编写一个 rpc

    手动编写一个 RPC 调用 package com.alibaba.study.rpc.framework; import java.io.ObjectInputStream; import java ...

  9. 【RPC】手撸一个简单的RPC框架实现

      涉及技术   序列化.Socket通信.Java动态代理技术,反射机制   角色   1.服务提供者:运行在服务端,是真实的服务实现类   2.服务发布监听者:运行在RPC服务端,1将服务端提供的 ...

随机推荐

  1. Linux ulimit使用

    什么是ulimit? ulimit是一个可以设置或者汇报当前用户资源限制的命令.使用ulimit命令需要有管理员权限,它只能在允许使用shell进行控制的系统中使用.也就是说它已经被嵌入到shell当 ...

  2. Zabbix 配置监控 & 触发器

    Zabbix 自定义监控 zabbix-agent 获取数据,然后定义,交给 zabbix-server 端 Zabbix 配置监控项 监控的内容 # 监控服务器登录用户的数量 [root@web01 ...

  3. 排序算法 以及HKU的一些数据结构 相关题目 以及 K叉树,二叉树 排列

    冒泡排序.选择排序.快速排序.插入排序.希尔排序.归并排序.基数排序以及堆排序,桶排序 https://www.cnblogs.com/Glory-D/p/7884525.html https://b ...

  4. C++中main函数的返回值一定要是int

    因为大学上课时候,经常是在主函数中做处理,直接用cout语句输出到显示设备,所以一直在用void main(). 直到后面具体编程的时候,才发现void main()这种用法是按 C89(C语言的早期 ...

  5. C语言中函数的调用方式

    第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

  6. ts 遍历Class上的属性和方法

    interface Type<T> extends Function { new (...args: any[]): T; } class Data { name = "ajan ...

  7. qt char与code的相互转换

    QString str = "A"; QChar c = str.at(0); // int v_latin = c.toLatin1(); // 不能转中文 int v_lati ...

  8. 200万枚SPC空投来袭,这样的薅羊毛活动你确定不参加吗?

    在过去的2020年,币圈真的是很火爆,很多人在参与数字货币交易或DeFi挖矿中赚到了大钱.但是转眼到了2021年,DeFi进入了下半场,区块链市场也进入了新的阶段,那么区块链的下一个爆点是什么呢?很多 ...

  9. 「NGK每日快讯」2021.1.11日NGK第69期官方快讯!

  10. NGK DeFi项目即将上线,打造去中心化闭环金融生态!

    据最新官方消息称:NGK已于近日宣布将进军DeFi领域,NGK此次的DeFi的项目将会是一个去中心的交易平台,其最大的功能是进行数字货币的交换.在用户选择了需要支付的数字货币和想购买的数字货币后,系统 ...