本系列之1: 简介
本系列之2: API服务开发
本系列之3: RSON序列化格式
本系列之4: RPC调度原理👈
本系列之5: NIO实现原理
本系列之6: 客户端动态代理原理
本系列之7: 注解处理器(APT)原理
本文介绍Rayson框架底层实现RPC(Remote-Procedure-Call)调度的原理。
RPC基本概念
上图描述了Rayson框架底层实现RPC的基本概念,说明如下:
- 客户端和服务器端默认使用长连接(Connection),连接建立后会被保持,客户端请求会通过同一个连接发送到服务器端,直到该连接因不活动而超时进而被关闭。
- 客户端和服务器的应用层通信协议采用标准的HTTP1.1协议。
- 请求通过HTTP的URL地址来指定目标API。通过GET的URL参数或者POST的data来传递参数。
- 响应通过HTTP Status Code来返回响应码,通过HTTP Body来返回结果。
- 图中小方块1,2,3表示不同的请求,对应不同的响应。响应不必和请求一样的时序。框架通过HTTP请求头中的RID来区分不同的请求和响应。同一请求对应的响应,其请求头RID的值相同。这种异步的设计可以大大提高API服务后台的吞吐量。
- Rayson的Java客户端通过动态代理的方式,直接通过调用定义API协议的接口来执行RPC,非常简单明了。
RPC基本原理
上面的流程图描述了Rayson框架底层实现RPC调度的基本原理,说明如下:
- 客户端使用HTTP协议发送RPC请求给服务器。
- 服务器端网络侦听组件
Listener
接收客户端请求。 Listener
组件把接收到的请求添加到Request Manager
中去。Worker
组件持续地把请求从Request Manager
中取出。Worker
取出请求之后开始处理请求,把请求交给Service Manager
处理。Service Manager
调用Filter Chain
组件来对请求进行过滤处理(Filter),关于过滤器,请参考本系列之2: API服务开发的“过滤器”部分。Filter Chain
对请求进行一系列的过滤处理,其中一步会调用Service Filter
组件执行请求对应的目标API服务的JAVA方法(Method),得到请求的处理结果。- 把API服务处理结果形成响应结果,把响应添加到
Request Manager
中去。 - 然后往
Listener
注册写事件,Listener
开始往客户端写数据。 - 最后,客户端接收到服务器端的响应数据。完成整个RPC调用的过程。
过滤器工作流程
上文说到,Rayson服务器接收到一个RPC请求后,把请求交给过滤器链(Filter Chain)来执行处理。下图描述过滤器链处理请求的流程。
整个流程说明如下:
- 按顺序先后执行两条过滤器链:
HTTP Filter Chain
与Service Filter Chain
,分别执行HTTP协议层面的过滤处理和API服务层面的过滤处理。 - 第一条过滤器链
HTTP Filter Chain
的处理流程如下:- 执行系统内置过滤器
First HTTP Filter
,初始化HTTP请求对象以及RPC上下文环境。 - 执行开发者自定义的HTTP过滤器。可能有零个或者多个。
- 执行系统内置的过滤器
Last HTTP Filter
,它首先根据HTTP请求找出对应的API服务层面的过滤器链,然后初始化服务请求对象,最后调用服务层过滤器链执行对服务请求的过滤处理。
- 执行系统内置过滤器
- 接着执行第二条过滤器链
Service Filter Chain
的处理,流程如下:- 执行开发者自定义的服务过滤器。可能有零个或者多个。
- 执行系统内置的过滤器
Last Service Filter
,使用服务请求对象的API参数调用对应的API服务Java方法(Method),并把方法执行结果设置到服务响应对象中去。
- 过滤处理流程结束。