Netty——异步和事件驱动
- JAVA网络编程
- Netty简介
- Netty核心组件
Netty是什么?
基于java NIO的进一步升级,也是真正意义上的异步非阻塞的模型,使用最小的资源开销来达到最大的性能
- 支持多种通讯协议
- 高度的抽象,隐藏底层实现细节
- 简单易用
- IO性能良好
核心思想:使用最小的开销来实现最高效率的能力
核心组件:
- Channel
- 回调
- Future 设计模式
- 事件和ChannelHandle
Channel
可以看做一个黑盒,载体,可以输入和输出
回调
一个指向被提供给另一个方法的引用
Future
核心组件之一
用于实现异步通知
interface java.util.concurrent.Future
是JDK预置的接口的完成通知形式
由 ChannelFutureListener 提供的通知机制
每次的IO都会产生一个ChannelFutrue
事件和ChannelHandler
由于Netty是事件驱动的,将整个IO拆分为下面的事件
- 连接事件
- 数据读取
- 用户事件
- 错误事件
- 关闭连接事件
- 数据写入
谁在使用它?
- Elastic Search
- Kibana
为什么要学netty?
- 高并发框架
- 极高的IO性能
- 对于NIO有进一步的扩展
- 将关注点由底层转向业务实现
- 大大的降低了网络编程,IO,多线程复杂结构
Netty的同类框架
- hadoop
- 大数据框架
- elasticsearch
- 为什么es性能那么强,底层就是netty
- Mina
如何学习?
- 看书
- 写案例
- netty的历史
代理设置: 127.0.0.1 端口: 1080 具体设置: windows10.microdone.cn 复制代码
JAVA 网络编程
阻塞I/O样板代码
大致流程:
- 创建一个ServerSocket,用来监听客户端请求
- 调用**accept()**核心方法,该方法会产生阻塞,等待请求创建
- 使用socket获取输出和输出流对象,一般使用包装buffer对应提高读写效率
- 创建流对象
- 读取数据,处理请求数据,得到处理后的响应信息,最后在进行处理
accept()方法做了什么事情:
- 初始化,创建socketImpl()实现类
- 校验套接字
- 检测请求是否合法
- 异常处理
阻塞I/O的优点:
- 简单易懂
- 对于并发量不是很大情况可以很好的处理
阻塞I/O的缺点:
- 每一个请求就要建立一个线程,并且要一直等待,资源浪费
- 开启的线程数取决于操作系统,
- 上下文切换的代价昂贵
示范代码:
public static void main(String[] args) throws IOException { // 1. 创建一个套接字 ServerSocket socket = new ServerSocket(8080); // 创建一个请求对象 Socket accept = socket.accept(); // 获取输入流和输出流 BufferedReader in = new BufferedReader(new InputStreamReader(accept.getInputStream())); PrintWriter out = new PrintWriter(accept.getOutputStream()); // 创建流对象 String request, response; while ((request =in.readLine())!=null){ // 读取字节流数据 if(request.equals("Done")){ break; } // 调用服务器处理流数据的方法,处理请求流 response = processRequest(request); out.println(response); } } 复制代码
JAVA NIO
原理:调用本地套接字的非阻塞套接字
- 使用
setsockept()
配置套接字,读写的时候没有数据可以返回 - 使用事件通知的API注册非阻塞的套接字
非阻塞I/O是 jdk1.4引入的
这里有个很大的误区:
NIO是不是非阻塞的?
结论:错误
原因:
NIO是 1.4引入的,它不再新了,而且该API其实内部还是阻塞的,后面会讲到
class java.nio.channels.Selector
非阻塞IO的实现类
优点:
- 较少的线程处理很多链接
- 没有IO的时候可以执行其他操作
编写第一个Netty应用程序
环境准备
- Apach maven
- JDK1.7以上
开发工具
- IntelinJ IDEA 2019版本