SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
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)
                  面向对象,易用(相对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

Más contenido relacionado

La actualidad más candente

独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐Zheng Biao
 
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021StreamNative
 
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021StreamNative
 
高性能并发网络服务器设计与实现
高性能并发网络服务器设计与实现高性能并发网络服务器设计与实现
高性能并发网络服务器设计与实现ideawu
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務升煌 黃
 
Hbase性能测试文档
Hbase性能测试文档Hbase性能测试文档
Hbase性能测试文档baggioss
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收Tony Deng
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
Res tful api design tw-2.0
Res tful api design tw-2.0Res tful api design tw-2.0
Res tful api design tw-2.0昀陞 李
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
Web并发模型粗浅探讨
Web并发模型粗浅探讨Web并发模型粗浅探讨
Web并发模型粗浅探讨Robbin Fan
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast sharerfyiamcool
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Web性能测试指标参考v0.2
Web性能测试指标参考v0.2Web性能测试指标参考v0.2
Web性能测试指标参考v0.2beiyu95
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmmYiwei Ma
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 
并发编程交流
并发编程交流并发编程交流
并发编程交流bluedavy lin
 

La actualidad más candente (19)

独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐
 
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
 
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
 
高性能并发网络服务器设计与实现
高性能并发网络服务器设计与实现高性能并发网络服务器设计与实现
高性能并发网络服务器设计与实现
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務
 
Hbase性能测试文档
Hbase性能测试文档Hbase性能测试文档
Hbase性能测试文档
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
Res tful api design tw-2.0
Res tful api design tw-2.0Res tful api design tw-2.0
Res tful api design tw-2.0
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
Web并发模型粗浅探讨
Web并发模型粗浅探讨Web并发模型粗浅探讨
Web并发模型粗浅探讨
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast share
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Web性能测试指标参考v0.2
Web性能测试指标参考v0.2Web性能测试指标参考v0.2
Web性能测试指标参考v0.2
 
Mysql proxy+mysql-mmm
Mysql proxy+mysql-mmmMysql proxy+mysql-mmm
Mysql proxy+mysql-mmm
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 
并发编程交流
并发编程交流并发编程交流
并发编程交流
 

Destacado

Finagle - an intro to rpc & a sync programming in jvm
Finagle - an intro to rpc & a sync programming in jvmFinagle - an intro to rpc & a sync programming in jvm
Finagle - an intro to rpc & a sync programming in jvmPrasannaKumar Sathyanarayanan
 
Make it fast for everyone - performance and middleware design
Make it fast for everyone - performance and middleware designMake it fast for everyone - performance and middleware design
Make it fast for everyone - performance and middleware designSriskandarajah Suhothayan
 
Serialization and performance in Java
Serialization and performance in JavaSerialization and performance in Java
Serialization and performance in JavaStrannik_2013
 
Modern Distributed Messaging and RPC
Modern Distributed Messaging and RPCModern Distributed Messaging and RPC
Modern Distributed Messaging and RPCMax Alexejev
 
High Performance RPC with Finagle
High Performance RPC with FinagleHigh Performance RPC with Finagle
High Performance RPC with FinagleSamir Bessalah
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System DevelopmentAllan Huang
 

Destacado (7)

US DTV Transition
US DTV TransitionUS DTV Transition
US DTV Transition
 
Finagle - an intro to rpc & a sync programming in jvm
Finagle - an intro to rpc & a sync programming in jvmFinagle - an intro to rpc & a sync programming in jvm
Finagle - an intro to rpc & a sync programming in jvm
 
Make it fast for everyone - performance and middleware design
Make it fast for everyone - performance and middleware designMake it fast for everyone - performance and middleware design
Make it fast for everyone - performance and middleware design
 
Serialization and performance in Java
Serialization and performance in JavaSerialization and performance in Java
Serialization and performance in Java
 
Modern Distributed Messaging and RPC
Modern Distributed Messaging and RPCModern Distributed Messaging and RPC
Modern Distributed Messaging and RPC
 
High Performance RPC with Finagle
High Performance RPC with FinagleHigh Performance RPC with Finagle
High Performance RPC with Finagle
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System Development
 

Similar a Rpc原理与实现

Tcpcopy 阿里技术沙龙
Tcpcopy 阿里技术沙龙Tcpcopy 阿里技术沙龙
Tcpcopy 阿里技术沙龙drewz lin
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕ideawu
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研zijingyeshao
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 Renaun Erickson
 
Alibaba Service Framework Practice
Alibaba Service Framework  PracticeAlibaba Service Framework  Practice
Alibaba Service Framework PracticeShawn Qian
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的hnoutman
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
分享平台构建之旅
分享平台构建之旅分享平台构建之旅
分享平台构建之旅tblanlan
 
Static server介绍
Static server介绍Static server介绍
Static server介绍sun jamie
 
Hbase使用hadoop分析
Hbase使用hadoop分析Hbase使用hadoop分析
Hbase使用hadoop分析baggioss
 
纵览Loadrunner核心功能
纵览Loadrunner核心功能纵览Loadrunner核心功能
纵览Loadrunner核心功能beiyu95
 
Pm 04 华胜天成openstack实践汇报-20120808
Pm 04 华胜天成openstack实践汇报-20120808Pm 04 华胜天成openstack实践汇报-20120808
Pm 04 华胜天成openstack实践汇报-20120808OpenCity Community
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 

Similar a Rpc原理与实现 (20)

Tcpcopy 阿里技术沙龙
Tcpcopy 阿里技术沙龙Tcpcopy 阿里技术沙龙
Tcpcopy 阿里技术沙龙
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕
 
分布式索引系统调研
分布式索引系统调研分布式索引系统调研
分布式索引系统调研
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
Cdc@ganji.com
Cdc@ganji.comCdc@ganji.com
Cdc@ganji.com
 
Alibaba Service Framework Practice
Alibaba Service Framework  PracticeAlibaba Service Framework  Practice
Alibaba Service Framework Practice
 
基于Erlang的
基于Erlang的基于Erlang的
基于Erlang的
 
Thrift
ThriftThrift
Thrift
 
About Thrift
About ThriftAbout Thrift
About Thrift
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
分享平台构建之旅
分享平台构建之旅分享平台构建之旅
分享平台构建之旅
 
Micro service
Micro serviceMicro service
Micro service
 
Static server介绍
Static server介绍Static server介绍
Static server介绍
 
Hbase使用hadoop分析
Hbase使用hadoop分析Hbase使用hadoop分析
Hbase使用hadoop分析
 
纵览Loadrunner核心功能
纵览Loadrunner核心功能纵览Loadrunner核心功能
纵览Loadrunner核心功能
 
Pm 04 华胜天成openstack实践汇报-20120808
Pm 04 华胜天成openstack实践汇报-20120808Pm 04 华胜天成openstack实践汇报-20120808
Pm 04 华胜天成openstack实践汇报-20120808
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 

Más de wavefly

The comet technology on Jetty
The comet technology on Jetty The comet technology on Jetty
The comet technology on Jetty wavefly
 
Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析wavefly
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4jwavefly
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析wavefly
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析wavefly
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程wavefly
 

Más de wavefly (6)

The comet technology on Jetty
The comet technology on Jetty The comet technology on Jetty
The comet technology on Jetty
 
Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析Jetty(version 8)核心架构解析
Jetty(version 8)核心架构解析
 
Head first in xmemcached yanf4j
Head first in xmemcached yanf4jHead first in xmemcached yanf4j
Head first in xmemcached yanf4j
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
ClassLoader简析
ClassLoader简析ClassLoader简析
ClassLoader简析
 
Java并发核心编程
Java并发核心编程Java并发核心编程
Java并发核心编程
 

Rpc原理与实现