RPC 服务 与 HTTP 服务的区别

1、什么是RPC

 

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

 

RPC采用客户机/服务器(c/s)模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

 

2、OSI网络七层模型

 

在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型,它可以分为以下几层(自下而上):

图片

第一层:物理层。这一层主要就是传输这些二进制数据。

第二层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;

第三层:网络层。定义网络设备间如何传输数据;

第四层:传输层。管理着网络中的端到端的数据传输;

第五层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;

第六层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;

第七层:应用层。定义了用于在网络中进行通信和传输数据的接口;

 

3、RPC调用流程

 

简单地说一下,一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub

 

1、 客户端(RPC Client):服务调用方

 

2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方

 

3、 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务

 

4、 服务端(RPC Server):真正的服务提供者。

 

RPC采用C/S模式,请求程序就是一个客户端应用,而服务提供者就是一个服务器。首先,服务消费者(RPC客户端应用)调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务提供方(RPC服务器端),进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,调用服务端方法对调用请求进行计算而得到计算结果,并发送答复信息,然后等待下一个调用信息;最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

图片

 

 

4、RPC架构的作用

 

RPC 的主要目标是让构建分布式计算(应用)更容易、透明,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。RPC框架负责屏蔽底层的传输方式(TCP或者UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。

 

5、常见RPC技术和框架

 

(1)、应用级的服务框架:阿里的Dubbo/Dubbox、Google GRPC、Spring Boot/Spring Cloud。

 

(2)、远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

 

(3)、通信框架:MINA和Netty

 

6、HTTP服务 VS RPC服务

 

传输协议

 

RPC,可以基于TCP协议,也可以基于HTTP协议

 

HTTP,基于HTTP协议

 

传输效率

 

RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率

 

HTTP,如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理

性能消耗,主要在于序列化和反序列化的耗时

 

RPC,可以基于thrift实现高效的二进制传输

HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能

 

负载均衡

 

RPC,基本都自带了负载均衡策略

 

HTTP,需要配置Nginx,HAProxy来实现

 

服务治理(下游服务新增,重启,下线时如何不影响上游调用者)

 

RPC,能做到自动通知,不影响上游

 

HTTP,需要事先通知,修改Nginx/HAProxy配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存雪崩、击穿、穿透解决方案

用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求,都访问数据库的话,请求数量一上来,数据库很容易就奔溃的了,所以为了避免用户直…

【Docker】容器镜像有哪些特性

首先解释一下什么是Docker镜像? Docker镜像它其实是一个模板,拥有这个模板我们才能创建我们的Docker容器,镜像里含有启动 docker 容器所需的文件系统结构及其内容,因此是启动一个 docker 容器的基础。docker 镜像的文件内容以及一…

nginx中的location指令

1、location 介绍 location是Nginx中的块级指令(block directive),location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。 开始之前…

容器底层实现技术Namespace/Cgroup

Docker容器实现原理 Docker容器在实现上是通过namespace技术来进行进程隔离,通过cgroup技术实现容器进程可用资源的限制,当docker启动一个容器时,实际是创建了多了namespace参数的进程。 Namespace Namespace:命名空间 作用&#…

异方差与多重共线性对回归问题的影响

异方差的检验 1.异方差的画图观察 2.异方差的假设检验,假设检验有两种,一般用怀特检验使用方法在ppt中,课程中也有实验,是一段代码。 异方差的解决办法 多重共线性 多重共线性可能带来的影响: 多重共线性的检验 多重…

如何修改Docker的镜像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的国内镜像源镜像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重启Docker服务 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

Oracle行转列语法总结大全

一、decode语法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Nginx的11个执行流程

1 Nginx简介 Web服务器市场份额 Nginx [engine x] 最初由 Lgor Sysoev 编写。根据 Netcraft 的数据,到2020年9月,Nginx 服务或代理了25.76%站点,市场份额占到了约34.03%。 Nginx 被广泛用作: HTTP服务器…

Nginx的执行阶段详解

在了解nginx的执行阶段前,先看一个例子 对echo不熟悉的,可以先看文章Nginx调试必备了解下echo扩展 回到上面这个例子,在server块中配置这样的location,你觉得输出是什么样子? 按照正常的逻辑,输出应该是32 …

Docker挂了,数据如何找回

docker在实际使用中,让运维人员诟病的,除了安全问题外,大概就是数据的问题了 很多人在初用docker的时候,很多时候都忘记或不知道docker中需要保留的数据需要挂载到宿主机文件夹到容器内部对应目录(当然除了挂载宿主机目…

TCP总结

TCP这些东西,基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊 而最近大家伙过完年,也都在准备春招,我也一样。阅读了一些okHttp源码之后,又屁颠屁颠地跑回来重…

LDAP组的概念以及命令

Oracle统一目录支持组,组是作为单个对象管理的条目集合。通常,目录管理员配置打印机组、软件应用程序组、员工组等。在为一组用户分配特殊访问权限时,组尤其有用。例如,您可以配置一组访问管理器,并分配权限&#xff0…

oracle中修改process

可以用如下命令查看数据库连接的消耗情况 select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b where a.ADDR b.PADDR and b.USERNAME is not null group by b.MACHINE, b.PROGRAM, b.USERNAME order by count(*) desc 在 oracle中&…

安装python3.9

GCC版本 这个版本的编译器不适合编译Python3.9&#xff0c;在编译时会产生如下的错误。我们用这个老版本编译器编译一个新的GCC 9.2版。 Could not import runpy module Traceback (most recent call last):File "Python-3.8.1/Lib/runpy.py", line 15, in <mod…

Oracle数据库游标数总结

各用户的打开游标总数 SELECT A.USER_NAME, COUNT(*) FROM V$OPEN_CURSOR A GROUP BY A.USER_NAME; 查找数据库各用户各个终端的缓存游标数 SELECT AA.USERNAME, AA.MACHINE, SUM(AA.VALUE) FROM ( SELECT A.VALUE, S.MACHINE, S.USERNAME FROM V$SESSTAT A, V$STATNAME B, V…

logstash安装

下载最新版logstash https://www.elastic.co/cn/downloads/logstash 解压缩 tar zxvf logstash-7.12.1-linux-x86_64.tar.gz 下载jdk1.8 tar zxvf jdk-8u291-linux-x64.tar.gz 编辑启动文件logstash、logstash.lib.sh、logstash-plugin 在首行添加 export JAVA_C…

[logstash-input-file]插件使用详解

这个插件可以从指定的目录或者文件读取内容&#xff0c;输入到管道处理&#xff0c;也算是logstash的核心插件了&#xff0c;大多数的使用场景都会用到这个插件&#xff0c;因此这里详细讲述下各个参数的含义与使用 1 path 是必须的选项&#xff0c;每一个file配置&#xff0c…

[logstash-input-log4j]插件使用

Log4j插件可以通过log4j.jar获取Java日志&#xff0c;搭配Log4j的SocketAppender和SocketHubAppender使用&#xff0c;常用于简单的集群日志汇总。 最小化的配置 input {log4j {host>"localhost"port>4560} } output {stdout {} } log4j插件配置host以及port就…

logstash-input-redis插件使用详解

input {#redis {#host> "10.246.187.12"#redis地址#host> "10.246.152.116"#redis地址#port > "6379" #redis端口号#password > "123qwe" #如果有安全认证&#xff0c;此项为密码#key > "logstash:redis"#ty…

logstash-input-redis源码解析

首先是程序的自定义&#xff0c;这里设置了redis插件需要的参数&#xff0c;默认值&#xff0c;以及校验等。 然后注册Redis实例需要的信息&#xff0c;比如key的名字或者url等&#xff0c;可以看到默认的data_type是list模式。 程序运行的主要入口&#xff0c;根据不同的dat…