1.Netty概述

原生NIO存在的问题(Netty要解决的问题)

  1. 虽然JAVA NIO 和 JAVA AIO框架提供了多路复用IO/异步IO的支持,但是并没有提供给上层“信息格式”的良好封装。JAVA NIO 的 API 使用麻烦,需要熟练掌握 ByteBufferChannelSelector等 , 所以用这些API实现一款真正的网络应用则并非易事
  2. JAVA NIO 和 JAVA AIO并没有提供断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流等的处理,这些都需要开发者自己来补齐相关的工作。
  3. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU100%。直到 JDK1.7 版本该问题仍旧存在,没有被根本解决。
  4. AIO在实践中,并没有比NIO更好。AIO在不同的平台有不同的实现,windows系统下使用的是一种异步IO技术:IOCP;Linux下由于没有这种异步 IO 技术,所以使用的是epoll 对异步 IO 进行模拟。所以 AIO 在 Linux 下的性能并不理想。AIO 也没有提供对 UDP 的支持。
  5. 综上,在实际的大型互联网项目中,Java 原生的 API 应用并不广泛,取而代之的是一款第三方Java 框架,这就是Netty

Netty的作者

Netty创始人Trustin Lee

  1. Netty的创始人是韩国人Trustin Lee,80年出生,8岁起在MSX迷你计算机上编写BASIC程序,爱好游戏编程以及使用汇编、C和C++解决编程问题,1998年获得韩国信息奥林匹克竞赛铜牌。

  2. 就读于韩国Yonsei大学计算机系期间,曾为多家公司编写高性能网络应用以及少量的web程序,毕业后,就职于Arreo通讯公司,该公司为韩国最大的移动短信提供商之一。

  3. 他还是另一个著名网络应用框架 Mina 的重要贡献者

image.png
image.png
4. Trustin Lee大神的博客和github

他的个人博客:https://t.motd.kr/
他的Github:https://github.com/trustin

Netty另外一个Leader

  1. Netty项目另外一个leader是德国人Norman Maurer(之前在Redhat,全职开发Netty),也是《Netty in Action》的作者,目前是苹果公司高级工程师。

image.png

  1. Norman maurer大神的博客和github

他的个人博客:http://normanmaurer.me/
他的Github:https://github.com/normanmaurer

Netty的基本介绍

Netty官方网址:https://netty.io/
Netty的api地址:https://netty.io/4.1/api/index.html
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端

image.png

Netty is an NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.
Netty是一个基于NIO的客户端-服务器框架,可以快速轻松地开发网络应用程序,如基于协议服务器和客户端应用程序。它极大地简化和优化了网络编程,如TCP和UDP套接字服务器程序的开发。

‘Quick and easy’ doesn’t mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.
“快速简单”并不意味着生成的应用程序会受到可维护性或性能问题的影响。Netty经过精心设计,从实现许多协议(如FTP、SMTP、HTTP)以及各种二进制和基于文本的遗留协议中获得了经验。因此,Netty成功地找到了一种在不妥协的情况下实现易于开发、性能、稳定性和灵活性的方法。

Features
Design
Unified API for various transport types - blocking and non-blocking socket
为各种网络传输模型,提供统一的api , 比如:阻塞 和 非阻塞的套接字传输模型
Based on a flexible and extensible event model which allows clear separation of concerns
基于灵活和可扩展的事件模型 , 可以清楚的分离关注点(指事件触发的关注点)
Highly customizable thread model - single thread, one or more thread pools such as SEDA
高度的可定制化线程模型 , 支持单线程 , 多线程 比如 SEDA 模型
True connectionless datagram socket support (since 3.1)
对于无连接的数据报套接字udp确实是从 3.1 开始的

Ease of use
Well-documented Javadoc, user guide and examples
No additional dependencies, JDK 5 (Netty 3.x) or 6 (Netty 4.x) is enough
Note: Some components such as HTTP/2 might have more requirements. Please refer to the Requirements page for more information.
丰富的文档javadoc , 用户指南和示例
没有额外的依赖 , JDK 5(Netty 3.x)或6(Netty 4.x)就足够了
注意:有些组件(如HTTP/2)可能有更多的要求。有关详细信息,请参阅“要求”页面。

