附录G Netty与NettyUtils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录G的内容都在本文呈现。
Netty是一个NIO客户端服务器框架,使得开发高性能、高可靠性的网络服务器和客户端程序变得快速且容易。它极大地简化
化了网络编程,如TCP和UDP套接字服务器。
“快速和容易”并不意味着应用程序会有难维护和性能低的问题。Netty是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验,比如FTP, SMTP, HTTP和多种多样的二进制和基于文本的传统协议。因此Netty在不降低开发效率、性能、稳定性、灵活性情况下,已经成功地找到了解决方法。
NettyUtils是Spark对Netty API的封装,在这里对其中的主要方法进行说明。有关Netty的更多内容请访问Netty官网http://netty.io/。
createThreadFactory
功能描述:创建线程工厂,此工厂生成的线程都使用给定的前缀名threadPoolPrefix + "-" +数字的格式命名。
public static ThreadFactory createThreadFactory(String threadPoolPrefix) {return new DefaultThreadFactory(threadPoolPrefix, true);}
createEventLoop
功能描述:根据参数IOMode,创建Netty的EventLoopGroup。
public static EventLoopGroup createEventLoop(IOMode mode, int numThreads, String threadPrefix) {ThreadFactory threadFactory = createThreadFactory(threadPrefix);switch (mode) {case NIO:return new NioEventLoopGroup(numThreads, threadFactory);case EPOLL:return new EpollEventLoopGroup(numThreads, threadFactory);default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
getClientChannelClass
功能描述:根据参数IOMode,返回正确的客户端SocketChannel。
public static Class<? extends Channel> getClientChannelClass(IOMode mode) {switch (mode) {case NIO:return NioSocketChannel.class;case EPOLL:return EpollSocketChannel.class;default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
getServerChannelClass
功能描述:根据参数IOMode,返回正确的服务端SocketChannel。
public static Class<? extends ServerChannel> getServerChannelClass(IOMode mode) {switch (mode) {case NIO:return NioServerSocketChannel.class;case EPOLL:return EpollServerSocketChannel.class;default:throw new IllegalArgumentException("Unknown io mode: " + mode);}}
createFrameDecoder
功能描述:创建一个LengthFieldBasedFrameDecoder。LengthFieldBasedFrameDecoder的5个参数分别代表frame的最大长度、长度字段的偏移量、长度字段的字节数、需要排除的长度字段的字节数、长度字段的初始长度。所以创建的LengthFieldBasedFrameDecoder的前8个字节代表frame的长度。LengthFieldBasedFrameDecoder通常会被设置到SocketChannel的管道中,在所有Decoder被调用之前调用。
public static TransportFrameDecoder createFrameDecoder() {return new TransportFrameDecoder();}
getRemoteAddress
功能描述:返回Channel的远端地址。
public static String getRemoteAddress(Channel channel) {if (channel != null && channel.remoteAddress() != null) {return channel.remoteAddress().toString();}return "<unknown remote>";}
createPooledByteBufAllocator
功能描述:创建一个汇集ByteBuf但对本地线程缓存禁用的分配器。为什么要对本地线程缓存禁用?因为ByteBuf都是由事件循环线程分配,所以线程本地缓存对于TransportClient是禁用的。但是ByteBuf的释放却是由Executor线程,而不是事件循环线程来完成。本地线程缓存经常会延迟ByteBuf的回收,导致巨大的内存消耗。
public static PooledByteBufAllocator createPooledByteBufAllocator(boolean allowDirectBufs,boolean allowCache,int numCores) {if (numCores == 0) {numCores = Runtime.getRuntime().availableProcessors();}return new PooledByteBufAllocator(allowDirectBufs && PlatformDependent.directBufferPreferred(),Math.min(getPrivateStaticField("DEFAULT_NUM_HEAP_ARENA"), numCores),Math.min(getPrivateStaticField("DEFAULT_NUM_DIRECT_ARENA"), allowDirectBufs ? numCores : 0),getPrivateStaticField("DEFAULT_PAGE_SIZE"),getPrivateStaticField("DEFAULT_MAX_ORDER"),allowCache ? getPrivateStaticField("DEFAULT_TINY_CACHE_SIZE") : 0,allowCache ? getPrivateStaticField("DEFAULT_SMALL_CACHE_SIZE") : 0,allowCache ? getPrivateStaticField("DEFAULT_NORMAL_CACHE_SIZE") : 0);}
getPrivateStaticField
功能描述:用于获得Netty的静态属性值。
private static int getPrivateStaticField(String name) {try {Field f = PooledByteBufAllocator.DEFAULT.getClass().getDeclaredField(name);f.setAccessible(true);return f.getInt(null);} catch (Exception e) {throw new RuntimeException(e);}}
关于《Spark内核设计的艺术 架构设计与实现》
经过近一年的准备,《Spark内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:
附录G Netty与NettyUtils相关推荐
- 《Netty权威指南》
<Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码 ...
- [201504][Netty 权威指南][第2版][李林锋][著]
[201504][Netty 权威指南][第2版][李林锋][著] https://github.com/wuyinxian124/nettybook2 基础篇 走进 Java NIO 第 1 章 J ...
- Spark内核设计的艺术:架构设计与实现——前言
前言 为什么写这本书 给这本书写前言,让我想起了两年前给<深入理解Spark:核心思想与源码分析>一书写前言的经历.这让我不禁想起崔护的<题都城南庄>,诗的内容是: 去年今日此 ...
- 深入理解Spark:核心思想与源码分析
大数据技术丛书 深入理解Spark:核心思想与源码分析 耿嘉安 著 图书在版编目(CIP)数据 深入理解Spark:核心思想与源码分析/耿嘉安著. -北京:机械工业出版社,2015.12 (大数据技术 ...
- Spark2.1.0之内置RPC框架
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/80799622 在Spark中很多地方都涉及网络通 ...
- http 权威指南 目录
第一部分 HTTP:Web的基础 第1章 HTTP概述 1.1 HTTP--因特网的多媒体信使 1.2 Web客户端和服务器 1.3 资源 1.3.1 媒体类型 1.3.2 URI 1.3.3 URL ...
- GIS中的坐标系定义与转换
GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...
- (初学必看)deep graph library(dgl)库的入门引导
文章目录 前言 简单? 内置数据集 定义模型 定义dgl中的一个图 附录 前言 下载这个库要去官方网站:https://www.dgl.ai/,网站上会给你下载命令,这有点像下载pytorch的时候. ...
- 《R语言实战》读书笔记--第一章 R语言介绍
1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...
最新文章
- xwpftemplate的时间设置_java poi设置生成的word的图片为上下型环绕以及其位置
- PLSQL 的 for循环的小例子
- android自动更新列表,Android数据库表结构自动升级
- mac 安装node_node 服务端部署
- 开始使用gradle(二)
- 利用 livy 远程提交 spark作业
- MFC程序在其他机器运行
- 爬虫-爬取博客的演练-首页内容保存-首页文章列表与url
- vue3 el-form表单验证 自定义校验
- 删除列表重复元素 python_在Python中删除列表列表中的重复元素
- Mac之初~10个快速上手技巧
- ASP.NET程序中 抛出Thread was being aborted. 异常(转)
- 对数—行列式函数的分析
- MFC控件之cimagelist,加载不上位图
- raid服务器怎么装win7系统安装,安装win7系统时怎么加载SATARAID驱动
- 【帝国CMS】灵动标签循环调用广告
- 作用python需要语言编写小游戏_作的解释|作的意思|汉典“作”字的基本解释
- 小白学习性能随笔记1
- 玩转Qml(12)-再谈动态国际化
- 在linux上安装navicat 出现使用一段时间后闪退的情况
热门文章
- 【FFmpeg】AVPacket的使用详解
- arduino跑python,尝试在我的Arduino和stu上执行Python3.7.2中的代码
- python参考文献目录_[zotero/python]库中参考文献条目删除后,清除残留PDF的脚本
- 批量修改数据映射_Docker 数据卷操作「Docker 系列-6」
- python如何调用文件_如何调用另一个python文件中的代码
- Java学习总结:43(转换流)
- ajax默认超时时间多久,请问chrome浏览器的默认超时时间是多久?
- mysql 函数返回表格_mysql 数据分析如何实现日报、周报、月报和年报?
- 【HTML】兴唐二十八节课之常用标签(不定期更新)
- java后台分页插件怎么写_Java分页技术(从后台传json到前台解析显示)