Netty,认识和深入(一)

Netty,认识和深入

Netty 的介绍

Netty,百度百科地址:点击跳转

Netty,官网地址地址:点击跳转

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

Netty ,是由JBOSS提供的一个JAVA开源框架,现为GIthub 项目;

Netty,是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序;

Netty ,主要针对在TCP协议下,面向Clients 端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用;

Netty,本质是一个NIO框架,适用于服务器通讯相关的多种应用场景;

Netty,结构构成大致如下:
Netty,认识和深入(一)_第1张图片

什么是事件驱动?

百度百科地址:点击跳转

事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共关系、经济活动等领域均有应用。

简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数). 当然事件不仅限于用户的操作。事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于 HandleMsg 的一个名字)。对于框架的使用者来说,他们能够看到的是事件处理器。这也是他们所关心的内容

Netty 能做什么

有了 Netty,你可以实现自己的 HTTP 服务器,FTP 服务器,UDP 服务器,RPC 服务器,WebSocket 服务器,RedisProxy 服务器,MySQLProxy 服务器等等。如果你想知道 Nginx 是怎么写出来的,如果你想知道 Tomcat 和 Jetty 是如何实现的,如果你也想实现一个简单的 Redis 服务器,它们高性能的原理都是类似的。

传统的 HTTP 服务器的原理。

  • 创建一个 ServerSocket,监听并绑定一个端口;

  • 一系列客户端来请求这个端口;

  • 服务器使用 Accept,获得一个来自客户端的 Socket 连接对象

  • 启动一个新线程处理连接

    • 读 Socket,得到字节流
    • 解码协议,得到 Http 请求对象
    • 处理 Http 请求,得到一个结果,封装成一个 HttpResponse 对象
    • 编码协议,将结果序列化字节流
    • Socket,将字节流发给客户端
  • 继续循环步骤 3

HTTP 服务器之所以称为 HTTP 服务器,是因为编码解码协议是 HTTP 协议,如果协议是 Redis 协议,那它就成了 Redis 服务器,如果协议是WebSocket,那它就成了 WebSocket 服务器,等等。

使用 Netty 你就可以定制编解码协议,实现自己的特定协议的服务器。

上面我们说的是一个传统的多线程服务器,这个也是 Apache 处理请求的模式。在高并发环境下,线程数量可能会创建太多,操作系统的任务调度压力大,系统负载也会比较高。那怎么办呢?

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

Netty 特性

设计

  • 统一的 API,适用于不同的协议(阻塞和非阻塞);

  • 基于灵活、可扩展的事件驱动模型;

  • 高度可定制的线程模型;

  • 可靠的无连接数据 Socket 支持(UDP);

性能

  • 更好的吞吐量,低延迟;

  • 更省资源;

  • 尽量减少不必要的内存拷贝;

安全

  • 完整的 SSL/TLSSTARTTLS 的支持;

  • 能在 AppletAndroid 的限制环境运行良好;

健壮性

  • 不再因过快、过慢或超负载连接导致 OutOfMemoryError

  • 不再有在高速网络环境下 NIO 读写频率不一致的问题;

易用

  • 完善的 JavaDoc,用户指南和样例;

  • 简洁简单;

  • 仅信赖于 JDK1.5

Netty ,应用场景

官方地址,点击跳转

Netty,认识和深入(一)_第2张图片

互联网行业

  1. 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高性能的通信框架,往往作为基础通信组件被这些RPC框架使用;
  2. 典型的应用有:阿里分布式框架DubboRPC框架使用的Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信;

Netty,认识和深入(一)_第3张图片

游戏行业

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

大数据领域

  1. 经典的Hadoop的高性能通信和序列化组件(AVRO实现数据文件共享)的RPC框架,默认采用Netty进行跨界点通信;
  2. 它的Netty Service 基于Netty框架二次开发;

相关学习资料

  • Netty in Action-中文版,百度云盘下载地址,点击跳转 ,提取码:8hif
  • 5.6《Netty权威指南(第2版)》,百度云盘下载地址,点击跳转,提取码:a7eg

在这里插入图片描述

I/O,模型

  1. I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能;
  2. JAVA 共支持3种网络编程模型,I/O模式:BIONIOAIO
  3. JAVA AIO:异步非阻塞,AIO引入异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用;使用于连接数目多且比较长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

你可能感兴趣的:(网络编程,java,rpc,开发语言,netty)