版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77450134

注:本文是为了配合《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内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:

纸质版售卖链接如下:
京东:https://item.jd.com/12302500.html

电子版售卖链接如下:
京东:https://e.jd.com/30389208.html

附录G Netty与NettyUtils相关推荐

  1. 《Netty权威指南》

    <Netty权威指南> 基本信息 作者: 李林锋 出版社:电子工业出版社 ISBN:9787121233432 上架时间:2014-5-29 出版日期:2014 年6月 开本:16开 页码 ...

  2. [201504][Netty 权威指南][第2版][李林锋][著]

    [201504][Netty 权威指南][第2版][李林锋][著] https://github.com/wuyinxian124/nettybook2 基础篇 走进 Java NIO 第 1 章 J ...

  3. Spark内核设计的艺术:架构设计与实现——前言

    前言 为什么写这本书 给这本书写前言,让我想起了两年前给<深入理解Spark:核心思想与源码分析>一书写前言的经历.这让我不禁想起崔护的<题都城南庄>,诗的内容是: 去年今日此 ...

  4. 深入理解Spark:核心思想与源码分析

    大数据技术丛书 深入理解Spark:核心思想与源码分析 耿嘉安 著 图书在版编目(CIP)数据 深入理解Spark:核心思想与源码分析/耿嘉安著. -北京:机械工业出版社,2015.12 (大数据技术 ...

  5. Spark2.1.0之内置RPC框架

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/80799622 在Spark中很多地方都涉及网络通 ...

  6. http 权威指南 目录

    第一部分 HTTP:Web的基础 第1章 HTTP概述 1.1 HTTP--因特网的多媒体信使 1.2 Web客户端和服务器 1.3 资源 1.3.1 媒体类型 1.3.2 URI 1.3.3 URL ...

  7. GIS中的坐标系定义与转换

    GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...

  8. (初学必看)deep graph library(dgl)库的入门引导

    文章目录 前言 简单? 内置数据集 定义模型 定义dgl中的一个图 附录 前言 下载这个库要去官方网站:https://www.dgl.ai/,网站上会给你下载命令,这有点像下载pytorch的时候. ...

  9. 《R语言实战》读书笔记--第一章 R语言介绍

    1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...

最新文章

  1. xwpftemplate的时间设置_java poi设置生成的word的图片为上下型环绕以及其位置
  2. PLSQL 的 for循环的小例子
  3. android自动更新列表,Android数据库表结构自动升级
  4. mac 安装node_node 服务端部署
  5. 开始使用gradle(二)
  6. 利用 livy 远程提交 spark作业
  7. MFC程序在其他机器运行
  8. 爬虫-爬取博客的演练-首页内容保存-首页文章列表与url
  9. vue3 el-form表单验证 自定义校验
  10. 删除列表重复元素 python_在Python中删除列表列表中的重复元素
  11. Mac之初~10个快速上手技巧
  12. ASP.NET程序中 抛出Thread was being aborted. 异常(转)
  13. 对数—行列式函数的分析
  14. MFC控件之cimagelist,加载不上位图
  15. raid服务器怎么装win7系统安装,安装win7系统时怎么加载SATARAID驱动
  16. 【帝国CMS】灵动标签循环调用广告
  17. 作用python需要语言编写小游戏_作的解释|作的意思|汉典“作”字的基本解释
  18. 小白学习性能随笔记1
  19. 玩转Qml(12)-再谈动态国际化
  20. 在linux上安装navicat 出现使用一段时间后闪退的情况

热门文章

  1. 【FFmpeg】AVPacket的使用详解
  2. arduino跑python,尝试在我的Arduino和stu上执行Python3.7.2中的代码
  3. python参考文献目录_[zotero/python]库中参考文献条目删除后,清除残留PDF的脚本
  4. 批量修改数据映射_Docker 数据卷操作「Docker 系列-6」
  5. python如何调用文件_如何调用另一个python文件中的代码
  6. Java学习总结:43(转换流)
  7. ajax默认超时时间多久,请问chrome浏览器的默认超时时间是多久?
  8. mysql 函数返回表格_mysql 数据分析如何实现日报、周报、月报和年报?
  9. 【HTML】兴唐二十八节课之常用标签(不定期更新)
  10. java后台分页插件怎么写_Java分页技术(从后台传json到前台解析显示)