一、Netty简介
什么是Netty?
1、高性能事件驱动,异步非阻塞的IO加载开源框架.
它是由JBoss提供,用于建立TCP等底层链接.基于Netty可以建立高性能的HTTP服务器,快速开发高性能,高可靠型网络服务器和客户端程序,支持HTTP、webSocket、 Protobuf( protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的)、Binary、UDP。尤其是因为其具有高性能非阻塞性的特点,可以作为socket底层的通信基础,用到的服务器有Dubbo、Mina等
2、基于NIO的客户端,服务端编程框架
使用Netty可以确保快速和简单的开发出一个网络应用,例如实现了某种协议的客户端、服务端应用,Netty相当简化和流线化网络应用的开发过程,比如TCP和UDP的Socket服务开发,
3、提供了非常可靠的稳定性和伸缩性
Netty 的快速和简单,并不意味着会让最终的应用程序,产生维护性和性能上的问题,Netty是一个吸收了多种协议的,实现经验的,并且经过了相当精心的设计,最终Netty找到一种方式,在保证易用开发的同时,还保证了其应用的性能,稳定性和良好的伸缩性。
二、Netty使用场景
1、Netty被广泛应用于高性能领域
Netty 作为一个高性能的NIO框架,在高性能领域,譬如游戏、大数据,分布式计算领域,得到了广发的应用。
2、Netty被广泛应用于多线程并发领域
​Netty 的多线程模型采用 Reactor模式, Reactor模式主要由多路复用器,事件分发器,事件处理器组成,可以分为三种,第一种单线程模型,所有的IO都由一个线程完成,即多路复用、事件分发、处理都是在一个Reactor线程完成的。第二种多线程模型,为了解决单线程模型的一些问题,演化而来的多线程模型,在多线程模型的基础上,又演化出主从线程模型,采用多个Reactor,每个Reactor都在自己单独的线程里执行,如果是多核,就可以同时享受多个客户端请求,一旦链路建立成功,就将链路注册负责IO读写的sub reactor模型上。
3、Netty被广泛应用于异步通信领域
​作为一个异步的NIO框架,Netty全部IO都是异步非阻塞的,通过FutureListener机制,用户能够方便的主动获取,或者通过通知机制获得IO的操作结果。
三、Netty主要需要学习总纲
1、Netty的IO通信
     主要学习Java的BIO操作,伪异步IO通信,NIO通信,AIO通信,同时,对四种通信进行对比。
2、Netty的入门级学习
     主要学习原生NIO存在什么样的缺陷,有哪些不足的地方,Netty对比原生NIO存在什么样的优势 。
3、WebSocket的入门级学习
     主要学习什么是webSocket,webSocket建立链接的方式,webSocket的生命周期,webSocket是如何关闭的。
4、Netty实现WebSocket通信案例
     主要学习实现功能,开发服务端,客户端,测试程序
5、Netty学习总结
四、Netty学习前准备
 1、有一定的Java基础
       主要由Java开发的NIO开源框架。
 2、有一定的IO编程基础
 3、了解Java的BIO、伪异步IO、NIO和AIO
 
名词解释:
BIO:同步阻塞式IO,服务器端与客户端通过三次握手后建立连接,连接成功,双方通过I/O进行同步阻塞式通信。
弊端:1,读和写操作是同步阻塞的,任何一端出现网络性能问题,都会影响另一方。2,一个链路建立一个线程,无法满足高并发,高性能需求。
 
伪异步IO:为了解决同步阻塞式IO一个链路建立一个线程的弊端,出现了伪异步IO,伪异步IO其实就是通过线程池/队列来处理多个客户端的接入,通过线程池可以灵活的调配线程资源,设置线程最大值,防止海量并发接入导致线程耗尽。
弊端:1,读和写操作是同步阻塞的,任何一端出现网络性能问题,都会影响另一方
 
非阻塞IO:nio类库是jdk1.4中引入的,它弥补了同步阻塞IO的不足,它在Java提供了高速的,面向块的I/O。同步阻塞IO是以流的方式处理数据,而NIO是以块的方式处理数据。面向流的I/O通常比较慢, 按块处理数据比按(流式的)字节处理数据要快得多。
 
AIO:异步非阻塞I/O,NIO2的异步套接字通道时真正的异步非阻塞I/O,它对应unix网络驱动中的事件驱动I/O,它不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写,简化了NIO编程模型。
 
NIO:全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。
 
