为了实现一个自定义的rpc,如果想实现一个rpc,其本质是将远程调用可以和本地调用一样。而要实现这样的功能,首先我们需要一个解码器Decoder和一个编码器Encoder、对半包粘包的处理。同时为了保证网络传输的高性能,我们采用Netty做数据传输。调用采用动态代理去进行调用。对应标签的解析,采用自定义标签,因此可以考虑使用spring的自定义标签进行解析。采用观察者模式或者采用后置处理器对自定义bean进行注入到spring bean的注册表中。对应服务的维护可以考虑使用注册中心对服务信息进行维护。对于协议可以采用适配器模式进行适配。
1.编解码
解码编码器的实现Netty中的MessageToByteEncoder、ByteToMessageDecoder,同时自定义一个序列化器进行序列化和反序列化:
代码语言:javascript复制1.消息转换成字节的过程 是编码Encoder的过程,同时这个过程是一个序列化的过程,同时使用Netty的byteBuf写入数据长度和字节信息
2.字节转换成消息的过程 是解码Decoder的过程,同时这个过程是一个反序列化的过程,同时使用ByteBuf对数据进行读取、反序列化,同时拿到长度
2.请求和响应
代码语言:javascript复制请求Request:请求的id、类名称、方法名称、参数类型、参数对象
响应Response:请求的id、响应的状态、结果
3.服务端调用流程
4.客户端调用流程
如果使用异步,可以考虑实现在ObjectProxy中实现InvocationHandler#invoke,拿到当前的请求中的类名称、方法名称、参数类型、参数对象等,选择相应的handler进行业务处理。这个过程包括创建请求createRequest和发送请sendRequest。
5.更多
考虑到服务的高可用性、配置中心、元数据中心、注册中心等。