rpc原理与实现
DESCRIPTION
a brief view of rpc, eg: hessianTRANSCRIPT
1
RPCRPCRPCRPCRPCRPCRPCRPC原理与实现原理与实现原理与实现原理与实现原理与实现原理与实现原理与实现原理与实现
刘海波刘海波刘海波刘海波 http://blog.csdn.net/liu251http://blog.csdn.net/liu251http://blog.csdn.net/liu251http://blog.csdn.net/liu251
2
内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲内容大纲
简介简介简介简介涉及技术及实现涉及技术及实现涉及技术及实现涉及技术及实现RPCRPCRPCRPC简单实现简单实现简单实现简单实现odisodisodisodis实现实现实现实现Q&AQ&AQ&AQ&A
3
简介简介
RPC:RPC:RPC:RPC:面向过程面向过程面向过程面向过程CORBA:CORBA:CORBA:CORBA:面向对象面向对象面向对象面向对象RMI/EJB(COM/DCOM):RMI/EJB(COM/DCOM):RMI/EJB(COM/DCOM):RMI/EJB(COM/DCOM):面向对象,易用(相对面向对象,易用(相对面向对象,易用(相对面向对象,易用(相对CORBACORBACORBACORBA))))WebServices/XML-RPCWebServices/XML-RPCWebServices/XML-RPCWebServices/XML-RPC::::dotNetdotNetdotNetdotNet平台推出平台推出平台推出平台推出RPC(BINARY/JSON/XML)RPC(BINARY/JSON/XML)RPC(BINARY/JSON/XML)RPC(BINARY/JSON/XML):简化版的:简化版的:简化版的:简化版的WebServicesWebServicesWebServicesWebServicesREST:REST:REST:REST:面向资源面向资源面向资源面向资源
4
涉及技术及实现涉及技术及实现
序列化协议序列化协议序列化协议序列化协议序列化协议序列化协议序列化协议序列化协议通讯协议通讯协议通讯协议通讯协议
HessianHessianHessianHessianproxyproxyproxyproxy方式隔离使用者与序列化和通讯方式隔离使用者与序列化和通讯方式隔离使用者与序列化和通讯方式隔离使用者与序列化和通讯实现代码实现代码实现代码实现代码
5
涉及技术及实现涉及技术及实现
HessianHessianHessianHessian客户端客户端客户端客户端HessianProxyHessianProxyHessianProxyHessianProxy.invoke.invoke.invoke.invoke
HessianProxyHessianProxyHessianProxyHessianProxy.sendRequest.sendRequest.sendRequest.sendRequest:返回:返回:返回:返回
HttpUrlConnectionHttpUrlConnectionHttpUrlConnectionHttpUrlConnection,基,基,基,基于于于于httphttphttphttp协议的通讯协议的通讯协议的通讯协议的通讯
HessionHessionHessionHession服务器端服务器端服务器端服务器端HessianSkeleton.invokeHessianSkeleton.invokeHessianSkeleton.invokeHessianSkeleton.invoke
6
涉及技术及实现涉及技术及实现
HessianHessianHessianHessian序列化协议序列化协议序列化协议序列化协议不同类型的序列化不同类型的序列化不同类型的序列化不同类型的序列化////反序列化都实现了反序列化都实现了反序列化都实现了反序列化都实现了SerializerSerializerSerializerSerializer和和和和DeserializerDeserializerDeserializerDeserializer接口接口接口接口, , , , 然后由然后由然后由然后由 SerializerFactory SerializerFactory SerializerFactory SerializerFactory 根据不根据不根据不根据不同类型同类型同类型同类型(Class)(Class)(Class)(Class)来创建不同的来创建不同的来创建不同的来创建不同的 Serializer /Deserializer. Serializer /Deserializer. Serializer /Deserializer. Serializer /Deserializer.
7
RPCRPCRPCRPCRPCRPCRPCRPC简单实现简单实现
模块实现模块实现模块实现模块实现序列化协议:序列化协议:序列化协议:序列化协议:fastjsonfastjsonfastjsonfastjson通讯:通讯:通讯:通讯:socketsocketsocketsocket
示例代码示例代码示例代码示例代码simplerpcsimplerpcsimplerpcsimplerpc
8
odis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-client主要类介绍主要类介绍主要类介绍主要类介绍
ClientConfigClientConfigClientConfigClientConfigStatusClientStatusClientStatusClientStatusClientServerProxiesServerProxiesServerProxiesServerProxiesRpcClientRpcClientRpcClientRpcClientRPC:RPC:RPC:RPC:支持支持支持支持propertiespropertiespropertiespropertiesRpc.Invoker implements InvocationHandlerRpc.Invoker implements InvocationHandlerRpc.Invoker implements InvocationHandlerRpc.Invoker implements InvocationHandlerRpcClient.ConnectionRpcClient.ConnectionRpcClient.ConnectionRpcClient.ConnectionRpcClient.CallFutureRpcClient.CallFutureRpcClient.CallFutureRpcClient.CallFuture
工具类工具类工具类工具类pakcage libpakcage libpakcage libpakcage lib的的的的IWritableIWritableIWritableIWritable类类类类
9
odis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-client初始化流程:初始化流程:初始化流程:初始化流程:
初始化过程中支持特初始化过程中支持特初始化过程中支持特初始化过程中支持特定定定定domaindomaindomaindomain的调用的调用的调用的调用每个调用的每个调用的每个调用的每个调用的timeouttimeouttimeouttimeout可以自定义可以自定义可以自定义可以自定义初始化过程中会检查初始化过程中会检查初始化过程中会检查初始化过程中会检查每个代理方法是否抛每个代理方法是否抛每个代理方法是否抛每个代理方法是否抛出出出出RpcExceptionRpcExceptionRpcExceptionRpcException
10
odis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-clientodis-client请求流程:请求流程:请求流程:请求流程:
toStringtoStringtoStringtoString方法返回方法返回方法返回方法返回interfaceinterfaceinterfaceinterface名称、名称、名称、名称、ipipipip、、、、portportportport初始化初始化初始化初始化connectionconnectionconnectionconnection对对对对象,不适用本地黑名单中象,不适用本地黑名单中象,不适用本地黑名单中象,不适用本地黑名单中的的的的portportportportRpcClientRpcClientRpcClientRpcClient获取获取获取获取connectionconnectionconnectionconnection:初始化:初始化:初始化:初始化connectionconnectionconnectionconnection,发送附加,发送附加,发送附加,发送附加属性之后,如果缓存中已属性之后,如果缓存中已属性之后,如果缓存中已属性之后,如果缓存中已经存在类似经存在类似经存在类似经存在类似connectionconnectionconnectionconnection,则关闭当,则关闭当,则关闭当,则关闭当前前前前connectionconnectionconnectionconnection,否则,,否则,,否则,,否则,将当前将当前将当前将当前connectionconnectionconnectionconnection以以以以addressaddressaddressaddress为为为为keykeykeykey缓存到缓存到缓存到缓存到mapmapmapmap中中中中.connection.connection.connection.connection是长是长是长是长连接连接连接连接代码中的代码中的代码中的代码中的timeouttimeouttimeouttimeout是通过是通过是通过是通过自己编码实现的自己编码实现的自己编码实现的自己编码实现的
12
odis-serverodis-serverodis-serverodis-serverodis-serverodis-serverodis-serverodis-server主要类介绍主要类介绍主要类介绍主要类介绍RpcConfigRpcConfigRpcConfigRpcConfigRpcServer(spring bean id)RpcServer(spring bean id)RpcServer(spring bean id)RpcServer(spring bean id)RpcServerRpcServerRpcServerRpcServerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.ListenerRpcServer.ListenerRpcServer.ListenerRpcServer.ListenerRpcServer.ConnectionRpcServer.ConnectionRpcServer.ConnectionRpcServer.ConnectionRpcServer.HandlerRpcServer.HandlerRpcServer.HandlerRpcServer.HandlerRpcServer.CallRpcServer.CallRpcServer.CallRpcServer.Call
13
odis-serverodis-serverodis-serverodis-serverodis-serverodis-serverodis-serverodis-server
主要类介绍主要类介绍主要类介绍主要类介绍
RpcConfigRpcConfigRpcConfigRpcConfigRpcServer(spring bean id)RpcServer(spring bean id)RpcServer(spring bean id)RpcServer(spring bean id)RpcServerRpcServerRpcServerRpcServerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.DomainManagerRpcServer.ListenerRpcServer.ListenerRpcServer.ListenerRpcServer.Listener:创建:创建:创建:创建socketsocketsocketsocket连接连接连接连接connectionconnectionconnectionconnectionRpcServer.ConnectionRpcServer.ConnectionRpcServer.ConnectionRpcServer.Connection:每个:每个:每个:每个socketsocketsocketsocket,,,,connection connection connection connection 单进程处理,不需要考虑单进程处理,不需要考虑单进程处理,不需要考虑单进程处理,不需要考虑InputStreamInputStreamInputStreamInputStream的同步,的同步,的同步,的同步,callcallcallcall入队列入队列入队列入队列RpcServer.CallRpcServer.CallRpcServer.CallRpcServer.Call:客户端传入参数,多个:客户端传入参数,多个:客户端传入参数,多个:客户端传入参数,多个callcallcallcall对象共用一个对象共用一个对象共用一个对象共用一个connectionconnectionconnectionconnection,需要,需要,需要,需要synchronized OutputStreamsynchronized OutputStreamsynchronized OutputStreamsynchronized OutputStreamRpcServer.HandlerRpcServer.HandlerRpcServer.HandlerRpcServer.Handler::::handlerhandlerhandlerhandler是多线程处理,将是多线程处理,将是多线程处理,将是多线程处理,将callcallcallcall数据返回到客户端数据返回到客户端数据返回到客户端数据返回到客户端
14
优化优化?(?(?(?(?(?(?(?(线程同步线程同步))))))))数据传输数据传输数据传输数据传输
odisodisodisodis中使用长连接来传送数据中使用长连接来传送数据中使用长连接来传送数据中使用长连接来传送数据blocking io vs nioblocking io vs nio
线程竞争线程竞争线程竞争线程竞争客户端多个线程竞争一个客户端多个线程竞争一个客户端多个线程竞争一个客户端多个线程竞争一个socket.outputStream vs socket.outputStream vs socket.outputStream vs socket.outputStream vs 客户端多个线程使用一个队列客户端多个线程使用一个队列客户端多个线程使用一个队列客户端多个线程使用一个队列参考代码:参考代码:参考代码:参考代码:org.netease.socketio.multiclientorg.netease.socketio.multiclientorg.netease.socketio.multiclientorg.netease.socketio.multiclient
15
优化?优化?((((((((线程同步线程同步))))))))结果结果结果结果
1375137513751375 1438143814381438 1343134313431343 1360136013601360 1438(1438(1438(1438(同步同步同步同步client)client)client)client)1281128112811281 1238123812381238 1250125012501250 1282128212821282 1297(1297(1297(1297(队列队列队列队列client)client)client)client)
1100
1150
1200
1250
1300
1350
1400
1450
1 2 3 4 5
5次请求(毫秒-10000线程,休眠10ms/线程)
同步client
队列client
16
优化优化?(?(?(?(?(?(?(?(代理类代理类))))))))使用分析使用分析使用分析使用分析
在在在在clientclientclientclient初始化初始化初始化初始化ServerProxiesServerProxiesServerProxiesServerProxies的过程中,通过的过程中,通过的过程中,通过的过程中,通过JDK:Proxy.newProxyInstanceJDK:Proxy.newProxyInstanceJDK:Proxy.newProxyInstanceJDK:Proxy.newProxyInstance生成代理类。生成代理类。生成代理类。生成代理类。clientclientclientclient在在在在AbstractTaskAbstractTaskAbstractTaskAbstractTask声明为静态字段,则所有的代理类也为静态的。声明为静态字段,则所有的代理类也为静态的。声明为静态字段,则所有的代理类也为静态的。声明为静态字段,则所有的代理类也为静态的。
JDK ProxyJDK ProxyJDK ProxyJDK Proxy和和和和cglib Enhancercglib Enhancercglib Enhancercglib Enhancer对比对比对比对比初始化耗时:初始化耗时:初始化耗时:初始化耗时:
- jdk:15ms enhancer:78msjdk:15ms enhancer:78msjdk:15ms enhancer:78msjdk:15ms enhancer:78ms
0
200
400
600
800
1000
1 2 3
1kw循环
968 953 938
500 468 453
运行次数
时间(ms)
ProxyEnhancer
运行时耗时运行时耗时运行时耗时运行时耗时
17
优化优化?(?(?(?(?(?(?(?(代理类代理类))))))))
结果分析结果分析结果分析结果分析初始化化代理类,因为初始化化代理类,因为初始化化代理类,因为初始化化代理类,因为cglibcglibcglibcglib需要多创需要多创需要多创需要多创建建建建2222个类,耗时多于个类,耗时多于个类,耗时多于个类,耗时多于jdk proxyjdk proxyjdk proxyjdk proxy方式方式方式方式运行期,运行期,运行期,运行期,cglib enhancercglib enhancercglib enhancercglib enhancer则优与则优与则优与则优与jdk jdk jdk jdk proxyproxyproxyproxy如果代码运行过程中不需要重复创建代如果代码运行过程中不需要重复创建代如果代码运行过程中不需要重复创建代如果代码运行过程中不需要重复创建代理类,可以考虑使用理类,可以考虑使用理类,可以考虑使用理类,可以考虑使用cglib enhancercglib enhancercglib enhancercglib enhancer方式,节省时间方式,节省时间方式,节省时间方式,节省时间