持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
netty之服务搭建
前文
前面介绍过netty的相关基础知识,本文将从实际应用的角度,对netty搭建服务的过程进行简单的介绍。本文内容为笔记性质,其中可能存在不准确之处。
jar包引入
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty.version}</version>
</dependency>
配置服务启动信息
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
try {
ChannelFuture channelFuture = serverBootstrap
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true)
.childHandler(new NettyServerChannelHandler())
.bind(port)
.sync();
channelFuture.channel().closeFuture().sync();
}catch (Exception e){
e.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
如上,为netty服务启动的最核心代码内容,根据上面的代码逐行进行解释。首先我们需要声明两个EventLoop组,这两个分别作为boss和worker的角色。其中的boss是后续nio处理中的selector的角色,主要作用是用于处理客户端的连接,当连接后将其分发给worker进行实际的数据处理。也就是boss主要的作用是监听,而worker才是实际业务逻辑的处理线程,以此避免阻塞。此后初始化一个初始化器,用它来进行实际参数的指定。首先需要对于boss和worker的线程组进行指定,上述的代码已经完成初始化。此后指定一个通道的处理类,声明服务采用nio的io方式进行处理。后面则是一些其他的配置参数,例如超时时间等等。最后还需要设置两个内容,其中一个是端口的绑定,指定我们采用哪个端口进行连接,另一个则是实际消息的处理类,下一部分会详细叙述。最后,对于服务进行启动。而在finally中则是统一进行平滑的服务关闭操作。
具体的消息处理
public class NettyWebsocketServerHandler extends SimpleChannelInboundHandler<Object> {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception{
super.channelActive(ctx);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception{
super.channelInactive(ctx);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{
super.channelReadComplete(ctx);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception{
super.exceptionCaught(ctx, cause);
}
如上,则是实际的消息处理类。当接收到消息时,通过上面的处理类进行实际的处理。包括消息的接收、通道的连接、异常处理等等内容,该类实际是我们处理逻辑的核心组成。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。