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

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的并发客户端&#xff0c;我们应该视为理所当然的事情&#xff0c;很多公司甚至能够支撑更多&#xff0c;例如我们熟知的 BAT&#xff0c;当几年前双十一的夜晚&#xff0c;并发量是不可估计的。还有春节的时候购票的时候的并发。作为一个优秀的开发人员&#xff…...

python--route

routes是用python重新实现的Rails routes系统&#xff0c;用于将url映射到应用程序的actions &#xff0c;并反过来生成url 它也是在openstack实现restful通信的方式&#xff0c;它被用来做将 URL 映射为 App 的 action&#xff0c;以及为 App的action 产生 URL 两个重要的方法…...

java面试中被问到项目中的难点,怎么回答

java面试中被问到项目中的难点&#xff0c;怎么回答回答步骤举例说明回答步骤 回答这个问题的方法取决于你的项目的类型和难度。 但是&#xff0c;一般来说&#xff0c;你可以遵循以下步骤来回答这个问题&#xff1a; 描述你的项目&#xff1a;首先简要描述你的项目的类型和目…...

【速通版】吴恩达机器学习笔记Part1

准备速通一下吴恩达的机器学习 很快做个笔记5.2.3 监督学习 part 2_哔哩哔哩_bilibili 目录 1.概述&#xff08;P1-P3) 2.supervised learning&#xff1a;&#xff08;P4,P5) regression&#xff1a; classification 3.unsupervised learning &#xff08;P6- 1.聚类算…...

面试(九)小米C++开发一面 21.11.02

1、局部变量与全局变量的区别?可以同名嘛? 首先是作用域: 局部变量只在变量声明的代码块范围内生效 全局变量在其声明后的所有位置都能访问到 在局部变量与全局变量同名的情况下,全局变量会被屏蔽掉,只会使用局部变量的内容 2、extern 当在a.c中想要使用b.c中的函数fu…...

儿童书写台灯哪个牌子比较好?2023儿童护眼台灯分享

现在儿童的近视率高达52.7%&#xff0c;有科技水平的提高和电子产品的普及&#xff0c;近视率逐年攀升&#xff0c;出现低龄化现象&#xff0c;调查结果显示&#xff0c;其中6岁儿童达到14.3%&#xff0c;小学生为35.6%。初中生71.1%&#xff0c;高中生高达80.5%&#xff0c;可…...

市场调研计划书如何写?

想要做好一个产品&#xff0c;市场调研是必不可少的一步&#xff0c;也是第一步&#xff0c;那么如何进行市场调研呢&#xff1f;以下是我整理的一份市场调研计划书&#xff0c;希望能够帮助到大家&#xff01;&#xff01;&#xff01; 一、文档版本控制 主要记录文档的版本…...

python网络爬虫—快速入门(理论+实战)(七)

系列文章目录 &#xff08;1&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;一&#xff09; &#xff08;2&#xff09;python网络爬虫—快速入门&#xff08;理论实战&#xff09;&#xff08;二&#xff09; &#xff08;3&#xff09; p…...

机器学习笔记——Chapter 1 – The Machine Learning landscape

ML学习笔记 Chapter 1 – The Machine Learning landscape 1.如何定义机器学习&#xff1f; Answer&#xff1a;机器学习是一门通过编程让计算机从数据中进行学习的科学&#xff08;和艺术&#xff09;。 2.机器学习在哪些问题上表现突出&#xff0c;你能给出四种类型吗&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读取

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、c 主页&#xff1a;阿玥的小东东 故事设定&#xff1a;现在学校要求对所有同学进行核酸采集&#xff0c;每位同学先在宿舍内等候防护人员&#xff08;以下简称“大白”&#xff09;叫号&#xff0c;叫到自己时去停车场排…...

JVM - 认识JVM规范

目录 重识JVM JVM规范作用及其核心 JVM 整体组成 理解ClassFile结构 ASM开发 重识JVM JVM概述JVM&#xff1a; Java Virtual Machine&#xff0c;也就是Java虚拟机所谓虚拟机是指&#xff1a; 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统…...

文献阅读笔记 # 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、哈工大的研究员。资源&#xff1a;code | pdf相关资源&#xff1a;RoBERTa-base | CodeNN词汇&#xff1a; bimodal: 双模态…...

openHarmony的UI开发

自适应布局 拉伸能力 ​ Blank在容器主轴方向上&#xff0c;空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效&#xff0c;即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank()&#xff0c;将剩余空间占满&#xff0c;从而实现…...

【JavaSE】深入HashMap

