Java学习总结(2.2.1) Netty线程模型

精贴 置顶
1984 0
作者:      发布时间: 2020-04-20 09:35:49

Netty简介

Netty是一个高性能、高可扩展性的异步事作驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。


Netty重要的四个内容:

1) Reactor线程模型:一种高性能的多线程程序设计思路

2) Netty中自己定义的 Channel概念:増强版的通道概念

3) Channelpipelinek职责链设计模式:事件处理机制

4)内存管理:增强的Bytebuff缓冲区



Netty整体结构图

图片来自官网,可以看出包含三大块

1、支持 Socket等多种传输方式;

2、提供了多种协议的编解码实现

3、核心设计包含事件处理模型、API的使用、 Bytebuffere的增强



为了让NIO处理更好的利用多线程特性,Nett实现了 Reactor线程模型。

Reactor模型中有四个核心概念:

1) Resources资源(请求/任务)

2) Synchronous Event Demultiplexer 同步事件复用器

3) Dispatcher分配器

4) Request Handler 请求处理器



EvnetLoopGroup 初始化过程

构造函数 -> 

 -> 确定线程数量:默认cpus*2

 -> new Executor:构建线程执行器

 -> for-newChild():构建 EventLoop

 -> new EventExecutorChooser


两组 Eventloopgroup(Main&Sub)处理不同通道不同的事件


EventLoop的启动

EventLoop自身实现了 Executor接口,当调用 executor方法提交任务时,则判断是否启动,未启动则调用内置的 executor创建新线程来触发run方法执行。


executor:请求执行任务

 -> addTadk:增加到任务队列

 -> 判断是否是EventLoop自身调用

 -> startThread->doStartThread

 -> 使用executor创建新线程执行run




Bind绑定端口过程




Channel概念

netty中的 Channell是一个抽象的概念,可以理解为对 JDK NIO Channel的增强和拓展。

增加了很多属性和方法,完整信息可以看代码注释,下面罗列几个常见的属性和方法

AbstractChannel

pipeline Defaultchannelpipeline    //通道内事件处理链路

eventloop Eventloop    //绑定的 Eventloop,用于执行操作

unsafe Unsafe    //提供I/O相关操作的封装

...

# config() ChannelConfig  //返回通道配置信息

+read() Channel  //开始读数据,触发读取链路调用

+write(Object msg) Channelfuture  //写数据,触发链路调用

+bind(SocketAddressSocketAddress) Channelfuture  //绑定

...




小结

毕竟抽象的设计模式,在学习过程中会有难懂的地方,所以着重需要结合代码理解。

此章节的目的有两个:领会 Reactor的理念、掌握代码示例中具体的写法。



Reactor多线程模式的设计,是Netty高性能很重要的一个原因!




标签:

每日一句

如果你能每天呐喊二十一遍「我用不着为这一点小事而烦恼」,你会发现,你心里有一种不可思议的力量。

标签云

vue
最近综合
情绪巨婴是什么 12.18
普通蛋糕做法 05.31
玉米烤肠芝士面包做法 05.31
Mysql安装教程 - 绿色版 06.18
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
Typora开发版⽆法使⽤解决⽅法 05.04
为什么无知者越自信? -- 达克效应 05.10
马斯洛需求层次理论 04.29
随机综合
Java学习总结(1.3.3) 并发容器类2 04.09
开发者能力金字塔 04.29
Java学习总结(1.1.7) 线程池应用 03.19
[vue]VUE的一些问题和解决 08.05
玉米烤肠芝士面包做法 05.31
eclipse 快捷键大全_最有用快捷键整理 08.18
中间件1.2.4-ActiveMQ持久化原理和事务机制 04.29
mysql查询优化 11.13