一. RPC是什么?
-
remote procedure call,远程过程调用。其中远程表示不同应用间的调用,过程就是业务处理,计算任务,更直白理解,就是程序(像调用本地方法一样调用远程的过程)。
-
RPC采用Client-Server结构,通过request-response消息模式实现。
-
RPC和RMI有什么区别?
RMI(remote method invocation) 远程方法调用时oop领域中RPC的一种具体实现。 -
我们熟悉的webservice,restful接口调用是RPC吗?
都是RPC,仅消息的组织方式和消息协议不同 -
远程过程调用较本地调用有何不同?
速度相对慢,可靠性减弱
二. RPC的流程
- RPC流程中需要处理的问题
三. RPC协议
-
RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组,解组。消息由哪些部分构成及消息的表示形式就构成消息协议。
-
RPC调用过程中采用的协议称为RPC协议。
-
RPC协议规定请求,响应消息的格式
在TCP(网络传输控制协议)上可以选用或自定义消息协议来完成RPC消息交互,我们可以选用通用的标准协议(如:http,https),也可以根据自身的需要定义自己的消息协议。 -
常见RPC协议
四. RPC框架
-
封装好参数编组,消息解组,底层网络通信的RPC程序开发框架,带来的便捷性是可以直接在其基础上只需专注于过程代码编写。
-
Java领域的常见RPC框架
传统的webservice框架:Apache CXF,Apache Axis2,Java自带的JAX-WS等;
新兴的微服务框架:Dubbo,Spring Cloud,Apcahe Thrift等。 -
为什么用RPC?
服务化,可重用,系统间交互调用 -
RPC核心概念术语
五. 自己实现一个简单的RPC
-
从使用者角度开始
用户使用RPC框架开发过程时需要注意什么?
(1) 定义过程接口;
(2) 服务端实现过程;
(3) 客户端使用生成的stub代理对象。
-
客户端设计
(1) 在ClientStubInvocationHandler(客户端stub代理)中要完成哪些事情?
编组消息 + 发送网络请求
(2) 将请求的内容编组为消息这件事情由谁来做?
消息协议 + 网络层
(3) 消息协议是固定不变的吗?它与什么有关?
看框架对协议的支持扩展,如果支持多种协议,就是会灵活变化的,它与具体的服务相关,A服务提供者可能选用的是协议1,B服务提供者可能选用协议2。
(4) 某服务是用的什么消息协议这个信息从哪来?
从获取的服务信息中来,因此需要一个服务信息发现者。
把服务发现者设计出来:可灵活支持多种发现机制。 -
设计客户端-发现者
-
设计客户端-协议层
(1) 我们想要做到可以支持多种协议,我们的类该如何设计?
面向接口,策略模式,组合
(2) 编组/解组方法该定义怎样的参数和返回值?
编组/解组的操作对象是请求/响应,请求/响应的内容是不同的。
定义框架标准的请求/响应类
(3) 因为客户端,服务端均需要协议支持,所以将消息协议独立为一层
-
设计客户端-网络层
(1) 网络层的工作是什么?
发送请求,获得响应。要发起网络请求,则需知道服务地址。
-
客户端完整类图
-
实现客户端
按照类图设计,填码。
在实现过程中,设计到 JDK动态代理 和 Netty网络通信。
协议层涉及到一个重要概念:参数序列化和反序列化。 -
服务端设计
客户端请求过来了,服务端首先需要通过RPCServer开启网络服务,接收请求。
网络层在RPCServer中提供多线程来处理请求,消息协议层服用客户端设计的。
RPCServer接收到请求后,将请求交给RequestHandler来处理,RequestHandler调用协议层来解组请求消息为Request对象,然后调用过程。
过程注册模块:让用户将他们的过程注册到RPC框架中来。
过程暴露模块:想对外发布(暴露)服务
注册/暴露可以由同一个类实现。 -
服务端完整类图
-
实现服务端
RPCServer中实现网络层:Netty,使用RequeatHandler
ServiceRegister模块实现服务注册与发布
RequestHandler中实现消息协议处理,过程调用 -
扩展
如何与Spring集成?