Performance
Better throughput, lower latency
Less resource consumption
Minimized unnecessary memory copy
更好的吞吐量 , 低延迟
减少资源消耗
最小化不必要的内存复制

Security
Complete SSL/TLS and StartTLS support
完全支持 SSL/TLS 和 StartTLS

Community
Release early, release often
The author has been writing similar frameworks since 2003 and he still finds your feed back precious!
提前发布 , 常发布
作者自2003年以来一直在写类似的框架,他仍然觉得你的反馈很珍贵!

image.png
从上述的架构图可以看出,Netty 主要由三大块组成:

  • 核心组件

    • 核心组件包括:零拷贝和字节缓冲区 , 通用的通信API , 可扩展的事件模型

      • 零拷贝和字节缓冲区
        Netty 使用了区别于Java ByteBuffer 的新的缓冲类型ByteBuf,ByteBuf提供了丰富的特性 , 并提供内存映射 和 零拷贝机制
      • 通用的通信API
        Netty 的通信API都被抽象到Channel里,以统一的异步I/O编程接口来满足所有点对点的通信操作。
      • 可扩展的事件模型
        Netty 是基于异步事件驱动的,该框架体现为所有的I/O操作都是异步的,调用者并不能立即获得结果,而是通过事件监听机制,用户可以方便的主动获取或者通过通知机制获得I/O操作的结果。Netty 将所有的事件按照它们与入站或出站数据流的相关性进行了分类。
        可能由入站数据或者相关的状态更改而触发的事件包括以下几项
        • 连接已被激活或连接失活
        • 数据读取
        • 用户事件
        • 错误事件
          出站事件是未来将会触发的某个动作的操作结果,包括以下动作:
        • 打开或者关闭到远程节点的连接
        • 将数据写到或者冲刷到socket套接字中

      每个事件都可以被分发到ChannelHandler类中的某个用户实现的方法。

  • 传输服务
    Netty 内置了一些开箱即用的传输服务。因为并不是它们所有的传输都支持每一种协议,所以必须选择一个和应用程序所使用的协议相兼容的传输。以下是Netty提供的所有的传输。

    • NIO
      io.netty.channel.socket.nio包用于支持NIO。该包下面的实现是使用java.nio.channels包作为基础(基于选择器的方式)。
    • Epoll
      io.netty.channel.epoll包用于支持由 JNI 驱动的 epoll 和 非阻塞 IO。
      需要注意的是,这个epoll传输只能在 Linux 上获得支持。epoll同时提供多种特性,如: SO_REUSEPORT 等,比 NIO传输更快,而且是完全非阻塞的。
    • OIO
      io.netty.channel.socket.oio包用于支持使用java.net包作为基础的阻塞I/O
    • 本地
      io.netty.channel.local包用于支持在 VM 内部通过管道进行通信的本地传输。
    • 内嵌
      io.netty.channel.embedded包作为内嵌传输,允许使用ChannelHandler而又不需要一个真正的基于网络的传输。
  • 支持的协议
    Netty 支持丰富的网络协议,如TCP、 UDP、 HTTP、 HTTP/2、 WebSocket、 SSL/TLS等,这些协议实现开箱即用,因此,Netty 开发者能够在不失灵活的前提下来实现开发的简易性、高性能和稳定性。

异步和事件驱动

Netty 是异步事件驱动的框架,该框架体现为所有的I/O操作都是异步的,所有的I/O调用会立即返回,并不保证调用成功与否,但是调用会返回ChannelFuture。Netty 会通过 ChannelFuture通知调用是成功了还是失败了,抑或是取消了。

同时,Netty 是基于事件驱动的,调用者并不能立即获得结果,而是通过事件监听机制,用户可以方便地主动获取或者通过通知机制获得I/O操作的结果。

Future对象刚刚创建时,处于非完成状态,调用者可以通过返回的ChannelFuture来获取操作执行的状态,再通过注册监听函数来执行完成后的操作,常见有如下操作:

  • 通过isDone方法来判断当前操作是否完成。
  • 通过isSuccess方法来判断已完成的当前操作是否成功。
  • 通过getCause方法来获取已完成的当前操作失败的原因。
  • 通过isCancelled方法来判断已完成的当前操作是否被取消。
  • 通过addListener方法来注册监听器,当操作已完成(isDone方法返回完成),将会通知指定的监听器;如果future对象已完成,则理解通知指定的监听器。

