远程调用方式 RPC 和 Http_远程调用可以用http吗-程序员宅基地

技术标签: 远程调用方式  

无论是微服务还是分布式服务(都是SOA,都是面向服务编程),都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?

常见的远程调用方式有以下几种:

RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用,是JAVA中的概念,是JAVA十三大技术之一)。
–RPC的框架:webservice(cxf)、dubbo
–RMI的框架:hessian(比较轻量)

Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。
现在热门的Rest风格,就可以通过http协议来实现。
–http的实现技术:HttpClient

相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务
不同点
RPC:框架有:dubbo、cxf、(RMI远程方法调用)Hessian
当使用RPC框架实现服务间调用的时候,要求服务提供方和服务消费方 都必须使用统一的RPC框架,要么都dubbo,要么都cxf

跨操作系统在同一编程语言内使用
优势:调用快、处理快

http:框架有:httpClient
当使用http进行服务间调用的时候,无需关注服务提供方使用的编程语言,也无需关注服务消费方使用的编程语言,服务提供方只需要提供restful风格的接口,服务消费方,按照restful的原则,请求服务,即可

跨操作系统跨编程语言的远程调用框架
优势:通用性强

总结:对比RPC和http的区别
1 RPC要求服务提供方和服务调用方都需要使用相同的技术,要么都hessian,要么都dubbo
而http无需关注语言,只需要遵循rest规范
2 RPC的开发要求较多,像Hessian框架还需要服务器提供完整的接口代码(包名.类名.方法名必须完全一致),否则客户端无法运行

3 Hessian只支持POST请求

4 Hessian只支持JAVA语言

2.1.认识RPC

RPC,即 Remote Procedure Call(远程过程调用),是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。说得通俗一点就是:A计算机提供一个服务,B计算机可以像调用本地服务那样调用A计算机的服务。
通过上面的概念,我们可以知道,实现RPC主要是做到两点:
•实现远程调用其他计算机的服务
–要实现远程调用,肯定是通过网络传输数据。A程序提供服务,B程序通过网络将请求参数传递给A,A本地执行后得到结果,再将结果返回给B程序。这里需要关注的有两点:
•1)采用何种网络通讯协议?
–现在比较流行的RPC框架,都会采用TCP作为底层传输协议
•2)数据传输的格式怎样?
–两个程序进行通讯,必须约定好数据传输格式。就好比两个人聊天,要用同一种语言,否则无法沟通。所以,我们必须定义好请求和响应的格式。另外,数据在网路中传输需要进行序列化,所以还需要约定统一的序列化的方式。
•像调用本地服务一样调用远程服务
–如果仅仅是远程调用,还不算是RPC,因为RPC强调的是过程调用,调用的过程对用户而言是应该是透明的,用户不应该关心调用的细节,可以像调用本地服务一样调用远程服务。所以RPC一定要对调用的过程进行封装
在这里插入图片描述

2.2.认识Http

Http协议:超文本传输协议,是一种应用层协议。规定了网络传输的请求格式、响应格式、资源定位和操作的方式等。但是底层采用什么网络传输协议,并没有规定,不过现在都是采用TCP协议作为底层传输协议。说到这里,大家可能觉得,Http与RPC的远程调用非常像,都是按照某种规定好的数据格式进行网络通信,有请求,有响应。没错,在这点来看,两者非常相似,但是还是有一些细微差别。
•RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。
•Http中还定义了资源定位的路径,RPC中并不需要
•最重要的一点:RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。Http协议没有这样的要求,因此请求、响应等细节需要我们自己去实现。
优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台
缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境。
例如我们通过浏览器访问网站,就是通过Http协议。只不过浏览器把请求封装,发起请求以及接收响应,解析响应的事情都帮我们做了。如果是不通过浏览器,那么这些事情都需要自己去完成。
在这里插入图片描述

2.3.如何选择?

既然两种方式都可以实现远程调用,我们该如何选择呢?

速度来看,RPC要比http更快,虽然底层都是socket,但是http协议的信息往往比较臃肿
难度来看,RPC实现较为复杂,http相对比较简单
灵活性来看,http更胜一筹,因为它不关心实现细节,跨平台、跨语言。
因此,两者都有不同的使用场景:
•如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。
•如果需要更加灵活,跨语言、跨平台,显然http更合适

那么我们该怎么选择呢?
微服务,更加强调的是独立、自治、灵活。而RPC方式的限制较多,因此微服务框架中,一般都会采用基于Http的Rest风格服务。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39871957/article/details/93173860

智能推荐

python对称加密_pyDes 实现 Python 版的 DES 对称加密/解密--转-程序员宅基地

文章浏览阅读492次。https://my.oschina.net/leejun2005/blog/586451手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓了两下 pyDes 貌似很方便,不过据网上其他同学测试说PyCrypto 性能要比 pyDes 高一个数量级,这里我没有做具体性能测试,也没有选用 PyCrypto主要原因有三:(1)PyCrypt..._cipher.getinstance("des") 转 python

