技术主题
Netty是一个基于Java NIO(非阻塞 I/O)框架的网络编程框架。它提供了一系列的高级网络编程API,使得开发者可以非常容易地实现高性能、高可靠性的网络应用。Netty具有非常好的可扩展性和灵活性,能够很好地支持多种协议和数据格式。它被广泛应用于互联网领域的服务器开发,如Web服务器、游戏服务器、聊天服务器等。
技术应用
我们在语音转文字的需求中,涉及到长链接,借助websocket来实现的一种全双工通信协议。
Netty框架可以用来实现WebSocket协议通信的服务器端。Netty的优秀设计和高性能可以使开发者更加方便地实现WebSocket服务器端,支持高并发和持久连接,同时还支持多种协议和数据格式的转换。
语音转文字需要不断地接收实时音频流,并且需要快速地对音频进行处理和识别转换,常规的HTTP协议可能无法满足实时性的要求。WebSocket是一种全双工通信协议,可以在客户端和服务器之间建立实时、持久的连接,同时支持双向数据传输,因此能够满足语音转文字实时性要求的需求。
使用WebSocket实现语音转文字的过程是,在客户端使用WebRTC或者是录音API获取到实时音频流,将音频流通过WebSocket协议传输到服务器端。服务器端可以对音频流进行实时处理、转换和识别,把转换结果通过WebSocket协议发送到客户端,客户端再将转换结果展示给用户。从而实现实时语音转换的功能。
技术原理
技术原理一:Netty和Tomcat有什么区别?
Netty和Tomcat最大的区别就是通信协议,Tomcat是基于http协议的,他的实质是一个基于http协议的web容器,但是netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis的功能,这样是netty和tomcat的最大不同。
tomcat从第六版本升级支持了nio模式,相比旧的bio模式,并发性能得到了很大提高。
技术原理二:为什么Netty受欢迎?
当一个连接建立之后,他有两个步骤要做,第一步是接收完客户端发过来的全部数据,第二步是服务端处理完请求业务之后返回response给客户端。区别主要还是在第一步。
在BIO中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。
而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理完数据再返回给客户端-这个过程是不阻塞的,这样就让一个Thread处理更多的请求了。
技术原理三:五种常见的IO模型
1、BIO,同步阻塞IO,阻塞整个步骤,如果连接少,他的延迟是最低的,因为一个线程只处理一个连接,适用于少连接且延迟低的场景,比如说数据库连接。
2、NIO,同步非阻塞IO,阻塞业务处理但不阻塞数据接收,适用于高并发并且处理简单的场景,比如聊天软件
3、多路复用IO,他的两个步骤是分开的,也就是说,一个连接可能他的数据接收是线程a完成的,数据处理是线程b完成的,他比BIO能处理更多请求
4、信号驱动IO,这种IO模型主要用在嵌入式开发,不参与。
5、异步IO,他的数据请求和数据处理都是异步,数据请求一次返回一次,适用于长连接的业务场景
技术管理四:Netty为什么传输快
Netty的传输快其实也是依赖了NIO的一个特性-零拷贝。我们知道,java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的终点,如果数据量大,就会造成不必要的资源浪费。
传统数据拷贝
零拷贝
Netty针对这种情况,使用了NIO的另一大特性-零拷贝,当他需要接收数据的时候,他会在堆内存之外开辟一块内存,数据直接从IO读到了那块内存中,在netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。
技术管理五:为什么说Netty封装好
Channel通道
1、Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
2、ChannelHandler,核心处理业务就在这里,用于处理业务请求。
3、ChannelHandlerContext,用于传输业务数据。
4、ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。
5、ByteBuf是一个存储字节的容器,最大特点就是使用方便,它既有自己的读索引和写索引,方便你对整段字节缓存进行读写,也支持get/set,方便你对其中每一个字节进行读写,他的数据结构如下图所示:
技术管理六:Netty并发性好
阻塞IO的通信方式:
非阻塞IO的通信方式:
netty的通信方式: