• 五分钟快速掌握RPC原理及实现


    随着公司规模的不断扩大,以及业务量的激增,单体应用逐步演化为服务/微服务的架构模式, 服务之间的调用大多采用rpc的方式调用,或者消息队列的方式进行解耦。几乎每个大厂都会创建自己的rpc框架,或者基于知名的rpc框架进行改造因此今天我们来讲讲rpc吧。

    五分钟快速掌握RPC原理及实现

     

    ​RPC概述

    RPC(Remote Procedure Call)即远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

    RPC框架原理

    在RPC框架中主要有三个角色:Provider、Consumer和Registry。如下图所示:

    五分钟快速掌握RPC原理及实现

     

    节点角色说明:

    * Server: 暴露服务的服务提供方。

    * Client: 调用远程服务的服务消费方。

    * Registry: 服务注册与发现的注册中心。

    RPC调用流程

    五分钟快速掌握RPC原理及实现

     

    1.调用客户端句柄;执行传送参数

    2.调用本地系统内核发送网络消息

    3.消息传送到远程主机

    4.服务器句柄得到消息并取得参数

    5.执行远程过程

    6.执行的过程将结果返回服务器句柄

    7.服务器句柄返回结果,调用远程系统内核

    8.消息传回本地主机

    9.客户句柄由内核接收消息

    10.客户接收句柄返回的数据

    服务注册&发现

    五分钟快速掌握RPC原理及实现

     

    服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表;

    服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;

    使用到的技术

    1、动态代理

    生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。

    2、序列化

    为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。

    * 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;

    * 反序列化:将byte[]转换成Java对象的过程;

    可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack

    关于序列化工具性能比较可以参考:jvm-serializers

    3、NIO

    当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。

    4、服务注册中心

    可选技术:

    * Redis

    * Zookeeper

    * Consul

    * Etcd

    JAVA中几种常用的RPC框架介绍

    Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。

    RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例。

    RMI(远程方法调用)

    JAVA自带的远程方法调用工具,不过有一定的局限性,毕竟是JAVA语言最开始时的设计,后来很多框架的原理都基于RMI,RMI的使用如下:

    对外接口

    五分钟快速掌握RPC原理及实现

     

    服务实现

    五分钟快速掌握RPC原理及实现

     

    RMI客户端

    五分钟快速掌握RPC原理及实现

     

    五分钟快速掌握RPC原理及实现

     

    开源的优秀RPC框架

    • 阿里巴巴 Dubbo:https://github.com/alibaba/dubbo
    • 新浪微博 Motan:https://github.com/weibocom/motan
    • gRPC:https://github.com/grpc/grpc
    • rpcx :https://github.com/smallnest/rpcx
    • Apache Thrift :https://thrift.apache.org/
  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/twinhead/p/9900623.html
Copyright © 2020-2023  润新知