李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
RPC简介
Leefs
2020-03-12 PM
1433℃
0条
# RPC简介 ### 一、RPC概述 RPC全称Remote Procedure Call – 远程过程调用,为了解决远程调用服务器的一种技术,使得调用者像调用本地服务一样方便透明 **客户端远程调用服务器的过程:** 1、客户端client发起服务调用请求。 2、client stub可以理解成一个代理,会将调用方法、参数按照一定格式进行封装,通过服务提供的地址,发起网络请求。 3、消息通过网络传输到服务端 4、server stub接受来自socket的消息 5、server stub将消息进行解包、告诉服务端调用的哪个服务,参数是什么 6、结果返回给server stub. 7、server stub把结果进行打包交给socket 8、socket通过网络传输信息 9、client stub从socket拿到消息。 10、client stub解包消息将结果返回给client. ![RPC简介.png][1] **核心RPC框架的重要组成:** **客户端(Client)**:服务调用方。 **客户端存根(Client Stub)**:存放服务端地址信息,将客户端的请求参数数据信息打包成网络信息,再通过网络传输发送给服务端。 **服务端存根(Server Stub):**接收客户端发送过来的请求消息进行解包,然后再调用本地服务进行处理。 **服务端(Server):**服务的真正提供者。 **Network Service:**底层传输,可以是TCP或HTTP。 ![RPC简介02.png][2] **一次RPC调用流程如下:** · 服务消费者(Client 客户端)通过本地调用的方式调用服务。 · 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体。 · 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端。 · 服务端存根(Server Stub)收到消息后进行解码(反序列化操作)。 · 服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理 · 服务端(Server)本地服务业务处理。 · 处理结果返回给服务端存根(Server Stub)。 · 服务端存根(Server Stub)序列化结果。 · 服务端存根(Server Stub)将结果通过网络发送至消费方。 · 客户端存根(Client Stub)接收到消息,并进行解码(反序列化)。 · 服务消费方得到最终结果 **RPC三个核心模块:** · **服务寻址** · **数据流的序列化和反序列化** · **网络传输** ### 二、RPC框架的作用 1.RPC可以用HTTP协议实现,并且用HTTP是建立在TCP之上最广泛使用的RPC. 2.“微服务”中服务之间的通信目前有两种方式,RPC就是其中一种。RPC可以保证不同服务之间的互相调用。即使是跨语言跨平台也不是问题,让构建分布式系统更加容易。 3.RPC框架都会有服务降级、流量控制的功能,保证服务的高可用。 ### 三、序列化和I/O模型的优化 **数据序列化** 序列化就是编码的过程,把对象或者数据结构转化成二进制字节码的过程。而反序列化就是把二进制字节码转化成数据结构或者对象。只有经过序列化后的数据才能在网络中传输。 **I/O模型** 客户端和服务端的通信依赖Socket I/O。I/O模型又可以分为:传统的阻塞I/O(Blocking I/O)、非阻塞I/O(Non-blocking I/O)、I/O多路复用(I/O multiplexing)、异步I/O(Asynchronous I/O) ### 四、RPC框架的原理 在RPC框架中主要有三个角色:Provider、Consumer和Registry.如下图所示: ![RPC简介03.png][3] 节点角色说明: Server:暴露服务的服务提供方。 Client:调用远程服务的服务消费方。 Registry:服务注册与发现的注册中心。 **服务注册与发现** 服务提供者启动后主动向注册中心注册机器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 ### 五、RPC核心功能 RPC 的核心功能是指实现一个 RPC 最重要的功能模块,就是上图中的”RPC 协议”部分: ![RPC简介04.png][4] [1]: https://lilinchao.com/usr/uploads/2020/03/120779860.png [2]: https://lilinchao.com/usr/uploads/2020/03/3639676768.png [3]: https://lilinchao.com/usr/uploads/2020/03/2305958468.png [4]: https://lilinchao.com/usr/uploads/2020/03/3577776387.png
标签:
SpringCloud
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/719.html
上一篇
MySQL知识总结(一)
下一篇
Zookeeper简介
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Hbase
JavaWEB项目搭建
Python
Kibana
Filter
Elasticsearch
SpringCloud
SQL练习题
随笔
VUE
Jquery
Java编程思想
栈
递归
字符串
BurpSuite
MyBatisX
Flume
Azkaban
锁
Yarn
Redis
稀疏数组
JavaScript
MySQL
散列
查找
JVM
Spark RDD
LeetCode刷题
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