• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Rpc原理与实现
 

Rpc原理与实现

on

  • 3,635 views

a brief view of rpc, eg: hessian

a brief view of rpc, eg: hessian

Statistics

Views

Total Views
3,635
Views on SlideShare
3,635
Embed Views
0

Actions

Likes
3
Downloads
37
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Rpc原理与实现 Rpc原理与实现 Presentation Transcript

    • 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) 面向对象,易用(相对CORBAWebServices/XML-RPC:dotNet平台推出WebServices/XML-RPC:dotNet平台推出RPC(BINARY/JSON/XML):简化版的WebServicesRPC(BINARY/JSON/XML):简化版的 :简化版的WebServicesREST:面向资源REST:面向资源 3
    • 涉及技术及实现序列化协议 序列化协议 通讯协议Hessian proxy方式隔离使用者与序列化和通讯 proxy方式隔离使用者与序列化和通讯 实现代码 4
    • 涉及技术及实现Hessian客户端Hessian客户端 HessianProxy .invoke HessianProxy .sendRequest :返回 .sendRequest:返回 HttpUrlConnection ,基 HttpUrlConnection,基 于http协议的通讯 http协议的通讯Hession服务器端Hession服务器端 HessianSkeleton.invoke 5
    • 涉及技术及实现Hessian序列化协议Hessian序列化协议 不同类型的序列化/反序列化都实现了Serializer 和 不同类型的序列化/ 反序列化都实现了Serializer Serializer和 Deserializer 接口, 然后由 SerializerFactory 根据不 Deserializer接口 接口, 同类型(Class)来创建不同的 Serializer /Deserializer. 同类型(Class) (Class)来创建不同的 6
    • RPC简单实现模块实现序列化协议:fastjson序列化协议:fastjson通讯:socket通讯:socket示例代码 simplerpc 7
    • odis-client主要类介绍 ClientConfig StatusClient ServerProxies RpcClient RPC:支持properties RPC:支持 支持properties Rpc.Invoker implements InvocationHandler RpcClient.Connection RpcClient.CallFuture工具类 pakcage lib的IWritable类 lib的 IWritable类 8
    • odis-client初始化流程: 初始化过程中支持特 定domain的调用 domain的调用 每个调用的timeout 每个调用的timeout 可以自定义 初始化过程中会检查 每个代理方法是否抛 出RpcException 9
    • 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
    • odis-client 11
    • odis-server主要类介绍 RpcConfig RpcServer(spring bean id) RpcServer RpcServer.DomainManager RpcServer.Listener RpcServer.Connection RpcServer.Handler RpcServer.Call 12
    • 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
    • 优化?(线程同步)数据传输 odis中使用长连接来传送数据 odis中使用长连接来传送数据 blocking io vs nio线程竞争 客户端多个线程竞争一个 socket.outputStream vs 客户端多个线程竞争一个socket.outputStream 客户端多个线程使用一个队列 参考代码:org.netease.socketio.multiclient 参考代码:org.netease.socketio.multiclient 14
    • 优化?(线程同步)结果 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
    • 优化?(代理类) 使用分析 在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 运行次数
    • 优化?(代理类)结果分析初始化化代理类,因为cglib需要多创初始化化代理类,因为cglibcglib需要多创建2个类,耗时多于jdk proxy方式 个类,耗时多于jdk proxy方式运行期,cglib enhancer则优与jdk运行期,cglib enhancer则优与 则优与jdkproxy如果代码运行过程中不需要重复创建代理类,可以考虑使用cglib enhancer理类,可以考虑使用cglib方式,节省时间 17
    • Q&A 18