zoukankan      html  css  js  c++  java
  • 服务之间的调用之RPC深入理解

    一:RPC

    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):接受客户端发送过来的消息并解包,再调用本地服务

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

    具体实现步骤:

    1、 服务调用方(client)(客户端)以本地调用方式调用服务;

    2、 client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在Java里就是序列化的过程

    3、 client stub找到服务地址,并将消息通过网络发送到服务端;

    4、 server stub收到消息后进行解码,在Java里就是反序列化的过程;

    5、 server stub根据解码结果调用本地的服务;

    6、 本地服务执行处理逻辑;

    7、 本地服务将结果返回给server stub;

    8、 server stub将返回结果打包成消息,Java里的序列化;

    9、 server stub将打包后的消息通过网络并发送至消费方

    10、 client stub接收到消息,并进行解码, Java里的反序列化;

    11、 服务调用方(client)得到最终结果。

    RPC框架的目标就是把2-10步封装起来,把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题: 
    1、通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。 
    2、寻址问题 : A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。 
    3、序列化与反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。 
    同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

  • 相关阅读:
    windows 7 系统下,用户每次登录都是以临时配置文件的形式存在于users文件夹下
    string按行读取以及按空格分隔
    socket.io技术学习记录
    node.js实现js连接mysql数据库
    ajax在j2ee和js服务器上数据基本交换
    layui与jquery冲突导致下拉框无法显示的解决方法
    nativefier——将本地网页转化为桌面应用
    jquery——移动端touch事件
    Hibernate中使用HQL语句进行增,删,改,查
    一言不合敲代码(2)——八数码问题游戏
  • 原文地址:https://www.cnblogs.com/flzs/p/12174686.html
Copyright © 2011-2022 走看看