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. C# 网络加密与解密

    数据在网络传输过程中的保密性是网络安全中重点要考虑的问题之一.由于通过网络传递数据是在不安全的信道上进行传输的,因此通信双方要想确保任何可能正在侦听的人无法理解通信的内容,而且希望确保接收方接收的信息 ...

  2. C++实现二叉树的基本操作:建立、遍历、计算深度、节点数、叶子数等

    题意: 代码实现: #include<iostream> #include<queue> #include<stack> using namespace std; ...

  3. ArcMobile的CoordinateCollection在逆时针添加点时自动调整节点顺序的问题

    为了使用ArcMobile实现量测功能,LZ自定义了一个MapGraphicLayer用于绘图,代码如下: using System.Drawing; using ESRI.ArcGIS.Mobile ...

  4. java中的装箱及拆箱

    java中存在8中基本的数据类型,每一种数据类型都有包装类型. 包装类型:每一个基本的数据类型都会------对应一个包装类型. boolean------------------>Boolea ...

  5. 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)

    第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...

  6. CPU饥饿与线程饥饿

    线程饥饿: 进程无法得到资源,(cpu或者io资源或者别的什么资源),所以无法进行下去 比如说读者写者问题,如果读者优先,那么写者可能会饿死. 又比如操作系统概念的一道习题. 用broadcast可能 ...

  7. Codeforces13C–Sequence (区间DP)

    题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少? 题解 一个很显然的结果就是,变化后的每一个值肯定是等于原来序列的某个值,因为 ...

  8. hdu 6242 Geometry Problem

    Geometry Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other ...

  9. 深入理解gradle中的task

    目录 简介 定义task tasks 集合类 Task 之间的依赖 定义task之间的顺序 给task一些描述 task的条件执行 task rule Finalizer tasks 总结 深入理解g ...

  10. Tensorflow+InternalError: Blas GEMM launch failed

    [参考1:]https://stackoverflow.com/questions/37337728/tensorflow-internalerror-blas-sgemm-launch-failed ...