远程过程调用协议

RPC原理

佐手、 提交于 2020-03-08 08:23:04
今天开始聊一些微服务的实践,第一块,RPC框架的原理及实践,为什么说要搞定微服务架构,先搞定RPC框架呢? 一、需求缘起 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图: 服务A是欧洲团队提供服务,欧洲团队的技术背景是Java,可以用Java实现服务; 服务B是美洲团队提供服务,可以用C++实现服务; 服务C是中国团队提供服务,可以用Go实现服务; 服务的上游调用方,按照接口、协议即可完成对远端服务的调用。 但实际上,99.9%的公司的团队规模有限,技术团队人数也有限,基本是使用同一套技术体系来调用和提供服务的: 这样的话,如果没有统一的服务框架,RPC框架,各个团队的服务提供方就需要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。所以,统一RPC框架把上述“业务之外”的技术劳动统一处理,是服务化首要解决的问题。 在达成【“使用统一的RPC框架”是正确的道路】这个一致的前提下,本文期望用简单通俗的言语简述一下一个通用RPC框架的技术点与实现。 二、 RPC 背景与过程 什么是RPC(Remote Procedure Call Protocol),远程过程调用? 先来看下什么是本地函数调用,当我们写下: int result = Add(1, 2);

RPC原理

本小妞迷上赌 提交于 2020-03-08 02:35:43
Remote Procedure Call RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。 RPC协议假定某些传输协议的存在。如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包含网络分布式多程序在内的应用程序更加easy。 RPC採用客户机/server模式。请求程序就是一个客户机。而服务提供程序就是一个server。首先,客户机调用进程发送一个有进程參数的调用信息到服务进程,然后等待应答信息。 在server端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,server获得进程參数,计算结果,发送答复信息,然后等待下一个调用信息。最后,client调用进程接收答复信息,获得进程结果。然后调用运行继续进行。 hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。   样例 Server.java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.Server; public class RPCServer { static final

Hadoop中的RPC机制

邮差的信 提交于 2020-03-08 02:30:53
1. RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 2. RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 3. hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。 下面来看一张RPC调用关系的图: 我们假设loginController和loginService分别在客户端和服务端,它们之间的调用需要通过socket通信实现。RPC机制就是利用了动态代理、反射以及socket通信。通过该机制,我们在客户端只需要写红色框内的两行代码,即可以实现我们需要的功能。即得到代理对象,然后调用该对象的login()方法。接下来,我们把过程详细化:

RPC——远程过程调用协议

徘徊边缘 提交于 2020-03-08 02:28:37
RPC(Remote Procedure Call)——远程过程调用协议,它是一种 通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议 。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC**跨越了传输层和应用层**。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用 C/S模式 。 请求程序 就是一个客户机,而 服务提供程序 就是一个服务器。首先,客户机调用进程 发送一个有进程参数的调用信息 到服务进程,然后 等待应答 信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。 来源: https://www.cnblogs.com/shiguangmanbu2016/p/5932891.html

Dubbo 入门-细说分布式与集群

走远了吗. 提交于 2020-03-08 00:29:57
什么是Dubbo Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 什么是RPC RPC全称(Remote Procedure Call)远程过程调用 过程指的是某个代码片段的执行,远程调用则意味着我们可以在其他进程,甚至其他机器上去调用这段代码,当然也能获取到其执行后的返回值,按照这个定义,我们请求某个http地址得到相应数据其实也算一次RPC,但是这样的方式太过麻烦,(数据要先打包成http请求格式,在调用相关的请求库,拿到的结果也是文本格式的需要在进行转换),执行效率,和开发效率相比RPC则低一些; 我们需要一种更简单的方式来完成分布式开发中的RPC环节,这也是Dubbo的核心所在,有多简单呢? 调用远程服务器上的某个服务时就像是调用本地的某个方法一样简单,就像下面这样 为什么需要rpc RPC是用来实现分布式构架的基石,分布式构架将同一个系统中的不同模块拆分到不同的子系统中,而子系统又分布在不同的服务器上,这时就需要RPC在来完成子系统之间的相互访问; 可以这么说分布式少不了RPC,RPC也要在分布式系统中才能发挥其核心价值; rpc的实现原理 毫无以为底层肯定是要通过socket来进行网络通讯的,但是如何能够直接调用另一个机器上的方法呢? 服务消费方(client

RPC简介及框架选择

你说的曾经没有我的故事 提交于 2020-03-03 07:20:36
简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点。常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式协议,包头部分可以通过多出的\r\n来分界,包体部分如何分界呢?这是协议本身要解决的问题。目前一般有两种方式,第一种方式就是在包头中有个content-Length字段,这个字段的值的大小标识了POST数据的长度,服务器收到一个数据包后,先从包头解析出这个字段的值,再根据这个值去读取相应长度的作为http协议的包体数据。 浏览器connect 80端口 RESTful API (http+json) 理解RESTful架构 - 阮一峰 REST 架构该怎么生动地理解? - 覃超的回答 - 知乎 网站即软件,而且是一种新型的软件,这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。   它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。Representational State Transfer,翻译是”表现层状态转化”,通俗来讲就是:资源在网络中以某种表现形式进行状态转移。 总结一下什么是RESTful架构:   (1)每一个URI代表一种资源;  

常见RPC开源框架

穿精又带淫゛_ 提交于 2020-03-03 05:52:13
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现在本地,它是一个本地调用! 远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个远程地方。 最早在 Nelson 的论文中指出实现 RPC 的程序包括 5 个理论模型部分: User User-stub RPCRuntime Server-stub Server 这 5 个部分的关系如下图所示: 这里 User 就是 Client 端。当 User 想发起一个远程调用时,它实际是通过本地调用 User-stub。 User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。 远程调用原理 比如 A (client) 调用 B (server) 提供的remoteAdd方法:

如何设计一个RPC系统

北城余情 提交于 2020-03-02 16:37:37
版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高。但是RPC本身的构成却比较复杂,由于受到编程语言、网络模型、使用习惯的约束,有大量的妥协和取舍之处。本文就是通过分析几种流行的RPC实现案例,提供大家在设计RPC系统时的参考。 由于RPC底层的网络开发一般和具体使用环境有关,而编程实现手段也非常多样化,但不影响使用者,因此本文基本涉及如何实现一个RPC系统。 认识RPC(远程调用) 我们在各种操作系统、编程语言生态圈中,多少都会接触过“远程调用”的概念。一般来说,他们指的是用简单的一行代码,通过网络调用另外一个计算机上的某段程序。比如: RMI——Remote Method Invoke:调用远程的方法。“方法”一般是附属于某个对象上的,所以通常RMI指对在远程的计算机上的某个对象,进行其方法函数的调用。 RPC——Remote Procedure Call:远程过程调用。指的是对网络上另外一个计算机上的,某段特定的函数代码的调用。 远程调用本身是网络通信的一种概念

RPC和Restful(转载)

二次信任 提交于 2020-02-29 01:32:29
RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 所不同的只是传输数据的格式. RPC是分布式架构的核心,按响应方式分如下两种: 同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作 异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作。 同步调用的实现方式有WebService和RMI。Web Service提供的服务是基于web容器的,底层使用http协议,因而适合不同语言异构系统间的调用。RMI实际上是Java语言的RPC实现,允许方法返回 Java 对象以及基本数据类型,适合用于JAVA语言构建的不同系统间的调用。 异步调用的JAVA实现版就是JMS(Java Message Service),目前开源的的JMS中间件有Apache社区的ActiveMQ、Kafka消息中间件,另外有阿里的RocketMQ。 RPC架构里包含如下4个组件: 1、 客户端(Client):服务调用方 2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方 3、 服务端存根(Server Stub)

RPC是什么?

為{幸葍}努か 提交于 2020-02-28 10:50:16
目录 1、什么是RPC? 2、典型RPC调用框架 3、Thrift框架介绍 1、什么是RPC? (1)RPC(remote procedure call):远程调用过程。 服务器A部署应用a,服务器B部署应用b,当A服务器调用B服务器上的b应用的函数或者方法时,因为不在同一内存空间,不能直接调用,必须通过网络来表达调用的语义传达调用的数据。 既然是调用B机器上的服务,那A机器自己也创建一个这个服务不就也可以调用了么。原理上是可以这么做,但是随着计算机的横向发展,集群的出现,使得多台机器部署成一个集群来对外提供服务。无法在一个进程内甚至同一台计算机上完成的需求就得需要RPC来实现了。 RPC的框架很多,比如最早的额CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至是Rest API。 (2) 本地过程调用过程 RPC就是要像调用本地的函数一样去调远程函数。在研究RPC前,我们先看看本地调用是怎么调的。假设我们要调用函数Multiply来计算lvalue * rvalue的结果: 1 int Multiply(int l, int r) { 2 int y = l * r; 3 return y; 4 } 5 6 int lvalue = 10; 7 int rvalue = 20; 8 int l_times_r = Multiply