文章目录1. HashMap概述2. 哈希冲突3. 树化与退化3.1 树化的意义3.2 树的退化4. 二次哈希5. put方法源码分析6. key的设计7. 并发问题参考 如何防止因哈希碰撞引起的DoS攻击_hashmap dos攻击_双子孤狼的博客-CSDN博客 为什么 HashMap 要用 h^(h &#xff1e;&#xff1e;&#…...

华为机试题:HJ62 查找输入整数二进制中1的个数(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() &#xff1a;打印输出。1、整型int() &#xff1a;将指定进制&#xf…...

代码随想录训练营一刷总结|

分为几个大部分&#xff1a; 数组 最先接触的部分&#xff0c;虽然说感觉是最简单的&#xff0c;但是需要掌握好基础&#xff0c;特别是小心循环。这里面需要再仔细看的就是螺旋矩阵那一块&#xff0c;其他的在后续刷的时候能用一种方法一次a就行。 链表 需要注意链表的基础…...

CSS中的几种尺寸单位

一、尺寸单位 CSS 支持多种尺寸单位&#xff0c;包括&#xff1a; px&#xff1a;像素&#xff0c;固定大小单位em&#xff1a;相对于当前元素字体大小的单位rem&#xff1a;相对于根元素&#xff08;HTML&#xff09;字体大小的单位%&#xff1a;相对于父元素的百分比单位vh…...

运维必会:ansible剧本(piaybook)

playbooks 概述以及实例操作 Playbooks 组成部分&#xff1a; Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务&#xff0c;即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器&#xff0c;由某时间触发执行的操作 Roles: 角色 YAML 介绍…...

活动星投票午间修身自习室制作在线投票投票制作网页

“午间修身自习室”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工…...

C#泛型:高级静态语言的效率利器

文章目录引入类型约束子类泛型常用的泛型数据结构前文提要&#xff1a; &#x1f48e;超快速成&#xff0c;零基础掌握C#开发中最重要的概念&#x1f48e;抽丝剥茧&#xff0c;C#面向对象快速上手&#x1f48e;Winform&#xff0c;最友好的桌面GUI框架&#x1f48e;懂了委托&a…...

澳大利亚访问学者申请流程总结

澳大利亚访问学者申请需要注意些什么&#xff1f;下面知识人网小编整理澳大利亚访问学者申请流程总结。1、取得wsk英语成绩&#xff0c;现在都是先买票再上车了。2、联系外导&#xff0c;申请意向接收函(email)。3、向留学基金委CSC提出申请。4、获批后&#xff0c;申请正式邀请…...

cookie和Session的作用和比较

目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件&#xff0c;该文件是干嘛的呢&#xf…...

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故&#xff0c;究其根源&#xff0c;事故本身属于架构或者需求层面需要规避的问题&#xff0c;测试人员的责任其实是非常小的&#xff0c;但实际情况是&#xff1a;相关测试人员因此承担了很大的压力&#xff0c;成为质量问题的“背锅侠”。 实际上&#…...

C++: C++模板<template>

C template content&#x1f60a;前言&#x1f601;模板&#x1f495;1、泛型编程&#x1f60d;2、函数模板&#x1f612;2.1&#xff1a;函数模板概念&#x1f44c;2.2&#xff1a;函数模板的格式&#x1f618;2.3&#xff1a;函数模板原理&#x1f601;2.4&#xff1a;函数模…...

chmod命令详解

用法&#xff1a;chmod [选项]… 模式[,模式]… 文件…  或&#xff1a;chmod [选项]… 八进制模式 文件…  或&#xff1a;chmod [选项]… --reference参考文件 文件… Change the mode of each FILE to MODE. With --reference, change the mode of each FILE to that of R…...

状态机设计中的关键技术

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…...

单片机开发---ESP32S3移植NES模拟器(二)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器&#xff08;一&#xff09;》 暖场视频&#xff0c;小时候称这个为—超级曲线射门&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…...

微信小程序nodej‘s+vue警局便民服务管理系统

本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括“最多跑一次”微信小程序的网络应用,在外国小程序的使用已经是很普遍的方…...

第18章 MongoDB $type 操作符教程

MongoDB $type 操作符 描述 在本章节中&#xff0c;咱们将继续讨论MongoDB中条件操作符 $type。 $type操作符是基于BSON类型来检索集合中匹配的数据类型&#xff0c;并return 结果。 MongoDB 中可以使用的类型如下表所示&#xff1a; 类型数字备注Double1 String2 Object3…...

建设020网站需要多少钱/无锡seo关键词排名

转&#xff1a;http://windshg.iteye.com/blog/1606981...

文库网站开发建设/企业网站营销的优缺点及案例

2019独角兽企业重金招聘Python工程师标准>>> Actor模型的本质已经被强调了无数遍&#xff1a;万物皆Actor。Actor之间只有发送消息这一种通信方式&#xff0c;例如&#xff0c;无论是管理员让工作者干活&#xff0c;还是工作者把成果交还给管理员&#xff0c;它们之…...

自适应网站模板怎么做/阿里巴巴关键词排名优化

现代的CPU和主板都有节电技术&#xff0c;在CPU低负荷工作的会自动降频。如果需要临时设置主频和工作模式&#xff0c;可使用cpufreq手动调整。这个模式将在重启后失效&#xff0c;如果需要长期调整请修改/etc/sysconfig/cpuspeed。 一、检查内核加载 lsmod | grep "acpi_…...

wordpress 日期/杭州seo代理公司

Sed简介sed 是一种在线编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用sed命令处理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲…...

网站怎么做拉新/如何注册域名及网站

1、单列排序 SELECT* FROMtable_name ORDER BYcolumn_name; ASC默认升序&#xff0c;降序后面接"DESC"即可。 2、多列排序 SELECT* FROMtable_name ORDER BYcolumn_name1,column_name2 DESC; 首先按column_name1字段排序&#xff0c;若column_name1相等&#xff0c;…...

建设公众号官方网站/永久观看不收费的直播

一、 外设 LED 介绍LED小灯 即发光二极管&#xff0c;发光二极管为二极管中的一种&#xff0c;二极管中有阳极和阴极&#xff0c;电流从正极流向负极导通&#xff0c;反向阻断。其中贴片发光二极管&#xff0c;正向导通电压在1.8V — 2.2V之间&#xff0c;靠电流驱动&#xff0…...