浅谈RPC与Http
什么是RPC,RPC原理是什么?
什么是RPC?
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务A、B部署在两台不同的机器上,那么服务A如果想要嗲用服务B中的某个方法该怎么办呢?使用Http请求当然可以,但是可能会比较慢而且一些优化做的并不好。RPC的出现就是为了解决这个问题。
RPC原理是什么?
1、服务消费方(client)调用以本地调用方式调用服务;
2、client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
3、client stub找不到服务地址,并将消息发送到服务端;
4、server stub收到消息后进行解码;
5、server stub根据解码结果调用本地的服务;
6、本地服务执行并将结果返回给server stub;
7、server stub将返回结果打包成消息并发送至消费方;
8、client stub接收到消息,并进行解码;
9、服务消费方得到最终结果。
时序图如下:
RPC解决了什么问题?
从上面对RPC介绍的内容中,概括来讲,RPC主要解决了:让分布式或者微服务系统中不同服务之间像本地调用一样简单。
常见的RPC框架总结
RMI(JDK自带):JDK自带的RPC,有很多局限性,不推荐使用。
Dubbo:Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成,目前Dubbo已经成为Spring Cloud Alibaba中的官方组件。
gRPC:gRPC是可以在任何环境中运行的现代开源高性能RPC框架,他可以通过插拔的支持来有效的链接数据中心内和跨数据中心的服务,以实现负载均衡,跟踪,运行情况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
Hessian:Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
Thrift:Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。
既然有Http,为啥用RPC进行服务调用?
RPC只是一种设计而已
RPC只是一种概念,一种设计,就是为了解决不同服务之间的调用问题,它一般会包含传输协议和序列化协议这两个。
实现RPC的可以传输协议可以直接建立在TCP之上,也可以建立在HTTP协议之上,大部分RPC框架都是使用的TCP链接(gRPC使用了HTTP2).
Http和TCP
可能现在很多对计算机网络不太熟悉的朋友已经被搞蒙了,要想真正搞懂,还需要简单复习一下计算机网络基础知识:
我们通常说的计算机网络的五层协议的体系结构是指:应用层、传输层、网络层、数据链路层、物理层。
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。Http属于应用层协议,他会基于TCP/IP通信协议来传输数据(Html文件、图片、查询结果等)。Http协议工作于客户端-服务端框架之上。浏览器作为Http客户端通过URL向Http服务端即Web服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息,Http协议建立在TCP协议之上。
传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。TCP是传输层协议,主要解决数据如何在网络中传输。相比于UDP、TCP提供的是面向链接的、可靠的数据传输服务。
主要关键就在于Http使用的TCP协议,和我们自定义的TCP协议在报文上的区别。
http1.1协议的TCP报文包含太多在传输过程中可能无用的信息:
使用自定义TCP协议进行传输就会避免上面这个问题,极大的减轻了传输数据的开销。这也就是为什么通常会采用自定义TCP协议的RPC来进行服务调用的真正原因。除此之外,成熟的RPC框架还提供好了“服务自动注册于发现”、“智能负载均衡”、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择RPC进行服务注册和发现的一方面原因吧。
一个常见的错误观点
很多文章中还会提到说Http协议相较于自定义TCP报文协议,增加的开销在于链接的建立与断开,但是这个观点已经被否认,下面截取自某乎中的一个回答:
浅谈RPC与Http的更多相关文章
- 浅谈RPC调用
RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...
- 浅谈RPC框架
RPC(Remote Promote Call) RPC(Remote Promote Call):一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- TODO:浅谈pm2基本工作原理
TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...
- 浅谈测试rhel7新功能时的感受及遇到的问题【转载】
半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...
- Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice
浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...
- 【转】浅谈.net remoting 与webservice
1. .NET Remoting .NET Remoting是微软随.NET推出的一种分布式应用解决方案,被誉为管理应用程序域之间的 RPC 的首选技,它允许不同应用程序域之间进行通信(这里的通信可以 ...
- 浅谈REST API
浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...
- 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招
朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...
随机推荐
- 原来rollup这么简单之 rollup.rollup篇
大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 计划 rollup系列打算 ...
- 事务的隔离级别,mysql中开启事务、django中开启事务
目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...
- USB设备描述符和请求命令
USB设备描述符和请求命令 介绍标准的USB设备描述符和请求命令. 标准的USB描述符 当USB设备第一次连接到主机上时,要接收主机的枚举和配置,目的就是让主机知道该设备具有什么功能.是哪一类的USB ...
- .Net Core 实现图片验证码
记录自己的学习,参考了网上各位大佬的技术,往往在登录的时候需要使用到验证码来进行简单的一个校验,这边使用在.net core上进行生成图片二维码 思路很简单=> 生成一个随机数->保存到服 ...
- sql 语句系列(null 值处理)[八百章之第二章]
查找只存在一个表中的数据 有两张表: EMP: select * from emp DEPT: 他们有共同的属性:deptno 现在要查询EMP 中的deptno不等于DEPTNO的deptno项. ...
- iOS 指纹认证登陆开发(TouchID)
设计思路 TouchID 关联账号 用户登陆成功 -> 开启TouchID登陆 -> TouchID验证 -> 记录用户信息(验证通过) -> 关联完成 TouchID 登陆 ...
- DIV常用属性大全
目录 一.属性列表 二.常用属性 三.一些特殊效果 四.定位和控制 一.属性列表 color : #999999 文字颜色 font-family : 宋体 文字字型 font-size : 10pt ...
- red hat重置密码
步骤1:打开red hat 步骤2:看到如图画面时按e 进入到这个界面 步骤4:按e,看到如下画面后,选第二项,然后按e 步骤5:在“quiet"后面输入 空格single 后按b ...
- MySQL学习(3)
一 SQL语句 1. 数据库级别(*) 显示全部数据库:show databases; 创建数据库:create database '数据库名字’; 使用数据库:use '数据库名字'; 删除数据库: ...
- vue one one
目录 Vue 渐进式 JavaScript 框架 一.走进Vue 1.what -- 什么是Vue 2.why -- 为什么要学习Vue 3.special -- 特点 4.how -- 如何使用Vu ...