Weitere ähnliche Inhalte
Ähnlich wie Rpc原理与实现 (20)
Rpc原理与实现
- 1. RPC原理与实现
刘海波
http://blog.csdn.net/liu251
1
- 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
- 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
- 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
- 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
运行次数