# scj-rpc **Repository Path**: userwhz/scj-rpc ## Basic Information - **Project Name**: scj-rpc - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-17 - **Last Updated**: 2021-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: 小型RPC ## README # 实现RPC ## 概念 ### 远程过程调用 有返回值的叫函数 没有的叫过程 ### 跨进程交互形式 **直接交互** WebService HTTP RPC RESTful **基于中间件** 基于DB 基于MQ ### 架构 注册中心 服务端 客户端 ## 基础知识 JavaCore Maven 反射 动态代理 Java的动态代理 序列化 反序列化 **网络通信** jetty URLConnection ## 实现 ### UML 查看image 1.png ### 过程 创建工厂,制定协议,通用工具方法 实现序列化模块 实现网络模块 实现Server模块 实现Client模块 scj-rpc模块 ## 模块 ### scj-rpc-client 客户端模块 ~~~ 实现类 RandomTransportSelector init 创建网络连接 select 进行网络连接 RemoteInvoker 调用远程服务的代理类 序列化请求, RpcClient RpcClientConfig Client配置类 接口 TransportSelector init 初始化selector select 选择一个transport与server做交互 release 释放用完的client close 选择哪个server去连接 ~~~ ### scj-rpc-codec 序列化模块 ~~~ 接口 Decoder byte数组转为对象 Encoder 对象转为byte数组 实现类 基于JSON实现 JSONDecoder 实现反序列化 JSONEncoder 实现序列化 ~~~ ### scj-rpc-common 公共方法模块 ``` ReflectionUtils 反射工具类 newInstance 根据class创建对象 getPublicMethods 获取类的公共方法 invoke 调用指定对象的指定方法 ``` ### scj-rpc-proto 协议模块 ~~~ Peer 网络传输的端点(网络地址) 参数 IP 端口 Request 表示RPC的一个请求 参数 将ServiceDescriptor做为内部类 请求服务 请求参数 Response 表示RPC的返回 参数 code message data ServiceDescriptor 表示服务 参数 请求类名 请求的方法名 返回字段类型 请求的参数类型 ~~~ ### scj-rpc-server 服务端模块 ~~~ RPCServer 将客户端的序列化进行反序列化 调用后再序列化给客户端 RPCServerConfig server配置类 表示使用什么网络模块,什么序列化,网络端口 ServiceInstance 表示一个具体服务 参数 服务有哪个对象提供 对象提供哪个方法 ServiceInvoker 调用具体服务 ServiceManager 管理rpc暴露的服务 通过一个Map来进行描述 key为服务描述 value为具体实现 方法 register 将接口的方法都注册一个map中 lookup 通过请求服务查找 ~~~ ### scj-rpc-tansport 网络通信模块 ~~~ 实现类 基于HTTP HTTPTransportClient connect 创建url write 发送数据,等待响应 close 短连接,没必要 HTTPTransportServer init server基于jetty 基于servlet接收请求 start stop 接口 RequestHandler 处理网络的Handler onRequest TransportClient 1.创建连接 2.发送数据,等待响应 3.关闭连接 TransportServer 1.启动,监听端口 2.接收请求 3.关闭监听 ~~~ ## 难点 ### 1.Jetty嵌入 ~~~ Server ServletContextHandler ServletHolder ~~~ ### 2.动态代理 ~~~ Proxy.newProxyInstance RemoteInvoler implements InvocationHandler ~~~ ## 不足 ### 1.安全性 基于Json序列化 ### 2.服务端处理能力 Jetty有线程池 但可以自己实现线程池,返回用一个队列进行处理 ### 3.注册中心 ### 4.集成能力 实现springboot-starter