当前位置: 首页 > news >正文

Netty 4.1 源代码学习:线程模型

前言

本文以 netty 4.1 自带的示例工程 netty-example 为例,简要介绍 netty 线程模型

EchoServer

echo server 示例工程的代码位于 example/src/main/java/io.netty.example/echo

  • EchoClient

  • EchoClientHandler

  • EchoServer

  • EchoServerHandler

EchoServer 很简单,仅包含一个 main 方法用于初始化 netty server 以及 handler,我们来看看其中和线程模型 相关的一些代码

// EchoServer.java

public static void main(String[] args) throws Exception {
    ...
    // Configure the server
    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    try {
        ServerBootstrap b = new ServerBootstrap();
        b.group(bossGroup, workerGroup)
          .channel(NioServerSocketChannel.class)
          ...
    } finally {
        ...
    }
}

EventLoop & EventLoopGroup

在 EchoServer 的初始化代码中实例化了两个对象 bossGroup 和 workerGroup,它们有着公共基类 EventLoopGroup,这个 EventLoopGroup 是 netty 线程模型的核心

EventLoopGroup 类名让人联想到 "组合模式",所以肯定有个 EventLoop 类,EventLoopGroup 包含一个或多个 EventLoop

变量名 bossGroup 和 workerGroup 让人联想到 "生产者消费者" 模型,即由 bossGroup 产生消息(事件),然后交给 workerGroup 消费。此外我们注意到 bossGroup 和 workerGroup 使用了不同的构造方法,bossGroup 指定了线程个数 1,workerGroup 则没有,为了发挥硬件性能,一般会根据服务器 CPU 核心个数来设定 "工作者" 线程个数,我们跟踪空构造函数,最终会在父类 MultithreadEventExecutorGroup 中找到当未指定线程个数时(nThreads)netty 会根据 系统属性 io.netty.eventLoopThreads 和 CPU 核心数来确定合适的值

// MultithreadEventLoopGroup.java

public abstract class MultithreadEventLoopGroup extends   
    MultithreadEventExecutorGroup implements EventLoopGroup {


    private static final int DEFAULT_EVENT_LOOP_THREADS;

    static {
        DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
                "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2));

        if (logger.isDebugEnabled()) {
            logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
        }
    }

    protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {
        super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);
    }
    ...
}

Channel & EventLoop

上文提到 netty 通常使用两个 EventLoopGroup,一个用于生产一个用于消费,那么这两个 EventLoopGroup 是怎么相互通信(耦合)的呢?

总结

  • netty 使用 EventLoopGroup 类封装线程池

  • netty 通常使用两个EventLoopGroup,boss group 和 worker group

  • boss group 用于网络 IO,包括接收客户端连接,读写 socket 等,boss group 通常使用基于 NIO 的事件循环

  • worker group 用于处理 boss group 读取的数据,或者说通常包含应用自身的业务逻辑

相关文章:

  • Scott Mitchell 的ASP.NET 2.0数据教程之二十五:: 大数据量时提高分页的效率
  • ehcache memcache redis 三大缓存对比
  • JDBC连接数据库经验集萃
  • 关于MySQL字符集问题:Specified key was too long; max key length is 767 bytes
  • Screen - BOM对象
  • Vista数据备份恢复
  • Hibernate : Query.list()、Query.iterator()的区别
  • MobX
  • ADO.NET 2.0 - 如何查看 DataView 的内容
  • 蓝牙进阶之路 (002) - HC-05与HC-06的AT指令的区别(转)
  • NQL.NET 数据库对象查询语言简介 2
  • [转]nf_conntrack: table full, dropping packet 连接跟踪表已满,开始丢包 的解决办法
  • js学习笔记
  • eclipse tomcat lomboz的安装配置说明
  • 微服务运行指南——For Cattle
  • 345-反转字符串中的元音字母
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Bootstrap JS插件Alert源码分析
  • CAP理论的例子讲解
  • Java小白进阶笔记(3)-初级面向对象
  • JS题目及答案整理
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Node + FFmpeg 实现Canvas动画导出视频
  • nodejs实现webservice问题总结
  • Phpstorm怎样批量删除空行?
  • Sass Day-01
  • Spring核心 Bean的高级装配
  • 服务器从安装到部署全过程(二)
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 通信类
  • 小程序button引导用户授权
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • Mac 上flink的安装与启动
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (转)3D模板阴影原理
  • (转)视频码率,帧率和分辨率的联系与区别
  • **python多态
  • .NET DataGridView数据绑定说明
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net程序集学习心得
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Service注解让spring找到你的Service bean
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [14]内置对象
  • [hdu1561] The more, The Better 【树形DP】
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [iOS]让Xcode 4.2生成的app支持老的iOS设备(armv6)
  • [leetcode]Clone Graph