概述

最近在学习netty的相关知识,也在看netty的源码,光看不练假把式,所以也正好利用自己学习的机会写几篇netty的分析文章,主要还是一些源码解析的文章,一方面有输出会促使自己在看源码,学习原理的过程中更系统,更深入,同时也能加强记忆,巩固对知识的理解。

关于netty的简介和应用我就不做介绍了,在网络上都能搜索到相关的资料。

netty是一个性能非常优秀的网络框架,采用reactor模式,使用非常高效的基于事件驱动的io线程模型,即经典的多路复用的io模式。关于io线程模型其实又是一个很大的话题,涉及到操作系统的底层原理,后面有时间我也打算深入学习一下这方面的知识,并写一些相关的分析文章。

我的整体思路是这样的:首先,以netty提供给用户的常用的接口为切入点,一步步地深入netty内核进行分析,因为netty的模块众多,而且某一个层级往往有很多种平级的模块,这些不同的模块一般代表了不同的实现机制或不同的功能,如根据多路复用系统调用的不同就分为EpollEventLoop,NioEventloop,KQueueEventLoop等;根据不同的应用层协议把编解码器分为不同种类,如http,smtp, http2, xml等等。所以,我们只需要分析其中的一套,其他类型的在实际用到时在深入了解,这样既能整体上掌握框架,也能深入实现的细节。

netty应用示例

之前对spark-core的源码进行过一些讲解,分析了spark-core中的大部分模块,但是其中有一个很重要的模块却没有分析,那就是spark的rpc模块,spark的rpc模块是基于netty实现的,也是对netty的一个很典型的应用,所以这里我还是以spark中的rpc模块为示例,切入netty的源码分析。

 // 初始化netty服务端
private void init(String hostToBind, int portToBind) { // io模式,有两种选项NIO, EPOLL
IOMode ioMode = IOMode.valueOf(conf.ioMode());
// 创建bossGroup和workerGroup,即主线程组合子线程组
EventLoopGroup bossGroup =
NettyUtils.createEventLoop(ioMode, conf.serverThreads(), conf.getModuleName() + "-server");
EventLoopGroup workerGroup = bossGroup; // 缓冲分配器,分为堆内存和直接内存
PooledByteBufAllocator allocator = NettyUtils.createPooledByteBufAllocator(
conf.preferDirectBufs(), true /* allowCache */, conf.serverThreads()); // 创建一个netty服务端引导对象,并设置相关参数
bootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NettyUtils.getServerChannelClass(ioMode))
.option(ChannelOption.ALLOCATOR, allocator)
.childOption(ChannelOption.ALLOCATOR, allocator); // 内存使用的度量对象
this.metrics = new NettyMemoryMetrics(
allocator, conf.getModuleName() + "-server", conf); // 排队的连接数
if (conf.backLog() > 0) {
bootstrap.option(ChannelOption.SO_BACKLOG, conf.backLog());
} // socket接收缓冲区大小
if (conf.receiveBuf() > 0) {
bootstrap.childOption(ChannelOption.SO_RCVBUF, conf.receiveBuf());
} // socket发送缓冲区大小
if (conf.sendBuf() > 0) {
bootstrap.childOption(ChannelOption.SO_SNDBUF, conf.sendBuf());
} // 子channel处理器
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
RpcHandler rpcHandler = appRpcHandler;
for (TransportServerBootstrap bootstrap : bootstraps) {
rpcHandler = bootstrap.doBootstrap(ch, rpcHandler);
}
context.initializePipeline(ch, rpcHandler);
}
}); InetSocketAddress address = hostToBind == null ?
new InetSocketAddress(portToBind): new InetSocketAddress(hostToBind, portToBind);
// 绑定到ip地址和端口
channelFuture = bootstrap.bind(address);
// 同步等待绑定成功
channelFuture.syncUninterruptibly(); port = ((InetSocketAddress) channelFuture.channel().localAddress()).getPort();
logger.debug("Shuffle server started on port: {}", port);
}

netty使用一个引导对象ServerBootstrap来引导服务端的启动,最后的bootstrap.bind(address)实际出发了一系列的初始化机制。

总结

本节,我主要是开了一个头,以spark中rpc服务端的初始化为例子切入netty的源码。

netty框架概述的更多相关文章

  1. 1.Spring 框架概述

    目录 Spring 框架概述 1 我们所说的 "Spring "是什么意思 2. Spring和Spring框架的历史 3. 设计理念 4.反馈和贡献 5.开始使用 Spring ...

  2. netty系列之:netty架构概述

    目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和 ...

  3. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  4. Android Netty框架的使用

    Netty框架的使用 1 TCP开发范例 发送地址---192.168.31.241 发送端口号---9223 发送数据 { "userid":"mm910@mbk.co ...

  5. ThinkPHP框架概述

    框架概述 1.什么是框架 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统. 2.框架的应用场景 ① 代码重用 ② 合理分工 ③ 解决团队协作开发问题 3. ...

  6. iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明

    iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业 ...

  7. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  8. struts2框架概述

    框架概述 什么是框架,为什么使用框架,框架优点 框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题 框架,即framework.其实就是某种应用的半成品,就是一组组件,供你 ...

  9. 芝麻软件: Python爬虫进阶之爬虫框架概述

    综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优 ...

随机推荐

  1. LOJ 3184: 「CEOI2018」斐波那契表示法

    题目传送门:LOJ #3184. 题意简述: 题目说得很清楚了. 题解: 首先需要了解「斐波那契数系」为何物. 按照题目中定义的斐波那契数列 \(F_n\),可以证明,每个非负整数 \(n\) 都能够 ...

  2. git stash 命令

    摘自: http://blog.csdn.net/longxiaowu/article/details/26815433 关于git stash命令的使用方法网上一大把,我想记录的是我在使用过程中觉得 ...

  3. SQL-on-Hadoop 技术

    SQL-on-Hadoop 技术 备注 Apache Hive Cloudera Impala Facebook Presto Apache Drill Spark SQL Apache Phoeni ...

  4. 基于 webdriver 的测试代码日常调试方python 篇

    看到论坛有人写了JAVA的测试代码日常设计,就给大家分享一下偶自己平时是如何测试测试代码的.主要基于python语言.基于 webdriver 的日常调试在 python交互模式下非常方便,打开pyt ...

  5. day14_7.16 模块

    一.模块 1.什么是模块? 模块就是一系列功能的结合体. 模块的三种来源: 1.内置的,也就是python解释器自带的,可以直接导入 2.第三方的,需要下载的 3.自定义的,自己写的模块 模块的四种表 ...

  6. 11-numpy笔记-莫烦基础操作1

    代码 import numpy as np array = np.array([[1,2,5],[3,4,6]]) print('-1-') print('数组维度', array.ndim) pri ...

  7. 莫烦RL-01小例子

    # Python 3.6.5 :: Anaconda, Inc. import numpy as np import pandas as pd import time np.random.seed(2 ...

  8. 批处理命令 call

    call 命令 CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理 CALL command 调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有 ...

  9. 【oracle】substr函数 字符截取

  10. testcontainers 基本使用

    以下是一个简单的基于testcontainers 的测试(基于java 项目) 预备环境 因为testcontainers 基于docker 运行,所以需要安装docker 引擎 项目准备 项目结构 ...