# zkrpc **Repository Path**: naruto2007/zkrpc ## Basic Information - **Project Name**: zkrpc - **Description**: 轻量级分布式 RPC 框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-02-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 轻量级分布式 RPC 框架 通过 Spring + Netty + Protostuff + ZooKeeper 实现了一个轻量级 RPC 框架,使用 Spring 提供依赖注入与参数配置,使用 Netty 实现 NIO 方式的数据传输,使用 Protostuff 实现对象序列化,使用 ZooKeeper 实现服务注册与发现,动态代理使用CGLIB。 ### 服务器端 启动代码见RpcBootstrap,启动时使用Spring注册服务注册组件和请求处理组件。 服务注册组件ServiceRegistry使用ZooKeeper 客户端实现服务注册功能。 请求处理组件创建一个RPC请求队列(LinkedBlockingQueue)和一定数量的Handler线程(可配置)。Handler线程根据客户端RpcRequest对象,使用CGLIB的反射API调用对应的方法,各线程只需要不断从RPC请求队列中取出请求处理即可,最后将调用的结果封装成RpcResponse对象通过Netty发送回客户端即可。 ### 客户端 使用示例见zkrpc_client,Spring注册RpcClientProxy,通过RpcClientProxy创建代理对象。 RpcClientProxy注册RpcClient,RpcClient可配置服务发现组件ServiceDiscovery和响应处理线程数。 服务发现组件ServiceDiscovery使用ZooKeeper 客户端实现服务发现功能。 RpcClient实现了InvocationHandler,代理对象调用任何方法都会变为调用RpcClient的invoke()方法。在invoke()方法中获得调用的方法和参数,然后封装成RpcRequest对象通过Netty传递至服务器即可。 RpcClient初始化时同时初始化了响应处理器,创建一个RPC响应队列(LinkedBlockingQueue)和一定数量的Handler线程(可配置)。Handler线程处理服务器返回的RpcResponse对象。 ### Netty网络传输 基于Netty4实现网络通信 io.netty netty-all 4.0.24.Final 在客户端和服务端均只有3个ChannelHandler。两者均有一个RpcEncoder和一个RpcDecoder。 RpcEncoder用于将发送的对象序列化为字节序列,继承MessageToByteEncoder,是一个ChannelInboundHandler。 RpcDecoder用于从接收到的字节序列还原出对象,继承ByteToMessageDecoder,是一个ChannelOutboundHandler。 客户端还有一个RpcClientDispatchHandler,用于接收到服务端返回的对象(RpcResponse对象)进行事件的分发。 服务端设有一个RpcServerDispatchHandler,用于接收到客户端发送的对象(RpcRequest对象)进行事件分发。 服务端使用两个EventLoopGroup分别用于处理对端口的监听和Channel上IO读写。由于只监听1个端口,bossGroup大小设为1,workerGroup大小保持默认(默认为CPU核数的2倍)。 ### 序列化与反序列化 序列化与反序列化工具SerializationUtil使用Protostuff实现序列化和反序列化。 同时还使用了 Objenesis 来实例化对象。 ### 性能测试 开启100个线程,每个线程进行10000次方法调用。调用结束用调用总数1000000除以耗费的时间即可得到每秒处理的调用请求数。 测试环境:酷睿i7-4700MQ 2.4CHz 8核 8G内存 64位Windows8操作系统 测试结果:tps = 78137.203125 ### 参考 https://my.oschina.net/huangyong/blog/361751 https://github.com/maigo-uestc/Maigo-RPC