Read book Netty in action (Chapter II) (Netty Introduction)
前言
支持15W的并发客户端,我们应该视为理所当然的事情,很多公司甚至能够支撑更多,例如我们熟知的 BAT,当几年前双十一的夜晚,并发量是不可估计的。还有春节的时候购票的时候的并发。作为一个优秀的开发人员,我们要把自己的期望提高,例如:老板说要支持15W,你最少要做到20W甚至30W。因为总会有更高的吞吐量和可扩展性的要求,在漫长的历史长河中,直接使用底层的API是很复杂的,所以有了Spring,Mybatis等史诗级框架。对于我们技术人员而言,他们已经不可或缺了。
在网络编程领域,Netty是Java的史诗级看框架,他将复杂的事情简单化。让我们去做我们真正感兴趣的事。
WHY
在首次深入之前,我们需要了解一下nettty的好处。
首先它是易于使用的,而且性能比JAVA核心的API有更多的吞吐量和耕地的延迟,因为池化(例如:线程池和德鲁伊)和复用,更低的资源消耗和更少的内存复制,健壮性不会导致OOM(不得不说,OOM的确令人头疼,我曾经做过SAP,在对接的时候务必十分小心,不然就会OOM,还有POI解析几百万数据的时候,不仅慢,而且内存容易溢出,所以我选择SAX),安全。(其实书上说的更多,我做了剪切,有需要可以去读原文。)
异步和事件驱动
异步事件可能很熟悉,例如:你可能永远也不会收到你发出去的电子邮箱对应的回复(给并发大师Lee或者给你喜欢的superstar写一封电子邮箱,你就会有体验。),你也不会傻傻的等着。或者我正在写信的时候收到垃圾邮箱,异步事件也可以有序。通常来说:你只有写信了,人家才有可能回复你,你在等待的时候也可以做一些其他的事情,例如:读一些杂志,喝一点开发或者中国茶。
在日常的生活中,异步因为常见可能会被你忽视,但是让计算机以相同的方式去做事,可能会产生一些特殊的问题。本质上,一个即是异步的又是事件驱动的程序的系统会表现出一些行为,它可以以任意的顺序响应在任意时间发生的事情。
这种能力对于实现可伸缩性至关重要,定义为:一种系统或者网络需要处理的工作不断增长的时候,可以通过某种行为扩大它的处理能力来适应增长。
异步和可伸缩性之间的联系
非阻塞网络调用使得我们可以不必等待一个操作的完成(写邮件),完全异步的IO正是基于这个特性构建的,并且更进一步:异步方法会立刻返回,并且在它完成的时候通知客户(参考:未来任务)。选择器可以使得我们使用较少的程序去监控许多连接上的事件。
What
Netty是什么,有什么核心构成的。正是例如:Spring Cloud的组件有哪些类似。
可以先看一下核心组件,我们并不需要知道代码意思。
Channel
Channel是JAVA NIO的一个基本构造,说白了,它就是一个实体(一个硬件设备,一个文件,一个网络套接字或者能够执行一个或者多个不同的IO操作的程序组件)的开放连接,例如:read\write。因此它是可以打开或者关闭的,是数据传入传出的载体。
回调
一个回调就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以调用前者,这是操作之后通知的常用手段之一。
Netty在内部使用了回调处理事件,当一个回调被触发的时候,相关的事件可以被Hanlder去处理。参照下面的例子:
导入
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.51.Final</version>
</dependency>
public class ConnectHandler extends ChannelInboundHandlerAdapter {@Override//当一个新的连接已经被建立时,channelActive(ChannelHandlerContext)将会被调用public void channelActive(ChannelHandlerContext ctx)throws Exception {System.out.println("Client " + ctx.channel().remoteAddress() + " connected");}
}
当一个新的连接被建立的时候,回调方法就会被调用。
Future
大家应该听过FutureTask,或者用过,它提供了另一种在操作完成时通知应用程序的方式。这个对象可以看做是一个异步结果的占用符,它会在完成之后,提供你对结果的访问。
juc包里有Future类并且有所实现,可以动手检查,或者阻塞到其完成。netty有ChannelFuture。用于执行异步操作的时候用。
代码:
public interface ChannelFuture extends Future<Void> {Channel channel();ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> var1);ChannelFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... var1);ChannelFuture removeListener(GenericFutureListener<? extends Future<? super Void>> var1);ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super Void>>... var1);ChannelFuture sync() throws InterruptedException;ChannelFuture syncUninterruptibly();ChannelFuture await() throws InterruptedException;ChannelFuture awaitUninterruptibly();boolean isVoid();
}
这一段代码展示了一个ChannelFuture作为IO操作的一部分返回的样子。这里,connect()方法会直接返回,不会阻塞,该调用会在后台完成。这样可以更高效的利用资源。
public class ConnectExample {private static final Channel CHANNEL_FROM_SOMEWHERE = new NioSocketChannel();public static void connect() {Channel channel = CHANNEL_FROM_SOMEWHERE; //reference form somewhere// Does not block//异步地连接到远程节点ChannelFuture future = channel.connect(new InetSocketAddress("192.168.5.30", 29));//注册一个 ChannelFutureListener,以便在操作完成时获得通知future.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) {//检查操作的状态if (future.isSuccess()) {//如果操作是成功的,则创建一个 ByteBuf 以持有数据ByteBuf buffer = Unpooled.copiedBuffer("Hello", Charset.defaultCharset());//将数据异步地发送到远程节点。返回一个 ChannelFutureChannelFuture wf = future.channel().writeAndFlush(buffer);// ...} else {//如果发生错误,则访问描述原因的 ThrowableThrowable cause = future.cause();cause.printStackTrace();}}});}
}
怎么去处理失败完全取决你自己。
事件和ChannelHandler
Netty使用不同的事件来通知我们状态是什么。这使得我们可以基于操作来引发一些动作。可能是:记录日志,数据转换,流的控制,一些逻辑。
Netty是一个网络编程框架,所以事件是按照相关性分类的。入站包括:开启(连接、激活、开始读取、用户事件等)。
出站是未来将会触发的动作的结果。
每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法。
把他们放在一起
Future、回调和ChannerHandler
Nettty是基于Future和回调的,然后将事件派发给ChannerHandler。这样组成了一个netty的设计思想。
选择器、事件和EventLoop
Netty通过触发事件为Selector从应用程序中抽象出来,没有代码污染,为每一个通道配备一个EventLoop。用以处理所有事件。EventLoop顾名思义。本身是一个县城驱动,处理通道中的所有IO事件,而且在整个EventLoop的生命周期中都不会改变。我们只需要专注于程序开发即可。
结束语
初步了解了Metty之后,将会在下次正式得去编写一个netty的程序。其实Netty就是一个网络API的演变过程,用异步、非阻塞并且可介入操作的形式让我们的程序变得更加的牛逼(高可用,高可靠性,高稳定等)。
相关文章:
Read book Netty in action (Chapter II) (Netty Introduction)
前言 支持15W的并发客户端,我们应该视为理所当然的事情,很多公司甚至能够支撑更多,例如我们熟知的 BAT,当几年前双十一的夜晚,并发量是不可估计的。还有春节的时候购票的时候的并发。作为一个优秀的开发人员ÿ…...
python--route
routes是用python重新实现的Rails routes系统,用于将url映射到应用程序的actions ,并反过来生成url 它也是在openstack实现restful通信的方式,它被用来做将 URL 映射为 App 的 action,以及为 App的action 产生 URL 两个重要的方法…...
java面试中被问到项目中的难点,怎么回答
java面试中被问到项目中的难点,怎么回答回答步骤举例说明回答步骤 回答这个问题的方法取决于你的项目的类型和难度。 但是,一般来说,你可以遵循以下步骤来回答这个问题: 描述你的项目:首先简要描述你的项目的类型和目…...
【速通版】吴恩达机器学习笔记Part1
准备速通一下吴恩达的机器学习 很快做个笔记5.2.3 监督学习 part 2_哔哩哔哩_bilibili 目录 1.概述(P1-P3) 2.supervised learning:(P4,P5) regression: classification 3.unsupervised learning (P6- 1.聚类算…...
面试(九)小米C++开发一面 21.11.02
1、局部变量与全局变量的区别?可以同名嘛? 首先是作用域: 局部变量只在变量声明的代码块范围内生效 全局变量在其声明后的所有位置都能访问到 在局部变量与全局变量同名的情况下,全局变量会被屏蔽掉,只会使用局部变量的内容 2、extern 当在a.c中想要使用b.c中的函数fu…...
儿童书写台灯哪个牌子比较好?2023儿童护眼台灯分享
现在儿童的近视率高达52.7%,有科技水平的提高和电子产品的普及,近视率逐年攀升,出现低龄化现象,调查结果显示,其中6岁儿童达到14.3%,小学生为35.6%。初中生71.1%,高中生高达80.5%,可…...
市场调研计划书如何写?
想要做好一个产品,市场调研是必不可少的一步,也是第一步,那么如何进行市场调研呢?以下是我整理的一份市场调研计划书,希望能够帮助到大家!!! 一、文档版本控制 主要记录文档的版本…...
python网络爬虫—快速入门(理论+实战)(七)
系列文章目录 (1)python网络爬虫—快速入门(理论实战)(一) (2)python网络爬虫—快速入门(理论实战)(二) (3) p…...
机器学习笔记——Chapter 1 – The Machine Learning landscape
ML学习笔记 Chapter 1 – The Machine Learning landscape 1.如何定义机器学习? Answer:机器学习是一门通过编程让计算机从数据中进行学习的科学(和艺术)。 2.机器学习在哪些问题上表现突出,你能给出四种类型吗&am…...
skimage.feature--corner_harris、hog、local_binary_pattern说明
skimage.feature说明–corner_harris、hog、local_binary_pattern 文章目录skimage.feature说明--corner_harris、hog、local_binary_pattern1. 前言2. corner_harris2.1 介绍2.2 参数及返回3. hog3.1 介绍3.2 参数及返回4. local_binary_pattern4.1 介绍4.2 参数及返回5. 总结…...
致敬白衣天使,学习Python读取
名字:阿玥的小东东 学习:Python、c 主页:阿玥的小东东 故事设定:现在学校要求对所有同学进行核酸采集,每位同学先在宿舍内等候防护人员(以下简称“大白”)叫号,叫到自己时去停车场排…...
JVM - 认识JVM规范
目录 重识JVM JVM规范作用及其核心 JVM 整体组成 理解ClassFile结构 ASM开发 重识JVM JVM概述JVM: Java Virtual Machine,也就是Java虚拟机所谓虚拟机是指: 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统…...
文献阅读笔记 # CodeBERT: A Pre-Trained Model for Programming and Natural Languages
《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》EMNLP 2020 (CCF-B)作者主要是来自哈工大、中山大学的 MSRA 实习生和 MSRA、哈工大的研究员。资源:code | pdf相关资源:RoBERTa-base | CodeNN词汇: bimodal: 双模态…...
openHarmony的UI开发
自适应布局 拉伸能力 Blank在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效,即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank(),将剩余空间占满,从而实现…...
【JavaSE】深入HashMap
文章目录1. HashMap概述2. 哈希冲突3. 树化与退化3.1 树化的意义3.2 树的退化4. 二次哈希5. put方法源码分析6. key的设计7. 并发问题参考 如何防止因哈希碰撞引起的DoS攻击_hashmap dos攻击_双子孤狼的博客-CSDN博客 为什么 HashMap 要用 h^(h >>&#…...
华为机试题:HJ62 查找输入整数二进制中1的个数(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。1、整型int() :将指定进制…...
代码随想录训练营一刷总结|
分为几个大部分: 数组 最先接触的部分,虽然说感觉是最简单的,但是需要掌握好基础,特别是小心循环。这里面需要再仔细看的就是螺旋矩阵那一块,其他的在后续刷的时候能用一种方法一次a就行。 链表 需要注意链表的基础…...
CSS中的几种尺寸单位
一、尺寸单位 CSS 支持多种尺寸单位,包括: px:像素,固定大小单位em:相对于当前元素字体大小的单位rem:相对于根元素(HTML)字体大小的单位%:相对于父元素的百分比单位vh…...
运维必会:ansible剧本(piaybook)
playbooks 概述以及实例操作 Playbooks 组成部分: Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务,即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器,由某时间触发执行的操作 Roles: 角色 YAML 介绍…...
活动星投票午间修身自习室制作在线投票投票制作网页
“午间修身自习室”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
