RPC项目基础架构流程

89 阅读3分钟

一、服务器

  1. RpcServer对象通过构造函数初始化,初始化包含创建网络协议对象、服务管理对象、服务反射调用对象
  2. 初始化完成后,服务管理对象需注册代理的服务类名和实例对象,注册过程中服务管理对象通过类名获取被代理服务的公共方法组,并给每个方法创建一个服务实例并注入引用原实例对象如new ServiceInstance(bean, method),其中bean从注册方法入参获取引用原实例对象,同时,给每个方法创建一个服务描述对象记录类、方法和方法的参数类型及返回类型。服务管理对象中有map用于存储服务描述对象和服务实例。
  3. 注册完毕,启动server,启动server时初始化网络协议对象,协议对象需要创建处理器对象用于处理网络请求输入输出流。
  4. 处理过程:读取输入流转为btye数组并反序列化为请求对象Request,通过服务管理对象查询map,根据请求中携带的描述记录类,获取对应注册过的服务实例,通过反射调用实例的方法,并将返回值set到返回体中,最后序列化返回体,并写入输出流。

二、客户端

  1. RpcClient对象通过构造函数初始化,初始化包含创建网络协议对象、服务选择器对象(负载均衡)
  2. 初始化完成后,使用客户端实例通过服务类名动态代理服务对象,动态代理中需要代理处理器来反射调用服务方法处理(我通过实现InvocationHandler重写invoke),每次使用动态代理服务对象的方法时,会自动调用代理处理器的invoke方法进行实际处理。
  3. 处理过程:服务选择器初始化时会创建可用连接池,从连接池选择一个网络客户端对象,新建一个网络请求对象携带目标服务描述和参数,对此网络请求对象序列化,用网络客户端连接服务器并将请求写入输入流进行请求,获取返回结果,反序列化获得结果。
+-------------------+
|    RpcServer      |
|-------------------|
| - protocol        |  // 网络协议对象
| - serviceManager  |  // 服务管理对象
| - reflector       |  // 服务反射调用对象
+-------------------+
        | 初始化
        v
+-------------------+
|  ServiceManager   |
|-------------------|
| - serviceMap      |  // 存储服务描述对象和服务实例的映射
+-------------------+
        | 注册服务
        v
+-------------------+
|  ServiceInstance  |
|-------------------|
| - bean            |  // 被代理服务的实例对象
| - method          |  // 被代理服务的方法
+-------------------+
        | 创建服务描述
        v
+-------------------+
| ServiceDescriptor |
|-------------------|
| - clazz           |  // 服务类
| - method          |  // 服务方法
| - parameterTypes  |  // 方法参数类型
| - returnType      |  // 方法返回类型
+-------------------+
        | 处理请求
        v
+-------------------+
|   Protocol        |
|-------------------|
| - processor       |  // 处理器对象,处理网络请求输入输出流
+-------------------+
        | 反序列化请求
        v
+-------------------+
|    Request        |
|-------------------|
| - serviceDescriptor| // 服务描述对象
| - parameters      |  // 方法参数
+-------------------+
        | 反射调用
        v
+-------------------+
|   Response        |
|-------------------|
| - returnValue     |  // 方法返回值
+-------------------+
        | 序列化返回
        v
+-------------------+
|   OutputStream    |  // 输出流,返回结果给客户端
+-------------------+
+-------------------+
|    RpcClient      |
|-------------------|
| - protocol        |  // 网络协议对象
| - selector        |  // 服务选择器对象(负载均衡)
+-------------------+
        | 初始化
        v
+-------------------+
|   Selector        |
|-------------------|
| - connectionPool  |  // 可用连接池
+-------------------+
        | 选择连接
        v
+-------------------+
|  NetworkClient    |  // 网络客户端对象
+-------------------+
        | 动态代理
        v
+-------------------+
|  ProxyHandler     |
|-------------------|
| - invoke()        |  // 实现 InvocationHandler 接口,处理反射调用
+-------------------+
        | 创建请求
        v
+-------------------+
|    Request        |
|-------------------|
| - serviceDescriptor| // 服务描述对象
| - parameters      |  // 方法参数
+-------------------+
        | 序列化请求
        v
+-------------------+
|   InputStream     |  // 输入流,发送请求到服务器
+-------------------+
        | 获取返回
        v
+-------------------+
|   Response        |
|-------------------|
| - returnValue     |  // 方法返回值
+-------------------+
        | 反序列化结果
        v
+-------------------+
|   OutputStream    |  // 输出流,返回结果给调用方
+-------------------+