JAVA RPC框架,基于netty,kryo,zookeeper 和 spring实现,可无缝接入Spring,客户端和服务器端均采用异步处理,实现20000+TPS。负载均衡策略为轮询。
服务器端Spring启动配置:
<!--服务端接口实现类,需要添加@LionService注解-->
<context:component-scan base-package="com.my.lionrpc.lionrpc.server"/>
<context:property-placeholder location="classpath:server.properties"/>
<!--业务处理线程池配置-->
<bean id="workerCenter" class="com.my.lionrpc.common.ApplicationWorkerCenter">
<constructor-arg name="coreSize" value="4"/>
<constructor-arg name="maxSize" value="20"/>
<constructor-arg name="keepAliveSecond" value="10"/>
<constructor-arg name="queueSize" value="100"/>
</bean>
<!--zookeeper服务注册配置-->
<bean id="serviceRegistry" class="com.my.lionrpc.registry.ServiceRegistry">
<constructor-arg name="registryAddress" value="${registry.address}"/>
</bean>
<bean id="rpcServer" class="com.my.lionrpc.server.LionServer">
<constructor-arg name="serverAddress" value="${server.address}"/>
<constructor-arg name="workerCenter" ref="workerCenter"/>
<constructor-arg name="registry" ref="serviceRegistry"/>
</bean>
客户端Spring启动配置:
<context:property-placeholder location="classpath:client.properties"/>
<!--zookeeper服务发现配置-->
<bean id="serviceDiscovery" class="com.my.lionrpc.registry.ServiceDiscovery">
<constructor-arg name="registryAddress" value="${registry.address}"/>
</bean>
<!--Spring远程服务接口配置-->
<bean id="lsProxyFactory" class="com.my.lionrpc.client.spring.LionServiceProxyFactory">
<property name="serviceMap">
<map>
<!--key标示注入到Spring容器的beanID,value为服务接口类。-->
<entry key="helloService" value="com.my.lionrpc.lionrpc.server.IHelloService"/>
<entry key="teacherService" value="com.my.lionrpc.lionrpc.server.ITeacherService"/>
</map>
</property>
</bean>
客户端业务类如果需要使用helloService接口可在类中添加如下注解即可完成对象注入:
@Autowired
private IHelloService service;
测试报告:
测试机配置:
型号标识符: MacBookPro12,1
处理器名称: Intel Core i5
处理器速度: 2.9 GHz
处理器数目: 1
核总数: 2
L2 缓存(每个核): 256 KB
L3 缓存: 3 MB
内存: 8 GB
服务器端和客户端在同一测试机上部署:
客户端启动15个线程进行RPC调用,每个线程调用1000万次(共调用1.5亿次,耗时5593797ms),平均每秒完成2.68万+次调用。测试过程中有启停服务端测试,客户端可以正常重连。且服务器端和客户端内存占用较少。
PID COMMAND %CPU TIME #TH #WQ #PORT MEM PURG CMPRS PGRP
3381 java 77.4 07:46.49 34/4 0 106 118M+ 0B 0B 596 服务端
3380 java 159.9 17:53.84 51/1 0 140 165M+ 0B 0B 596 客户端
声明:开发过程中有借鉴其它java rpc框架设计思想。