STM32 fft加窗的问题(汉宁窗)-程序员宅基地

文章浏览阅读1.2k次。  在FFT处理线面呢,很多人就说要加窗,加窗的好处了就是防止能量泄露和高频滤波啊,不过精度呢就会相应的降低。(听说是这样的。本人小白)  窗的种类也很多啦,然后听说啥都不懂的就可以了选择汉宁窗。。。  在MATLAB里面呢直接调用hann();  然后呢在stm32里面呢就直接一个for。。。。。。感觉用了后腰也不疼了,上楼也有力了,波形貌似变好了。。。。  float ..._stm32 hanning窗

Python 字典写入TXT文件_python 把字典写入记事本-程序员宅基地

文章浏览阅读4.1w次,点赞37次,收藏146次。Python字典数据写入TXT文件分析关于字典数据字典中get()、keys()、values()、items()方法的使用取出字典中的数据并写入txt中关于字典数据一个字典由key和value组成,可以通过key值、get()、keys()、values()、items()等方法查找字典中的数据。字典中get()、keys()、values()、items()方法的使用get()方法:..._python 把字典写入记事本

【重识云原生】第六章容器6.1.5节——Docker核心技术Namespace_docker;nvme;namespace-程序员宅基地

文章浏览阅读982次。Linux Namespace是Linux提供的一种内核级别环境隔离的方法。很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等系统资源的隔离机制。在此机制下,这些系统资源不再是全局性的,而是属于特定的Namespace。........._docker;nvme;namespace

关于Pycharm代码不报异常的解决方案_pycharm 不报错只退出代码-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏5次。解决Pycham不报错问题_pycharm 不报错只退出代码

Python案例实战:天气数据集爬取 + 多组可视化图表分析_爬取天气数据并可视化流程图-程序员宅基地

文章浏览阅读8k次,点赞13次,收藏202次。导语前几天出门去练车,刚好下午14:00,真真的是”锄禾日当午,汗滴禾下土“。那要不是我意志力坚定,肯定弃车????而跑了,难道只有长沙这么高的温度。我不服,我要看看其他地方的温度怎么样?咱们比上一比~~~今天小编就带大家爬取部分地区的温度并可视化,来,上数据!!正文环境安装部分:Python版本:3.6.4;PIL模块;requests模块;pyecharts模块;以及一些Python自带的模块。模块安装: pip install +模块名编程实现主要思路:_爬取天气数据并可视化流程图

随便推点

PyQt5如何解决无窗口拖放问题_pyqt5无窗口创建拖动窗口位置控件-程序员宅基地

文章浏览阅读112次。解决无窗口拖放问题_pyqt5无窗口创建拖动窗口位置控件

使用GoLang开发游戏服务器(九)_golang 游戏服务器-程序员宅基地

文章浏览阅读752次。使用GoLang开发游戏服务器(九)连接管理模块服务器需要存储每个连接进入服务器的connection对象,以便于进行管理新增接口IConnectionManagertype IConnectionManager interface { AddConnection(conn IConnection) RemoveConnection(conn IConnection) GetConnection(connID uint32) (IConnection, error) GetConnect_golang 游戏服务器

uniapp项目提示打包时未添加videoplayer模块_uniapp打包时未添加videoplayer模块-程序员宅基地

文章浏览阅读9.8k次,点赞7次,收藏10次。1、uniapp项目,遇到视频提示打包时未添加videoplayer模块2、如果是云打包只需在manifest.json,模块权限配置中勾选即可。跳转官方文档3、如果是使用Android离线打包则需要把 media-release.aar,weex_videoplayer-release.aar 这两个文件复制到项目的libs目录下(文件可以在原始工程找到,如果找不到则需要下载新版。官方下载链接)4、然后需要在dcloud_properties.xml中添加如下代码,应该就可以正常使用了<_uniapp打包时未添加videoplayer模块

zabbix添加对自定义无规则的关键日志文件的监控-程序员宅基地

文章浏览阅读51次。zabbix添加对自定义无规则日志文件的监控项目背景及思路:zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控就不适用了此次需要监控关键的esb企业总线文件日志,当tail -f esb日志出现大量failture的时候就是业务可能出现故障的时候,需要触发警报具体步骤:..._zabbix监控日志的低层语句

编程技巧1_哨兵值-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏3次。在两个元素的遍历比较过程中,可能会出现一个数组提前遍历结束的情况,为了避免这样的情况,我们可以引入哨兵值,该值是一个比较关系中的最大值或者最小值,这个哨兵值会被我们放在数组的最后一个元素,含有哨兵值的数组会比原数组多一个元素。这样的好处在于,遍历比较过程永远也不会出现提前结束的现象。下面用归并排序中的合并两个有序的子数组为例说明哨兵值的威力://编写一个Merge函数 public s_哨兵值

python常见函数-程序员宅基地

文章浏览阅读103次。gzip.open(): https://blog.csdn.net/kanon122500000/article/details/61198902struct.unpack(): 读取数据