例如:下面的代码中绑定端口是异步操作,当绑定操作处理完,将会调用相应的监听器处理逻辑。

serverBootstrap.bind(port).addListener(future -> {
    if(future.isSuccess()){
        System.out.println("端口绑定成功!");
    }else {
        System.out.println("端口绑定失败!");
    }
});

Netty的应用场景

互联网行业

  1. 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 被这些RPC框架所使用
  2. 典型的应用有:阿里分布式服务框架 DubboRPC 框 架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。
  3. 在Java领域Netty被广泛的应用,Tomcat,Dubbo,RocketMQ,Zookeeper,ElasticSearch等等这些中间件的网络通讯框架都是Netty实现的。

游戏行业

  1. 无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。
  2. Netty 作为高性能的基础通信组件,提供了 TCP/UDPHTTP 协议栈,方便定制和开发私有协议栈
  3. 地图服务器之间可以方便的通过 Netty 进行高性能的通信。

大数据领域

  1. 经典的 Hadoop 的高性能通信和序列化组件 AvroRPC 框架,默认采用 Netty 进行跨节点通信。

Netty版本说明

  1. Netty 版本分为 Netty 3.x 和 Netty 4.xNetty 5.x
  2. 因为 Netty 5 出现重大 bug,已经被官网废弃了,目前推荐使用的是 Netty 4.x的稳定版本
  3. 目前在官网可下载的版本 Netty 3.xNetty 4.0.x 和 Netty 4.1.x

参考文档:https://www.cnblogs.com/jiangwang001/p/15101684.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/116845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化时代,数据仓库是什么?有什么用?

在激烈的市场竞争和全新的数字经济共同作用下,数字化转型成为了大多数企业的共识,也是获取数字经济的最佳方式。在整个数据价值生产链路中,数据仓库的主要作用就是中心化分发,将原始数据与数据价值挖掘活动隔离。 所有的原始数据…

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力,提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日,第一代iPhone发布,开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线: Copilot - 副驾驶 应用&#xf…

RT-Thread内核移植

目录 前言一、实验平台简介1.1 W601简介1.2 RT-Thread简介1.3 开发环境 二、W601的SDK移植三、RT-Thread内核移植四、下载验证4.1 串口下载程序4.2 ST-Link下载 前言 本文以正点原子W601开发板为基础,讲解如何移植RT-Thread,本文所用资料见附件资源 一、…

基于ssm车位租赁系统+vue(2023年☆全网唯一)【附开发文档|表结构|万字文档(LW)和搭建文档】

主要功能 前台登录: 注册用户:用户账号、密码、姓名、手机号、身份证号、性别、邮箱 用户: ①首页、车位展示、公告展示、查看更多 ②车位类型、车位介绍、车位收藏、留言、我要租赁、公告、留言板 ③个人中心、车位收藏、车位租赁订单、已到…

C++ AVL树 c语言版本

引入平衡树 假设我们有两个节点:当我们插入第三个节点,就失衡了:此刻我们就要把它平衡一下。 为什么要变平衡 为什么说它失衡了呢,又为什么要把它变平衡? 如图a,假设我们要查找30这个节点就要查3次才能…

Docker网络模式_Docker常用命令_以及Docker如何给运行的镜像内容连接互联网_Docker网络模式原理---Docker工作笔记004

然后我们来看一下docker的网络模式: 这个docker我们先看一下电脑上的网络,有两个,1个是lo是测试用的一个是enp0s3这个是我们以太网地址,然后我们去: 安装docker 安装后我们再去ip address可以看到多出来一个网络是docker0 这里ip地址是172.17.0.1这个是私有地址外部无法访问 这…

pytorch dropout 置零 + 补偿性放缩

一句话概括:(训练过程中)Dropout 操作 随机置零 非置零元素进行后补偿性放缩。以保证dropout前后数据scale不变。 详细解释(来自chatgpt): 在 PyTorch 中,dropout 的操作不仅仅是将某些元素置零。为了确保期望输出在训练和测试…

MES与ERP系统集成的一些探讨

什么是MES软件? 制造执行系统 (MES) 是一种用于控制车间复杂制造操作和数据的软件。MES软件有助于提高生产过程的质量,使制造商能够轻松响应需求和客户偏好的变化。 MES软件有什么作用? 制造执行系统允许企业跟踪、…

