李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
RPC简介
Leefs
2020-03-12 PM
1819℃
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
NLP
4
标签云
Elastisearch
工具
MySQL
Quartz
Spark RDD
Eclipse
Python
ajax
Hadoop
散列
Spring
Spark Core
DataX
正则表达式
排序
FileBeat
机器学习
Netty
Flume
Flink
高并发
SpringBoot
Linux
Beego
Zookeeper
Java阻塞队列
JVM
ClickHouse
数据结构
Http
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