狠狠撸

狠狠撸Share a Scribd company logo
搁笔颁原理与实现


    刘海波
  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)
                  面向对象,易用(相对CORBA
WebServices/XML-RPC:dotNet平台推出
WebServices/XML-RPC:dotNet平台推出
RPC(BINARY/JSON/XML):简化版的WebServices
RPC(BINARY/JSON/XML):简化版的
                    :简化版的WebServices
REST:面向资源
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/线程)
1450

1400

1350

1300
                                          同步client
1250                                      队列client


1200

1150

1100
        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则优与
                  则优与jdk
proxy
如果代码运行过程中不需要重复创建代
理类,可以考虑使用cglib enhancer
理类,可以考虑使用cglib
方式,节省时间




                           17
Q&A




      18

More Related Content

搁辫肠原理与实现