狠狠撸
Submit Search
搁辫肠原理与实现
?
8 likes
?
2,685 views
W
wavefly
Follow
a brief view of rpc, eg: hessian
Read less
Read more
1 of 18
Download now
Downloaded 43 times
More Related Content
搁辫肠原理与实现
1.
搁笔颁原理与实现
刘海波 http://blog.csdn.net/liu251 1
2.
内容大纲 介绍 涉及技术及实现 RPC简单实现 RPC简单实现 odis实现 odis实现 Q&A
2
3.
介绍 RPC:面向过程 RPC:面向过程 CORBA:面向对象 CORBA:面向对象 RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA) RMI/EJB(COM/DCOM):面向对象,易用(相对CORBA)
面向对象,易用(相对CORBA WebServices/XML-RPC:dotNet平台推出 WebServices/XML-RPC:dotNet平台推出 RPC(BINARY/JSON/XML):简化版的WebServices RPC(BINARY/JSON/XML):简化版的 :简化版的WebServices REST:面向资源 REST:面向资源 3
4.
涉及技术及实现 序列化协议 序列化协议 通讯协议 Hessian
proxy方式隔离使用者与序列化和通讯 proxy方式隔离使用者与序列化和通讯 实现代码 4
5.
涉及技术及实现 Hessian客户端 Hessian客户端 HessianProxy
.invoke HessianProxy .sendRequest :返回 .sendRequest:返回 HttpUrlConnection ,基 HttpUrlConnection,基 于http协议的通讯 http协议的通讯 Hession服务器端 Hession服务器端 HessianSkeleton.invoke 5
6.
涉及技术及实现 Hessian序列化协议 Hessian序列化协议
不同类型的序列化/反序列化都实现了Serializer 和 不同类型的序列化/ 反序列化都实现了Serializer Serializer和 Deserializer 接口, 然后由 SerializerFactory 根据不 Deserializer接口 接口, 同类型(Class)来创建不同的 Serializer /Deserializer. 同类型(Class) (Class)来创建不同的 6
7.
RPC简单实现 模块实现 序列化协议:fastjson 序列化协议:fastjson 通讯:socket 通讯:socket 示例代码 simplerpc
7
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.
odis-client 初始化流程: 初始化过程中支持特 定domain的调用
domain的调用 每个调用的timeout 每个调用的timeout 可以自定义 初始化过程中会检查 每个代理方法是否抛 出RpcException 9
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.
odis-client
11
12.
odis-server 主要类介绍 RpcConfig RpcServer(spring
bean id) RpcServer RpcServer.DomainManager RpcServer.Listener RpcServer.Connection RpcServer.Handler RpcServer.Call 12
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.
优化?(线程同步) 数据传输 odis中使用长连接来传送数据 odis中使用长连接来传送数据
blocking io vs nio 线程竞争 客户端多个线程竞争一个 socket.outputStream vs 客户端多个线程竞争一个socket.outputStream 客户端多个线程使用一个队列 参考代码:org.netease.socketio.multiclient 参考代码:org.netease.socketio.multiclient 14
15.
优化?(线程同步) 结果 1375
1438 1343 1360 1438(同步client) 1438(同步 同步client) 1281 1238 1250 1282 1297(队列client) 1297(队列 队列client) 5次请求(毫秒-10000线程,休眠10 ms/线程) 1450 1400 1350 1300 同步client 1250 队列client 1200 1150 1100 1 2 3 4 5 15
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.
优化?(代理类) 结果分析 初始化化代理类,因为cglib需要多创 初始化化代理类,因为cglibcglib需要多创 建2个类,耗时多于jdk proxy方式
个类,耗时多于jdk proxy方式 运行期,cglib enhancer则优与jdk 运行期,cglib enhancer则优与 则优与jdk proxy 如果代码运行过程中不需要重复创建代 理类,可以考虑使用cglib enhancer 理类,可以考虑使用cglib 方式,节省时间 17
18.
Q&A
18
Download