RPC基础以及造一个RPC的轮子需要注意些什么
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 之间已经没有非常明显的界限了。
参考资料
- https://www.zhihu.com/question/25536695/answer/417707733
- https://juejin.im/book/5af56a3c518825426642e004
RPC基础以及造一个RPC的轮子需要注意些什么的更多相关文章
- hadoop rpc基础
第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...
- 如何设计一个RPC系统
版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...
- 如何设计一个 RPC 系统
本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型 ...
- 大数据入门第四天——基础部分之轻量级RPC框架的开发
一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...
- 从0 开始手写一个 RPC 框架,轻松搞定!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:juejin.im/post/5c4481a4f265da613438aec3 之前在 RPC框架底层到底什么原理得知 ...
- dva的effect那么难用,自己造一个轮子吧
背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...
- [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础
[源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 目录 [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 0x00 摘要 0x0 ...
- 编写一个 rpc
手动编写一个 RPC 调用 package com.alibaba.study.rpc.framework; import java.io.ObjectInputStream; import java ...
- 【RPC】手撸一个简单的RPC框架实现
涉及技术 序列化.Socket通信.Java动态代理技术,反射机制 角色 1.服务提供者:运行在服务端,是真实的服务实现类 2.服务发布监听者:运行在RPC服务端,1将服务端提供的 ...
随机推荐
- 1.搭建NFS环境,用于存储数据
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-12 14:59:50 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- Verilog hdl 实现单周期cpu
参考计组实验测试指令 - 简书,添加了一些细节. 1.添加 bne指令 修改 ctrl.v 之后修改mipstestloopjal_sim.asm,mars dump 为 bnetest. ...
- 北京网络赛G BOXES 大模拟+BFS
题目描述 Description There is a strange storehouse in PKU. In this storehouse there are n slots for boxe ...
- 网易吃鸡 mac 版,没有声音
网易吃鸡 mac 版,没有声音 bug 声音太小了 客服电话 问题反馈 提交工单 https://gm.163.com/user_help.html?index=5&stypeid=3619 ...
- Taro 3.x in Action
Taro 3.x in Action React, 小程序 https://taro-docs.jd.com/taro/docs/README Taro Next 跨端, 跨框架 Taro 是一个开放 ...
- GitHub & GraphQL API
GitHub & GraphQL API https://gist.github.com/xgqfrms/15559e7545f558d85c5efdea79171a3d refs xgqfr ...
- vue常用方法封装-一键安装使用(赠送免费工具)
相信大家在使用vue开发过程中一定遇到了各种方法的整理收集,每次遇到新的问题都需要找到合适的方法 这里我给大家封装了一些vue项目中常用到的方法合集,免费提供费大家 因此,jsoften横空出世,不为 ...
- ASP.NET Core WebApi版本控制
前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi ...
- 执行Python程序时模块报错
1. 在执行python程序时遇到 'ModuleNotFoundError: No module named 'xxxxx'' : 例如: 图片中以导入第三方的 'requests' 模块为例,此报 ...
- Python 学习笔记(2)
python 引号 Python 可以使用引号( ' ).双引号( " ).三引号( ''' 或 """ ) 来表示字符串,引号的开始与结束必须是相同类型的. ...