补充:
NIO有哪些框架?
Netty,Mina,Grizzly
为什么选择netty?
Netty 是业界最流行的NIO框架之一,它的健壮性,性能,可定制性,可扩展性在同类框架中都是屈指一数的,并且它已经得到很多商用项目的验证。
Netty优点有哪些?
API使用简单,开发门槛低。
功能强大,预置多种编解码器,支持多种主流协议。
定制能力强,可以通过channelhandler对通信框架进行灵活的扩展。
性能好。
社区活跃,版本迭代周期短。
经历了大规模的商业项目的验证。在互联网,大数据,网络游戏,企业应用,电信软件等众多行业得到成功商用,证明了它完全可以满足不同行业的商业应用。
 
 
 
 

Netty学习第一节Netty的总体概况的更多相关文章

  1. MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件

    MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...

  2. Netty学习笔记(三)——netty源码剖析

    1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...

  3. OpenNebula学习第一节OpenNebula Front-end Installation

    一.说说情怀 随着公司硬件开发资源的不足,构建一个云平台似乎重要了起来.当然,也不是这个平台搭建的主力,出于工作的需求和个人兴趣爱好,接下来就来学习一下OpenNebula相关的东西,这是第一节课,先 ...

  4. 1001-MySQL学习-第一节自习课

    MySQL学习(第一节自习课) 一. 软件下载.安装 下载地址:https://dev.mysql.com/downloads/installer/ 位置:mysql->installer-&g ...

  5. VUE2.0实现购物车和地址选配功能学习第一节(来源--慕课网河畔一角)

    第一节  vue知识 vue-resource:和后台交互的一个插件,实现get.post和jsonp等功能.(替代jQuery) vue特点: 1.易用:通过创建vue实例,{{}}绑定数据十分方便 ...

  6. Netty学习第二节Java IO通信

    一.Java IO通信 名词解释: BIO通信:       采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,在接收到客户端请求后,为每一个客户端建立一个新的线程负 ...

  7. Netty学习--第一章 JDK自带的BIO

    一.什么是BIO BIO是传统的通信技术,在BIO通信模型中,客户端发送请求给服务器,服务器每次都是会单独创建一个线程来监控客户端的请求,会为每个客户端创建一个线程来处理请求.当前服务器处理完成后,通 ...

  8. Netty学习笔记(二)——netty组件及其用法

    1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...

  9. Netty学习(三)-Netty重要接口讲解

    上一节我们写了一个HelloWorld,对于Netty的运行有了一定的了解,知道Netty是如何启动客户端和服务器端.这一节我们简要的讲解一下几个重要的接口,初步探讨Netty的运行机制,当然刚学Ne ...

随机推荐

  1. 五种方法实现Java的Singleton单例模式

    面试的时候经常会问到Java的单例模式,这道题能很好的考察候选人对知识点的理解程度.单例模式要求在系统运行时,只存在唯一的一个实例对象. 下面我们来详细剖析一下其中的关键知识点,并介绍五种实现方法,以 ...

  2. ubuntu16.04设置电池充电阈值

    thinkpad在安装ubuntu16.04之后,设置充电阈值: 方法一: 使用双系统,在windows下使用联想的Lenovo setting center设置之后,在ubuntu之下也可以保持相同 ...

  3. mongodb基础学习12-分组group操作

    group可以实现常用的统计操作,如求最大值,最小值,求和 其中reduce是最关键的操作,是对每一条记录的具体操作 下面来看例子: 分组count求和 部分结果 下面的加了个查询条件,即查询价格大于 ...

  4. Delphi WebBrowser 无法调用当前浏览器的版本 --转

    出自:http://blog.csdn.net/wensibo/article/details/25971863 procedure TregedtIE.FormCreate(Sender: TObj ...

  5. 判断一个对象是否为真 __nonzero__ 方法和 __len__方法

    class A(): def __nonzero__(self): # 判断 一个对象是否为空,先查看该方法的返回值 return 1 def __len__(self): # 如果没有上一个方法,那 ...

  6. Android中decode JPG时建议使用inPreferQualityOverSpeed

    在BitmapFactory.decodeBitmap方法中,参数BitmapFactory.Options里有一项是inPreferQualityOverSpeed:设为true的话,画质更好,加载 ...

  7. cat 生成文件 运行脚本

    nohup python -u day_std_cid_list_data_done.py >eee1.log 2>&1 & 后台运行python脚本 hadoop fs ...

  8. Ansible playbooks

    Playbook是Ansible的配置,部署和编排语言. 他们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果Ansible modules是您workshop的工具,则playb ...

  9. 格式化java8 LocalDateTime

    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(time1);

  10. python之字符串【str】

    #Auther Bob#--*--conding:utf-8 --*-- #定义一个str的对象,有下面两种方法name = 'Bob abc'job = str('it')print(type(na ...