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. python爬虫下载小视频和小说(基础)

    下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...

  2. Gym 2009-2010 ACM ICPC Southwestern European Regional Programming Contest (SWERC 2009) A. Trick or Treat (三分)

    题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; lo ...

  3. SQL Server 新安装启用sa用户/sa用户登录提示管道另一端无进程

    安装时只用windows验证 安装完成后: 首先选中服务器(右键)->属性->安全性->服务器身份验证修改为"SQL SERVER和WINDOWS身份验证模式"其 ...

  4. enumerate() -- Python

    #!usr/bin/env python #coding:utf-8 ''' enumerate()说明: 1.enumerate()是Python的内置函数: 2.enumerate字面上是枚举.列 ...

  5. CF1463-D. Pairs

    CF1463-D. Pairs 题意: 有从\(1\)到\(2n\)一共\(2n\)个数字,让你将这\(2n\)个数字分成\(n\)组,每组有两个数字.对于这\(n\)组数字,你可以从中挑选\(x\) ...

  6. VS2010下如何查看类的内存布局

    用VS2010查看类的内存布局,这里用两种方法 (1)MSVC有个隐藏的"/d1"开关,通过这个开关可以查看项目中类的内存布局情况. 修改项目属性,添加"/d1 repo ...

  7. HashMap三百问

    文章目录: 一.JDK1.7之HashMap 二.JDK1.8之HashMap 三.Hashtable JDK1.7之HashMap 1. 定义 HashMap实现了Map接口,继承AbstractM ...

  8. LVS之DR模式部署

    一.LVS-DR数据包流向分析 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线为1-2-3-41.Client 向目标 VIP 发出请求,Director(负载均衡器)接 ...

  9. 使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库

    使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库 iframe 嵌套 iframe iframe 包含 复制的 HTML 页面 和支持可以拖拽的工具栏 鼠标经过上面,智能识别 ...

  10. O² & O₂

    O² & O₂ special symbol O² & O₂ HTML HTML subscript and superscript Tags HTML 下标元素 HTML 上标元素 ...