第 2 天 轻量级 RPC 框架开发
今天内容安排:
1、掌握 RPC 原理
2、掌握 nio 操作
3、掌握 netty 简单的 api
4、掌握自定义 RPC 框架
1. RPC 原理学习
1.1. 什么是 RPC
RPC (Remote Procedure Call Protocol) ——远程过程调用协议,它是一种通过网络从远 程计算机程序上请求服务, 而不需要了解底层网络技术的协议。 RPC 协议假定某些传输协议 的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中, RPC 跨越 了传输层和应用层。 RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服 务器。 首先, 客户机调用进程发送一个有进程参数的调用信息到服务进程, 然后等待应答信 息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器 获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息, 最后,客户端调用进 程接收答复信息, 获得进程结果,然后调用执行继续进行。
见代码
1.2. RPC 原理
运行时,一次客户机对服务器的 RPC 调用,其内部操作大致有如下十步:
1.调用客户端句柄;执行传送参数
2.调用本地系统内核发送网络消息
3.消息传送到远程主机
4.服务器句柄得到消息并取得参数
5.执行远程过程
6.执行的过程将结果返回服务器句柄
7.服务器句柄返回结果,调用远程系统内核
8.消息传回本地主机
9.客户句柄由内核接收消息
10.客户接收句柄返回的数据
1.3. hadoopRPC 演示
2. nio 原理学习
2.1. 简介
nio 是 New IO 的简称,在 jdk1.4 里提供的新 api 。Sun 官方标榜的特性如下: 为所 有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。 Channel :一个新的原始 I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高 伸缩性网络 I/O 。
2.2. 传统 socket 和 socket nio 代码
见代码
2.3. socket nio 原理
2.3.1. 传统的 I/O
使用传统的 I/O 程序读取文件内容, 并写入到另一个文件(或 Socket), 如下程序: File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);
会有较大的性能开销, 主要表现在一下两方面:
1. 上下文切换(contextswitch), 此处有 4 次用户态和内核态的切换
2. Buffer 内存开销, 一个是应用程序 buffer, 另一个是系统读取 buffer 以及 socket buffer 其运行示意图如下
1) 先将文件内容从磁盘中拷贝到操作系统 buffer
2) 再从操作系统 buffer 拷贝到程序应用 buffer
3) 从程序 buffer 拷贝到 socket buffer
4) 从 socket buffer 拷贝到协议引擎.
2.3.2. NIO
NIO 技术省去了将操作系统的 read buffer 拷贝到程序的 buffer, 以及从程序 buffer 拷贝到 socket buffer 的 步 骤 , 直 接 将 read buffer 拷 贝 到 socket buffer. java 的 FileChannel.transferTo() 方法就是这样的实现, 这个实现是依赖于操作系统底层的 sendFile() 实现的.
publicvoid transferTo(long position, long count, WritableByteChannel target);
他的底层调用的是系统调用 sendFile()方法
sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
如下图
3. netty 常用 API 学习
3.1. netty 简介
Netty 是基于 Java NIO 的网络应用框架.
Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty 可以快速开发网络应用, 例如服务器和客户端协议。 Netty 提供了一种新的方式来使开发网络应用程序,这种新的方 式使得它很容易使用和有很强的扩展性。 Netty 的内部实现时很复杂的,但是 Netty 提
您可能关注的文档
- 01_python_(python语言_数据类型详解).docx
- 02-机器学习_第2天(贝叶斯分类算法与应用).docx
- 01_流式计算基础_第1天(Storm是什么、Storm核心组件、Storm编程模型).docx
- 03-机器学习_(贝叶斯分类算法与应用).docx
- 03-机器学习_第3天(决策树分类算法与应用).docx
- 03_基础增强_第3天(高可用web架构)_讲义.docx
- 04_基础增强_第4天(java高级特性增强)_讲义.docx
- 03_流式计算基础_第1天(Kafka集群安装部署、Kafka生产者、Kafka消费者).docx
- 05_流式计算基础_第2天(Storm目录树、任务提交、消息容错).docx
- 06_流式计算基础_第2天(Kafka负载均衡、Kafka自定义Partition、Kafk文件存储机制).docx
原创力文档

文档评论(0)