SpringCloud-Alibaba之OSS对象存储服务

阿里云的 OSS 服务进行云端的文件存储 用户认证需要上传图片、首页轮播需要上传图片&#xff0c;OSS分布式文件服务系统可以提供服务。 一、依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</…

Java实现驼峰命名的字符串转化

目录 一、场景描述 二、代码示例 1、下划线大写方式命名的字符串转换为驼峰式 2、驼峰式命名的字符串转换为下划线大写的方式 3、完整代码 一、场景描述 在开发场景中&#xff0c;我们会遇到一些涉及字符串的转化。例如&#xff1a;数据库字段的名称叫TYPE_NAME&#xff0c…

Android MVI架构的深入解析与对比

什么是MVI&#xff1f; M&#xff1a;model&#xff0c;此处的model并不是传统的数据模块&#xff0c;它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V&#xff1a;view&#xff0c;视图模块 I&#xff1a;…

Android---彻底掌握 Handler

Handler 现在几乎是 Android 面试的必问知识点&#xff0c;大多数 Adnroid 工程师都在项目中使用过 Handler。主要场景是子线程完成耗时操作的过程中&#xff0c;通过 Handler 向主线程发送消息 Message&#xff0c;用来刷新 UI 界面。 下面我们来了解 Handler 的发送消息和处…

网络性能瓶颈分析,让我来说给你听!

在性能测试中&#xff0c;谈到网络问题&#xff0c;其实&#xff0c;在没有特别说明的情况下&#xff0c;我们一般讲的都是 HTTP 协议下的网络瓶颈问题&#xff0c;那&#xff0c;对于这个问题&#xff0c;我们如何来分析呢&#xff1f;计算机中的网络&#xff0c;跟我们现实生…

npm的使用

package.json 快速生成package.json npm init -y “version”: “~1.1.0” 格式为&#xff1a;「主版本号. 次版本号. 修订号」。 修改主版本号是做了大的功能性的改动 修改次版本号是新增了新功能 修改修订号就是修复了一些bug dependencies "dependencies": {&…

陕西某小型水库雨水情测报及大坝安全监测项目案例

项目背景 根据《陕西省小型病险水库除险加固项目管理办法》、《陕西省小型水库雨水情测报和大坝安全监测设施建设与运行管理办法》的要求&#xff0c;为保障水库安全运行&#xff0c;对全省小型病险水库除险加固&#xff0c;建设完善雨水情测报、监测预警、防汛道路、通讯设备、…

Spring源码编译步骤

Spring源码学习 一、Gradle 为什么下载gradle呢&#xff1f;我们平时不都是用maven吗&#xff1f;原因只有一个&#xff0c;spring源码是用gradle构建的&#xff0c;所以&#xff0c;你想看spring源码必须安装和学会使用gradle&#xff0c;那么&#xff0c;让我们开始gradle之…

windows 用vs创建cmake工程并编译opencv应用项目生成exe流程简述

目录 前言一、安装opencv&#xff08;1&#xff09;下载&#xff08;2&#xff09;双击安装&#xff08;3&#xff09;环境变量和system文件夹设置 二、打开vs创建项目三、编辑cpp&#xff0c;.h&#xff0c;cmakelist.txt文件&#xff08;1&#xff09;h文件&#xff08;2&…

ElementuiPlus的table组件实现行拖动与列拖动

借助了插件sortablejs。这种方法只适合做非树状table。如果想实现树状table&#xff0c;并且可拖动。可以试一下aggridVue3这个插件 <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"t…

云安全—docker Deamon攻击面

0x00 前言 本篇文章主要是讲docker Deamon的原理以及docker Deamon攻击面相关的内容&#xff0c;属于抛砖引玉系列&#xff0c;如有不妥之处还请斧正。 0x01 docker Deamon 还是先来看一下docker Deamon的一些相关知识&#xff0c;依旧是采用问答的方式来进行。为了文章的整…

设计模式_访问者模式

访问者模式 介绍 设计模式定义案例问题堆积在哪里访问模式访问模式是行为型设计模式 从对象中分类出算法 这些算法封装为对象&#xff0c; 这样这些算法类很容易扩展&#xff0c;添加新的算法类就可以了不同的VIP用户 在不同的节日 领取不同的礼物if else太多 解决办法小技巧…