zoukankan      html  css  js  c++  java
  • 【转】Java学习---快速掌握RPC原理及实现

    【原文】https://www.toutiao.com/i6592365493435236872/

    五分钟快速掌握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/
  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9571736.html
Copyright © 2011-2022 走看看