1.介绍

 

 远程过程控制对于分布式系统来说是一项非常有价值的技术。

 

 以即时消息系统为例。在单个实例中使用RPC没有任何问题。MQ消息中间件最多能充分发挥系统的有效性。然而,一旦即时消息用户的规模越来越大,总有一天会对单个实例进行研究,因此很自然地会转到即时消息集群。

 

 说到即时消息集群,这似乎很简单。许多来自网络后端的程序员可能会脱口而出——为什么不用Nginx解决呢?显然情况并非如此。如果你有同样的想法,请阅读“即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?”,再次讨论。

 

 当然,真正投入生产层面的即时通讯集群系统是相当困难的。与传统Http的短连接应用程序相比,即时消息太不标准,因此可用的技术太少,而且大多数时候,您只能构建自己的轮子。以一个典型的即时消息聊天消息传输为例,假设有两个聊天用户(用户A和用户B)。当A连接到即时消息群集中的即时消息实例1,而B连接到即时消息群集中的即时消息实例2时,当用户A向用户B发送聊天消息时,应该如何发送该消息?

 

 让我们理清这个过程:

 

 1)首先将消息从用户a发送到即时消息实例1;

 2)即时消息实例1将此消息传输到即时消息实例2;

 3)即时消息实例2最终会将此消息传递给连接到此实例的用户B。

 

 以上是即时消息群中聊天消息的典型传递过程。

 

 然后,这涉及到一个关键步骤:如何在步骤2中实现“即时消息实例1将此消息转移到即时消息实例2”?

 

 为了解决这个问题,需要RPC技术。本文将从基本概念、原理和用途方面让您快速了解RPC技术,以便您在开发IM集群时能够更好地设计和实现该方案。

 

 推荐阅读:另一篇类似的文章也可以读“补课的基础知识即时通讯发展(九):想发展即时通讯集群?首先了解什么是RPC!”.

 2.相关文章

 

 即时通讯系统的架构设计

 简要描述移动即时消息开发的难点:架构设计、通信协议和客户端

 "一套面向大规模在线用户的移动即时通讯架构设计实践共享(包括详细的图片和文本)"

 一套原始的分布式即时通讯(IM)系统理论框架方案

 从零到卓越:京东客服即时通讯系统技术架构的演进

 蘑菇街即时通讯/即时消息服务器开发的架构选择

 如何保证在移动即时通讯中推送大规模群组消息的效率和实时性?》

 现代即时通讯系统中聊天信息同步存储方案的探讨

 “腾讯高级建筑师干货总结:阅读大型分布式系统设计的方方面面”

 初学者:从零开始理解大型分布式架构的演化历史、技术原理和最佳实践

 “一套高度可用、可扩展且高度并发的即时消息群聊和单一聊天架构设计实践”

 即时通讯初学者:什么是引擎?它能实现即时消息的负载平衡吗?》

 

 3.基本概念

 

 远程过程调用:远程过程调用,这是一种通过网络从远程计算机程序请求服务的思想,而不知道底层的网络技术。

 

 RPC是一个技术概念,而不是一个特定的规范或协议。

 

 常见的远程过程控制技术和框架有:

 

 1)应用级服务框架:阿里的Dubbo/Dubbox、谷歌gRPC、Spring Boot/Spring Cloud。

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

 3)沟通框架:MINA和Netty。

 

 目前,有许多流行的开源RPC框架,如阿里巴巴的Dubbo、脸书的节俭、谷歌的gRPC、推特的Finagle等等。

 

 以下重点介绍三种最流行的方法:

 

 1)gRPC是由谷歌发布的开源软件,它基于最新的HTTP 2.0协议,支持许多常见的编程语言。RPC框架基于HTTP协议实现,底层采用Netty框架。

 2)节俭是Facebook的开源RPC框架,主要是一个跨语言的服务开发框架。用户只需要对它进行二次开发,应用程序对底层的RPC通信是透明的。然而,对于用户来说,学习某一特定领域的语言仍然有一定的成本;

 3)Dubbo:这是一个众所周知的由阿里巴巴集团开发的RPC框架,广泛应用于许多互联网公司和企业。协议和序列化框架可以插入和拔出。

 

 4.典型的远程过程控制框架

 

 在RPC的一个典型使用场景中,它包括服务发现、负载、容错、网络传输、序列化等组件,其中“RPC协议”指示了如何进行程序的网络传输和序列化。

 

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲典型的活性粉末混凝土结构示意图

 

 以下是杜博的设计架构图,层次清晰,功能复杂:

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲ Dubbo架构图

 5.RPC的核心功能

 

 RPC的核心功能是指实现RPC最重要的功能模块,即上图中的“RPC协议”部分:

 

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲ RPC核心功能

 

 远程过程控制的核心功能主要由五部分组成,即客户端、客户端存根、网络传输模块、服务器存根、服务器等。

 

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲活性粉末混凝土核心功能示意图

 

 以下是核心RPC框架的重要组件:

 

 1)客户:服务呼叫方;

 2)客户端存根:存储服务器的地址信息,将客户端的请求参数数据信息打包成网络消息,通过网络传输发送给服务器;

 3)服务器存根:接收客户端发送的请求消息,将其解包,然后调用本地服务进行处理;

 4)服务器:服务的真正提供者;

 5)网络服务:底层传输,可以是TCP或HTTP。

 

 我们使用一个演示实例来解释调用过程。

 

 在演示实例中,客户端和服务器的ip地址如下:

 客户知识产权:172.171.4.176

 服务器IP:172.171.5.95

 

 

 通信采用了HTTP协议和XML文件传输格式。传输的字段包括:方法名,两个参数2,3:

 即时通讯初学者:快速理解RPC技术——基本概念、原则和用法

 ▲要求拿包

 

 服务器返回结果,字段返回值,结果为5:

 即时通讯初学者:快速理解RPC技术——基本概念、原则和用法

 ▲响应抓包

 

 在这两个网络传输中,使用了HTTP协议,并且在建立HTTP协议之间有一个TCP三次握手。当HTTP协议被断开时,TCP挥了四次手:

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲基于HTTP协议的RPC连接过程

 

 演示实例详细调用流程。让我们一起来看看。

 

 演示实现的实现过程、过程和分工可以用下图来表示:

 即时通讯初学者:快速理解RPC技术——基本概念、原则和用法

 ▲ RPC调用详细流程图

 

 例如,我们可以知道一个典型的RPC调用过程如下:

 

 1)服务消费者(客户端)通过本地调用来调用服务;

 2)客户端存根接收到调用请求后,负责将方法、输入参数等信息序列化(组装)成能够进行网络传输的消息体;

 3)客户端存根找到远程服务地址,并通过网络向服务器发送消息;

 4)服务器存根在接收到消息后对其进行解码(反序列化操作);

 5)服务器存根根据解码结果调用本地服务进行相关处理;

 6)服务器本地服务业务处理;

 7)将处理结果返回给服务器存根;

 8)服务器存根的序列化结果;

 9)服务器存根通过网络将结果发送给消费者;

 10)客户端存根接收消息并对其进行解码(反序列化);

 11)服务消费者获得最终结果。

 

 5.RPC核心功能实现介绍

 

 5.1概述

 

 RPC的核心功能主要由五个模块组成。如果您想自己实现一个RPC,最简单的方法是实现三个技术点。

 

 它们是:

 

 1)服务寻址;

 2)数据流的序列化和反序列化;

 3)网络传输。

 

 5.2服务寻址

 

 服务寻址可以使用呼叫标识映射。在本地调用中,函数体由函数指针直接指定,但在远程调用中,函数指针不能使用,因为两个进程的地址空间完全不同。

 

 因此,在RPC中,所有函数都必须有自己的ID。该标识在所有流程中都是唯一的。

 

 客户端在进行远程过程调用时必须附加此标识。然后,我们需要在客户机和服务器上维护相应的函数和调用表。

 

 当客户端需要进行远程呼叫时,它会查找表,找出相应的呼叫标识,然后将其发送到服务器。服务器还会查找表以确定客户端需要调用的函数,然后执行相应函数的代码。

 

 实现:服务注册。

 

 要调用服务,您需要一个服务注册中心来查询其他服务的实例。杜博的服务注册中心是可配置的,动物园管理员是官方推荐的。

 

 实现案例:远程方法调用是RPC本身的实现。

 

 即时通讯初学者:快速理解RPC技术——基本概念、原则和用法

 ▲ RMI架构图

 

 注册:RMI服务通过JNDI发布和调用。实际上,JNDI是一个注册中心,服务器将服务对象放入注册中心,客户端从注册中心获取服务对象。

 

 实现服务器后,需要在RMI服务器上注册RMI服务,然后客户端从指定的RMI地址查找服务,并调用服务的相应方法来完成远程方法调用。

 

 注册表是一个非常重要的功能。当服务器开发服务时,它必须对外公开。如果没有服务注册,即使服务器的服务在那里,客户端也不能调用它。

 

 5.3序列化和反序列化

 

 客户端如何将参数值传递给远程函数?在本地调用中,我们只需要将参数推到堆栈上,然后让函数在堆栈本身上读取它们。

 

 但是,当调用远程过程时,客户端和服务器是不同的进程,不能通过内存传递参数。

 

 此时,客户端需要首先将参数转换成字节流,然后将字节流转换成可以自己读取的格式。

 

 网络中只能传输二进制数据。序列化和反序列化定义为:

 

 1)将对象转换成二进制流的过程称为序列化;

 2)将二进制流转换为对象的过程称为反序列化。

 

 这个过程称为序列化和反序列化。

 

 同样,从服务器返回的值需要序列化和反序列化。

 

 5.4网络传输

 

 网络传输:网络上经常使用远程呼叫,客户端和服务器通过网络连接。

 

 所有数据都需要通过网络传输,因此需要一个网络传输层。网络传输层需要将呼叫标识和序列化参数字节流式传输到服务器,然后将序列化的呼叫结果传输回客户端。

 

 任何能够同时实现这两个功能的东西都可以用作传输层。因此,它使用的协议实际上是无限的,只要它能完成传输。

 

 虽然大多数远程过程控制框架使用的是TCP协议,但实际上可以使用UDP协议,而gRPC只使用HTTP2。

 

 TCP连接是最常见的,并对基于TCP的连接进行了简要分析:TCP连接通常可以是按需连接(当需要调用时,首先建立连接,然后在调用后立即断开连接),或者可以是长期连接(客户端和服务器在建立连接后保持连接很长时间,并且可以使用心跳检测机制定期检查建立的连接是否有效,而不管数据包是否在此时发送),并且多个远程过程调用共享同一连接。

 

 因此,要实现一个RPC框架,基本上只有通过实现以下三点来完成:

 

 1)调用标识映射:可以直接使用函数字符串或整数标识。映射表通常是哈希表;

 2)序列化和反序列化:您可以自己编写,也可以使用Protobuf或FlatBuffers

 3)网络传输库:您可以自己编写Socket,也可以使用Asio、ZeroMQ、Netty等。

 

 6.RPC核心的网络传输协议

 

 6.1概述

 

 在前一节中,解释了要实现远程过程控制,必须选择网络传输模式。

 

 即时通讯初学者:快速理解RPC技术-基本概念、原则和用法

 ▲网络传输

 

 远程过程控制中有许多可选的网络传输模式,包括TCP协议、UDP协议和HTTP协议。

 

 每个协议对整体性能和效率有不同的影响。如何选择正确的网络传输协议?首先,我们应该理解各种传输协议在RPC中是如何工作的。

 

 6.2基于TCP协议的RPC调用

 

 在服务的调用者和服务的提供者之间建立了套接字连接。服务的调用者序列化接口名、方法名和参数以通过套接字调用,然后将它们传输给服务的提供者。反序列化后,服务的提供者通过反射调用相关方法。

 

 最后,将结果返回给服务的调用者,这类似于基于TCP协议的整个RPC调用。

 

 然而,在实例应用中,将执行一系列封装。例如,RMI是通过TCP协议传输可序列化的Java对象。

 

 6.3基于HTTP协议的RPC调用

 

 这种方法更像是访问网页,但它的返回结果更简单。

 

 一般过程如下:服务的调用者向服务提供者发送请求,该请求可以是获取、发布、放置、删除等之一。服务提供商可以根据不同的请求模式进行不同的处理,或者某个方法只允许某个请求模式。

 

 调用的具体方法是根据网址调用方法,方法所需的参数可能是解析服务调用方传递的过去的XML数据或JSON数据的结果,最后返回JOSN或XML的数据结果。

 

 目前,有许多开源的网络服务器,比如Tomcat,所以它更容易实现,就像做网络项目一样。

 

 6.4两种方式的比较

 

 基于TCP协议的RPC调用可以更加灵活地定制协议字段,减少网络开销,提高性能,实现更高的吞吐量和并发性。

 

 但是,需要更多地关注底层的复杂细节,并且实现成本较高。同时,针对不同的平台,如安卓、iOS等。需要重新开发不同的工具包来发送请求并进行相应的分析,这很难快速响应并满足用户的需求。

 

 基于HTTP协议的远程过程控制可以使用JSON和XML格式的请求或响应数据。

 

 JSON和XML作为通用格式标准(在使用HTTP协议时也需要序列化和反序列化,但这不是该协议所关心的内容,成熟的网络程序已经序列化了这些内容),而开源解析工具也相当成熟,因此对它们进行二次开发非常方便和简单。

 

 但是,因为HTTP协议是上层协议,所以发送内容相同的信息将比TCP协议占用更多的字节。

 

 因此,在同一网络下,通过HTTP协议传输相同内容的效率将低于基于TCP协议的数据传输效率,信息传输的时间也将更长。当然,压缩数据可以缩小这一差距。

 7.RPC的主要使用场景

 

 RPC主要用于公司内部服务调用(准确地说,是大规模系统中模块和子系统之间的调用,而不是外部调用),性能消耗低,传输效率高,实现复杂。

 

 相对而言,HTTP主要用于国外的异构环境,如浏览器接口调用、应用接口调用、第三方接口调用等。

 

 RPC的主要使用场景,尤其是在大型网站的情况下,适合在有许多内部子系统和许多接口的情况下使用RPC。

 

 一般来说,RPC的使用场景具有以下特征:

 

 1)长链接:不必每次都像HTTP一样握手三次,减少了网络开销;

 2)注册和发布机制:RPC框架一般都有注册中心和丰富的监控管理;发布、离线界面、动态扩展等。,是对调用方的不可察觉的统一操作;

 3)安全性:无资源暴露操作;

 4)微服务支持:它是最近流行的面向服务的架构和面向服务的治理,而RPC框架是一个强大的支持。

 

 8.总结一下

 

 远程调用只是向远程机器(通常是分布式系统的内部网中的机器)发送请求的过程,远程机器返回结果。

 

 你为什么要这么做?因为单个服务器的性能远远不能满足互联网用户的需求,就像你去肯德基点餐一样,餐桌上的服务员把炸薯条、鸡腿和汉堡的任务分配给不同的人,然后为你收集,餐桌上的服务员就相当于在呼叫远程服务。

 

 但是如果你不这样做,订购者会直接做这些事情(再次订购,炸薯条,炸鸡腿,等等。),您就会知道远程呼叫的好处。

 

 简而言之,这是一个不能通过本地调用在一个过程甚至一台计算机中完成的需求,例如不同系统之间的通信,甚至不同组织之间的通信。由于计算能力的横向扩展,有必要在由多台机器组成的集群上部署应用程序。

 

 当然,RPC也有一些缺点。只有在合适的场景中使用,它才能发挥最大的威力。

 

 活性粉末涂料的主要优点是:

 

 1)提高系统的可扩展性;

 2)提高系统的可维护性和持续交付能力;

 3)实现高系统性能。

 

 RPC的主要缺点是:

 

 1)开发一个完美的RPC框架既困难又昂贵;

 2)RPC框架调用的成功率受到网络条件的限制;

 3)初学者很难调用远程方法。

 

----------------------------------------------------------------------------------

哇谷im_im即时通讯_私有云_公有云-哇谷云科技官网-JM沟通

IM下载体验 - 哇谷IM-企业云办公IM即时聊天社交系统-JM 沟通下载

IM功能与价格 - 哇谷IM-提供即时通讯IM开发-APP搭建私有化-公有云-私有化云-海外云搭建

新闻动态 - 哇谷IM-即时通讯热门动态博客聊天JM沟通APP

哇谷IM-JM沟通热门动态博客短视频娱乐生活

关于哇谷-哇谷IM-提供企业即时通讯IM开发-语音通话-APP搭建私有化-公有云-私有化云-海外云搭建

联系我们 - 哇谷IM-即时通讯IM私有化搭建提供接口与SDK及哇谷云服务

即时通讯IM融云世界

IM即时通讯钉钉技术:企业IM钉钉在后端架构上的优越之处

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

企业IM即时通讯聊天办公APP钉钉技术分析交流

哇谷云-怎么样正确认识海外云服务器

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?