Your SlideShare is downloading. ×
0
RPC原理与实现    刘海波  http://blog.csdn.net/liu251                                1
内容大纲简介涉及技术及实现RPC简单实现RPC简单实现odis实现odis实现Q&A           2
简介RPC:面向过程RPC:面向过程CORBA:面向对象CORBA:面向对象RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA)RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA)                ...
涉及技术及实现序列化协议 序列化协议 通讯协议Hessian proxy方式隔离使用者与序列化和通讯 proxy方式隔离使用者与序列化和通讯 实现代码                       4
涉及技术及实现Hessian客户端Hessian客户端 HessianProxy  .invoke HessianProxy  .sendRequest :返回  .sendRequest:返回 HttpUrlConnection ,基 Htt...
涉及技术及实现Hessian序列化协议Hessian序列化协议   不同类型的序列化/反序列化都实现了Serializer 和   不同类型的序列化/ 反序列化都实现了Serializer                            ...
RPC简单实现模块实现序列化协议:fastjson序列化协议:fastjson通讯:socket通讯:socket示例代码 simplerpc                 7
odis-client主要类介绍 ClientConfig StatusClient ServerProxies RpcClient RPC:支持properties RPC:支持     支持properties Rpc.Invoker im...
odis-client初始化流程: 初始化过程中支持特 定domain的调用  domain的调用 每个调用的timeout 每个调用的timeout 可以自定义 初始化过程中会检查 每个代理方法是否抛 出RpcException       ...
odis-client请求流程: toString方法返回 toString方法返回 interface名称、ip、 interface名称、 ip、           名称、ip port 初始化connection对 初始化connect...
odis-client              11
odis-server主要类介绍 RpcConfig RpcServer(spring bean id) RpcServer RpcServer.DomainManager RpcServer.Listener RpcServer.Connec...
odis-server主要类介绍   RpcConfig   RpcServer(spring bean id)   RpcServer   RpcServer.DomainManager   RpcServer.Listener :创建soc...
优化?(线程同步)数据传输 odis中使用长连接来传送数据 odis中使用长连接来传送数据 blocking io vs nio线程竞争 客户端多个线程竞争一个 socket.outputStream vs 客户端多个线程竞争一个socket....
优化?(线程同步)结果 1375       1438   1343   1360    1438(同步client)                                  1438(同步                      ...
优化?(代理类)                      使用分析                             在client初始化ServerProxies 的过程中,通过                            ...
优化?(代理类)结果分析初始化化代理类,因为cglib需要多创初始化化代理类,因为cglibcglib需要多创建2个类,耗时多于jdk proxy方式   个类,耗时多于jdk proxy方式运行期,cglib enhancer则优与jdk运行...
Q&A      18
Upcoming SlideShare
Loading in...5
×

Rpc原理与实现

3,495

Published on

a brief view of rpc, eg: hessian

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,495
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
41
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Transcript of "Rpc原理与实现"

  1. 1. RPC原理与实现 刘海波 http://blog.csdn.net/liu251 1
  2. 2. 内容大纲简介涉及技术及实现RPC简单实现RPC简单实现odis实现odis实现Q&A 2
  3. 3. 简介RPC:面向过程RPC:面向过程CORBA:面向对象CORBA:面向对象RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA)RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA) 面向对象,易用(相对CORBAWebServices/XML-RPC:dotNet平台推出WebServices/XML-RPC:dotNet平台推出RPC(BINARY/JSON/XML):简化版的WebServicesRPC(BINARY/JSON/XML):简化版的 :简化版的WebServicesREST:面向资源REST:面向资源 3
  4. 4. 涉及技术及实现序列化协议 序列化协议 通讯协议Hessian proxy方式隔离使用者与序列化和通讯 proxy方式隔离使用者与序列化和通讯 实现代码 4
  5. 5. 涉及技术及实现Hessian客户端Hessian客户端 HessianProxy .invoke HessianProxy .sendRequest :返回 .sendRequest:返回 HttpUrlConnection ,基 HttpUrlConnection,基 于http协议的通讯 http协议的通讯Hession服务器端Hession服务器端 HessianSkeleton.invoke 5
  6. 6. 涉及技术及实现Hessian序列化协议Hessian序列化协议 不同类型的序列化/反序列化都实现了Serializer 和 不同类型的序列化/ 反序列化都实现了Serializer Serializer和 Deserializer 接口, 然后由 SerializerFactory 根据不 Deserializer接口 接口, 同类型(Class)来创建不同的 Serializer /Deserializer. 同类型(Class) (Class)来创建不同的 6
  7. 7. RPC简单实现模块实现序列化协议:fastjson序列化协议:fastjson通讯:socket通讯:socket示例代码 simplerpc 7
  8. 8. odis-client主要类介绍 ClientConfig StatusClient ServerProxies RpcClient RPC:支持properties RPC:支持 支持properties Rpc.Invoker implements InvocationHandler RpcClient.Connection RpcClient.CallFuture工具类 pakcage lib的IWritable类 lib的 IWritable类 8
  9. 9. odis-client初始化流程: 初始化过程中支持特 定domain的调用 domain的调用 每个调用的timeout 每个调用的timeout 可以自定义 初始化过程中会检查 每个代理方法是否抛 出RpcException 9
  10. 10. odis-client请求流程: toString方法返回 toString方法返回 interface名称、ip、 interface名称、 ip、 名称、ip port 初始化connection对 初始化connection connection对 象,不适用本地黑名单中 的port RpcClient获取 RpcClient获取 connection:初始化 connection:初始化 connection,发送附加 connection,发送附加 属性之后,如果缓存中已 经存在类似 connection,则关闭当 connection,则关闭当 前connection ,否则, connection,否则, 将当前connection以 将当前connection connection以 address为key缓存到 address为 key缓存到 map中.connection 是长 map中 .connection是长 连接 代码中的timeout是通过 代码中的timeout timeout是通过 自己编码实现的 10
  11. 11. odis-client 11
  12. 12. odis-server主要类介绍 RpcConfig RpcServer(spring bean id) RpcServer RpcServer.DomainManager RpcServer.Listener RpcServer.Connection RpcServer.Handler RpcServer.Call 12
  13. 13. odis-server主要类介绍 RpcConfig RpcServer(spring bean id) RpcServer RpcServer.DomainManager RpcServer.Listener :创建socket 连接connection RpcServer.Listener:创建 socket连接 :创建socket 连接connection RpcServer.Connection :每个socket ,connection 单进程处理,不需要考虑InputStream 的同步,call入队列 :每个socket socket, 单进程处理,不需要考虑InputStream 的同步,call InputStream的同步,call入队列 RpcServer.Call :客户端传入参数,多个call对象共用一个connection ,需要synchronized OutputStream RpcServer.Call:客户端传入参数,多个call对象共用一个connection,需要 :客户端传入参数,多个call 对象共用一个connection ,需要synchronized RpcServer.Handler :handler 是多线程处理,将call数据返回到客户端 RpcServer.Handler: handler是多线程处理,将call数据返回到客户端 是多线程处理,将call 13
  14. 14. 优化?(线程同步)数据传输 odis中使用长连接来传送数据 odis中使用长连接来传送数据 blocking io vs nio线程竞争 客户端多个线程竞争一个 socket.outputStream vs 客户端多个线程竞争一个socket.outputStream 客户端多个线程使用一个队列 参考代码:org.netease.socketio.multiclient 参考代码:org.netease.socketio.multiclient 14
  15. 15. 优化?(线程同步)结果 1375 1438 1343 1360 1438(同步client) 1438(同步 同步client) 1281 1238 1250 1282 1297(队列client) 1297(队列 队列client) 5次请求(毫秒-10000线程,休眠10 ms/线程)1450140013501300 同步client1250 队列client120011501100 1 2 3 4 5 15
  16. 16. 优化?(代理类) 使用分析 在client初始化ServerProxies 的过程中,通过 client初始化 ServerProxies的过程中,通过 初始化ServerProxies JDK:Proxy.newProxyInstance 生成代理类。client在 JDK:Proxy.newProxyInstance生成代理类。 client在 生成代理类。client AbstractTask 声明为静态字段,则所有的代理类也为静态的。 AbstractTask声明为静态字段,则所有的代理类也为静态的。 JDK Proxy和cglib Enhancer对比 Proxy和 Enhancer对比 初始化耗时: - jdk:15ms enhancer:78ms 运行时耗时 1kw循环 Proxy Enhancer 1000 968 953 938 800时间(ms) 600 500 468 453 400 200 16 0 1 2 3 运行次数
  17. 17. 优化?(代理类)结果分析初始化化代理类,因为cglib需要多创初始化化代理类,因为cglibcglib需要多创建2个类,耗时多于jdk proxy方式 个类,耗时多于jdk proxy方式运行期,cglib enhancer则优与jdk运行期,cglib enhancer则优与 则优与jdkproxy如果代码运行过程中不需要重复创建代理类,可以考虑使用cglib enhancer理类,可以考虑使用cglib方式,节省时间 17
  18. 18. Q&A 18
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×