本发明涉及一种数据转发方法,特别是一种基于netty的大规模并发数据转发方法。
背景技术:
在当前,物联网技术已经广泛的应用到环保、消防、交通、测绘等多个领域。在这些应用中,传感器数据的传输起到了至关重要的作用。传感器数据一般通过无线网络发送到主机的TCP端口,并以一种固定的协议来规范传感器与主机之间的信息传输。
在多种应用场景下需要主机实现数据的转发,例如不同通讯协议之间的数据格式转换或者多服务器之间的数据透传。而在上述应用中,如果接入的客户端较多,则有可能会造成多线程并发所导致的服务器崩溃的问题。
技术实现要素:
本发明所要解决的技术问题是提供一种基于netty的大规模并发数据转发方法。
为解决上述技术问题,本发明所采用的技术方案是:
一种基于netty的大规模并发数据转发方法,其特征在于:
步骤一:初始化类型为NioEventLoopGroup的线程组clientLoopGroup,启动类型为Bootstrap的数据转发器进程引导器并进行相关设置;
步骤二:构建一个用于I/O事件处理的内隐类,并将其挂接到数据转发器进程的主通道内;
步骤三:利用步骤一中启动的数据转发器进程引导器,向接收转发数据的远程主机进行N次预连接,并将生成的N个连接通道保存在类型为ArrayBlockingQueue的通道队列queue中,同时初始化一个类型为HashMap的哈希表hash来存储已被使用的通道;
步骤四:初始化类型为NioEventLoopGroup的主线程组与从线程组bossLoopGroup和workLoopGroup;
步骤五:启动类型为ServerBootstrap的数据接收器进程引导器,并进行相关设置;
步骤六:构造主拦截器,用于接收数据进行处理,并利用步骤三中所创建的通道,将数据转发给数据接收主机;
步骤七:构建一个用于I/O事件处理的内隐类,并将其挂接到数据接收器进程的主通道内;
步骤八:利用步骤五中所构建的数据接收器引导器来绑定数据接收器进程端口,监听TCP端口发送过来的数据。
进一步地,所述步骤一中相关设置具体包括:
a) 将线程组clientLoopGroup与数据转发器进程引导器进行关联;
b) 设置clientLoopGroup的通道类型为NioSocketChannel;
c) 设置参数SO_KEEPALIVE, TCP_NODELAY的值为true。
进一步地,所述步骤二中内隐类的构造方法具体为:继承类型为ChannelInitializer<SocketChannel>的类,并重载其方法 initChannel。在该方法中对所在通道添加类型为ChannelInboundHandlerAdapter的拦截器。
进一步地,所述步骤三中通道队列queue所存储的对象为通道对象, 哈希表hash所存储的对象为一组<Key,Value>键值对,其中Key对应使用该通道的主机标示信息,Value对应被使用的通道对象。
进一步地,所述步骤三中N设置为100000。
进一步地,所述步骤五中相关设置具体包括:
a) 将主、从线程组bossLoopGroup和workLoopGroup与数据接收器进程引导器进行关联;
b) 设置主、从线程组的通道类型为NioServerSocketChannel。
进一步地,所述步骤六中的主拦截器构造方法具体为:创建一个派生自ChannelInboundHandlerAdapter的新类,并重载channelRead方法来实现数据读取之后的转发操作。
进一步地,所述步骤六中channelRead方法的重载步骤为:
根据所读取的信息来提取发送信息的标示信息,并根据所获取的主机标示信息,从哈希表的键值对中查找对应的传输通道;
a)若能够根据主机标示信息找到对应的通道对象,则将该通道返回;
b)若不能根据主机标示信息找到对应的通道对象,则从预连接的通道队列queue中提取一个新的通道,将其与主机标示信息组成键值对加入哈希表hash,并将该通道返回;
c)根据所选取的通道,将现有数据转发到目标服务器。
进一步地,所述步骤七中内隐类的构造方法具体为:派生类型为ChannelInitializer<SocketChannel>的类,并重载其函数initChannel;在该函数中对所在通道的管道内添加字符串解码器、分隔符解码器以及步骤六中所构造的主拦截器等对象。
进一步地,所述的 类型NioServerSocketChannel、NioEventLoopGroup、ServerBootstrap、Bootstrap、NioSocketChannel和ChannelInitializer<SocketChannel>均为Netty程序类库中自带的类型。
本发明与现有技术相比,具有以下优点和效果:适合于物联网环境下大量传感器数据的透传或者传输协议转换等相关的应用。能够在一台主机上同时承担数据接收器与数据转发器的功能,并能够实现数据在接收器与转发器之间的无缝转接。在一台高性能服务器上,能够模拟十万级别的通道来接收远程主机发送的原始数据,且能够模拟十万级别的通道与数据接收主机连接,实现数据的转发或透传。
附图说明
图1是本发明的一种基于netty的大规模并发数据转发方法的框架图。
图2是本发明的一种基于netty的大规模并发数据转发方法的流程图。
具体实施方式
下面结合附图并通过实施例对本发明作进一步的详细说明,以下实施例是对本发明的解释而本发明并不局限于以下实施例。
如图所示,本发明的一种基于netty的大规模并发数据转发方法,包含以下步骤:
步骤一:初始化类型为NioEventLoopGroup的线程组clientLoopGroup,启动类型为Bootstrap的数据转发器进程引导器并进行相关设置;相关设置具体包括:
a) 将线程组clientLoopGroup与数据转发器进程引导器进行关联;
b) 设置clientLoopGroup的通道类型为NioSocketChannel;
c) 设置参数SO_KEEPALIVE, TCP_NODELAY的值为true。
步骤二:构建一个用于I/O事件处理的内隐类,并将其挂接到数据转发器进程的主通道内;内隐类的构造方法具体为:继承类型为ChannelInitializer<SocketChannel>的类,并重载其方法 initChannel。在该方法中对所在通道添加类型为ChannelInboundHandlerAdapter的拦截器。
步骤三:利用步骤一中启动的数据转发器进程引导器,向接收转发数据的远程主机进行N次预连接,并将生成的N个连接通道保存在类型为ArrayBlockingQueue的通道队列queue中,同时初始化一个类型为HashMap的哈希表hash来存储已被使用的通道;通道队列queue所存储的对象为通道对象, 哈希表hash所存储的对象为一组<Key,Value>键值对,其中Key对应使用该通道的主机标示信息,Value对应被使用的通道对象。可根据实际的应用需求设置预连接的连接通道总数N。默认情况下,N设置为100000。
步骤四:初始化类型为NioEventLoopGroup的主线程组与从线程组bossLoopGroup和workLoopGroup;
步骤五:启动类型为ServerBootstrap的数据接收器进程引导器,并进行相关设置;相关设置具体包括:
a) 将主、从线程组bossLoopGroup和workLoopGroup与数据接收器进程引导器进行关联;
b) 设置主、从线程组的通道类型为NioServerSocketChannel。
步骤六:构造主拦截器,用于接收数据进行处理,并利用步骤三中所创建的通道,将数据转发给数据接收主机;主拦截器构造方法具体为:创建一个派生自ChannelInboundHandlerAdapter的新类,并重载channelRead方法来实现数据读取之后的转发操作。channelRead方法的重载步骤为:
根据所读取的信息来提取发送信息的标示信息,并根据所获取的主机标示信息,从哈希表的键值对中查找对应的传输通道;
a)若能够根据主机标示信息找到对应的通道对象,则将该通道返回;
b)若不能根据主机标示信息找到对应的通道对象,则从预连接的通道队列queue中提取一个新的通道,将其与主机标示信息组成键值对加入哈希表hash,并将该通道返回;
c)根据所选取的通道,将现有数据转发到目标服务器。
步骤七:构建一个用于I/O事件处理的内隐类,并将其挂接到数据接收器进程的主通道内;内隐类的构造方法具体为:派生类型为ChannelInitializer<SocketChannel>的类,并重载其函数initChannel;在该函数中对所在通道的管道内添加字符串解码器、分隔符解码器以及步骤六中所构造的主拦截器等对象。
步骤八:利用步骤五中所构建的数据接收器引导器来绑定数据接收器进程端口,监听TCP端口发送过来的数据。
上述步骤所有类型NioServerSocketChannel、NioEventLoopGroup、ServerBootstrap、Bootstrap、NioSocketChannel和ChannelInitializer<SocketChannel>均为Netty程序类库中自带的类型。
本发明公开了一种基于Netty的大规模并发数据转发方法,适合于物联网环境下大量传感器数据的透传或者传输协议转换等相关的应用。
该方法包括数据转发器与数据接收器的构建。其中,数据接收器主要接收远程主机的数据信息,将其进行解析后查找数据转发器中的合适通道进行转发;数据转发器主要负责向远程接收主机进行数据传输,针对接收到的数据,模拟多个通道向远程主机发送数据。数据转发器的构建流程主要包括线程组的初始化,引导器的初始化,传输通道的参数设置,内隐类的构造以及远程接收主机连接通道的创建等步骤。数据接收器的构建流程主要包括主、从线程组的初始化、主拦截器的构造、内隐类的构造以及数据监听等步骤。
本发明中所描述内容适合基于本框架的数据转发与透传,相关技术人员可以根据具体应用场景来进行修改。若为数据透传,可将数据原样转发;若为协议转换后的数据转发,则可编写协议转换的具体代码后,将数据进行转发。本发明所描述的方法可支持十万级别并发量的数据转发。
本说明书中所描述的以上内容仅仅是对本发明所作的举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种修改或补充或采用类似的方式替代,只要不偏离本发明说明书的内容或者超越本权利要求书所定义的范围,均应属于本发明的保护范围。