一、服务器:
- RpcServer对象通过构造函数初始化,初始化包含创建网络协议对象、服务管理对象、服务反射调用对象。
- 初始化完成后,服务管理对象需注册代理的服务类名和实例对象,注册过程中服务管理对象通过类名获取被代理服务的公共方法组,并给每个方法创建一个服务实例并注入引用原实例对象如new ServiceInstance(bean, method),其中bean从注册方法入参获取引用原实例对象,同时,给每个方法创建一个服务描述对象记录类、方法和方法的参数类型及返回类型。服务管理对象中有map用于存储服务描述对象和服务实例。
- 注册完毕,启动server,启动server时初始化网络协议对象,协议对象需要创建处理器对象用于处理网络请求输入输出流。
- 处理过程:读取输入流转为btye数组并反序列化为请求对象Request,通过服务管理对象查询map,根据请求中携带的描述记录类,获取对应注册过的服务实例,通过反射调用实例的方法,并将返回值set到返回体中,最后序列化返回体,并写入输出流。
二、客户端:
- RpcClient对象通过构造函数初始化,初始化包含创建网络协议对象、服务选择器对象(负载均衡)。
- 初始化完成后,使用客户端实例通过服务类名动态代理服务对象,动态代理中需要代理处理器来反射调用服务方法处理(我通过实现InvocationHandler重写invoke),每次使用动态代理服务对象的方法时,会自动调用代理处理器的invoke方法进行实际处理。
- 处理过程:服务选择器初始化时会创建可用连接池,从连接池选择一个网络客户端对象,新建一个网络请求对象携带目标服务描述和参数,对此网络请求对象序列化,用网络客户端连接服务器并将请求写入输入流进行请求,获取返回结果,反序列化获得结果。
+-------------------+
| 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 | // 输出流,返回结果给调用方
+-------------------+