dotnetty java netty,Netty(DotNetty)原理解析

dotnetty java netty,Netty(DotNetty)原理解析一 背景介绍 DotNetty 是微软的 Azure 团队 使用 C 实现的 Netty 的版本发布 不但使用了 C 和 Net 平台的技术特点 并且保留了 Netty 原来绝大部分的编程接口 让我们在使用时 完全可以依照 Netty 官方的教程来学习和使用 DotNetty 应用程序 Netty 是一个异步事件驱动的网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 二 NIO 他并不是 Java 独有的概念 NI

一、背景介绍

DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。

Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。

二、NIO

他并不是 Java 独有的概念,NIO代表的一个词汇叫着IO多路复用。它是由操作系统提供的系统调用,早期这个操作系统调用的名字是select,但是性能低下,后来渐渐演化成了 Linux 下的epoll和Mac里的kqueue。我们一般就说是epoll,因为没有人拿苹果电脑作为服务器使用对外提供服务。而Netty就是基于Java NIO技术封装的一套框架。为什么要封装,因为原生的Java NIO使用起来没那么方便,而且还有臭名昭著的bug,Netty把它封装之后,提供了一个易于操作的使用模式和接口,用户使用起来也就便捷多了。

说NIO之前先说一下BIO(Blocking IO),如何理解这个Blocking呢?

48959b8e256456b9e5cf7cdbf1a8ca18.png

客户端监听(Listen)时,Accept是阻塞的,只有新连接来了,Accept才会返回,主线程才能继

读写socket时,Read是阻塞的,只有请求消息来了,Read才能返回,子线程才能继续处理

读写socket时,Write是阻塞的,只有客户端把消息收了,Write才能返回,子线程才能继续读取下一个请求

传统的BIO模式下,从头到尾的所有线程都是阻塞的,这些线程就干等着,占用系统的资源,什么事也不干。

Netty 的非阻塞 I/O 的实现关键是基于 I/O 复用模型,这里用 Selector 对象表示:

256b79d5a79e0c832bbafbd50b343dc7.png

Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector,可以同时并发处理成百上千个客户端连接。

当线程从某客户端 Socket 通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。

线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。

由于读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于频繁 I/O 阻塞导致的线程挂起。

一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

基于Buffer

传统的 I/O 是面向字节流或字符流的,以流式的方式顺序地从一个 Stream 中读取一个或多个字节, 因此也就不能随意改变读取指针的位置。

在 NIO 中,抛弃了传统的 I/O 流,而是引入了 Channel 和 Buffer 的概念。在 NIO 中,只能从 Channel 中读取数据到 Buffer 中或将数据从 Buffer 中写入到 Channel。

基于 Buffer 操作不像传统 IO 的顺序操作,NIO 中可以随意地读取任意位置的数据。

事件驱动模型

通常,我们设计一个事件处理模型的程序有两种思路:

1.轮询方式,线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑。

2.事件驱动方式,发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路。

事件机制,它可以用一个线程把Accept,读写操作,请求处理的逻辑全干了。如果什么事都没得做,它也不会死循环,它会将线程休眠起来,直到下一个事件来了再继续干活,这样的一个线程称之为NIO线程。用伪代码表示:

while true {

events = takeEvents(fds) // 获取事件,如果没有事件,线程就休眠

for event in events {

if event.isAcceptable {

doAccept() // 新链接来了

} elif event.isReadable {

request = doRead() // 读消息

if request.isComplete() {

doProcess()

}

} elif event.isWriteable {

doWrite() // 写消息

}

}

}复制代码

Reactor线程模型

Reactor单线程模型

一个NIO线程+一个accept线程:

b65c741e5805940bde12184761464197.png

Reactor多线程模型

4daca90ea2bb371205fdc90ea46da31f.png

Reactor主从模型

9e1316453a6e5c630ba10bef5ff75229.png

Netty可以基于如上三种模型进行灵活的配置。

总结

Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。

在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理。

Accept连接和读写操作也可以使用同一个线程池来进行处理。而请求处理逻辑既可以使用单独的线程池进行处理,也可以跟放在读写线程一块处理。线程池中的每一个线程都是NIO线程。用户可以根据实际情况进行组装,构造出满足系统需求的高性能并发模型。

DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用时,完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218171.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:53
下一篇 2026年3月18日 上午7:53


相关推荐

  • html页面透明度属性,css透明度是什么属性?

    html页面透明度属性,css透明度是什么属性?css 透明度属性指的是 opacity 属性 opacity 属性可以设置一个元素了透明度级别 下面本篇文章就来给大家介绍一下 CSSopacity 属性 有一定的参考价值 有需要的朋友可以参考一下 希望对大家有所帮助 cssopacity 属性用于设置一个元素了透明度级别 从 0 0 完全透明 到 1 0 完全不透明 通过该属性我们可以设置图片 文字 盒子模型等等的透明度 语法 opacity valu

    2026年3月17日
    2
  • maccms重定向次数过多

    maccms重定向次数过多如题问题 maccms 搭建好了 但是进入后台遇到重定向次数过多的问题 其实 maccms 官方已经给出了解决方案 如下 1 确认空间支持 rewrite 组件 2 按照伪静态 rewrite 目录下的说明文档操作 3 后台设置浏览模式为 rewrite 伪静态 如果使用 rewrite 伪静态模式 请注意把配置文件复制到网站根目录 如果静态文件后缀配置的不是 html 则请把 re

    2026年3月19日
    2
  • FileZilla出现Failed to convert command to 8 bit charset 

    FileZilla出现Failed to convert command to 8 bit charset 

    2021年9月24日
    55
  • 数据中台,什么是数据中台?

    数据中台,什么是数据中台?导读:数据中台被誉为大数据的下一站,由阿里兴起,核心思想是数据共享,并在2018年因为“腾讯数据中台论”再度成为了人们谈论的焦点。在3月15日ThoughtWorks技术雷达峰会上,关于数据中台的话题也获得了众多参会者的热烈关注。如今似乎人人都在提数据中台,但却不是所有人都清楚数据中台到底意味着什么。数据中台是只有大厂才需要考虑的高大上的概念吗?普通企业该不该做数据中台?数据中…

    2022年7月14日
    14
  • scp命令用法总结

    scp命令用法总结在 linux 环境下做本机的文件复制 可以使用 cp 命令进行操作 然而 本地服务器和远程服务器要做文件的传输复制时 cp 命令就显得心有余而力不足了 这时 就引出了一个新的命令 scp 在学习这个命令之后 感受到了这个命令的强大之处 下面就将 scp 命令的几种常用的用法总结一下 方便以后日后查阅 也为有需要的小伙伴提供一丝帮助 命令参数在服务器上键入 scphelp 输出 usage scp 12

    2025年10月16日
    5
  • 【微信小程序】滚动 轮播图 文本

    【微信小程序】滚动 轮播图 文本目录 小程序的宿主环境 组件 1 scroll view 组件的基本使用 2 swiper 和 swiper item 组件的基本使用 3 text 组件的基本使用 4 rich text 组件的基本使用 scroll y 改成 scroll x 实现如图的横向滚动效果 文本组件类似于 HTML 中的 span 标签 是一个行内元素通过 text 组件的 selectable 属性 实现长按选中文本内容的效果

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号