package com.farsunset.httpserver.configuration; import com.farsunset.httpserver.netty.iohandler.InterceptorHandler; import com.farsunset.httpserver.netty.iohandler.FilterLogginglHandler; import com.farsunset.httpserver.netty.iohandler.HttpServerHandler; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioChannelOption; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import org.springframework.lang.NonNull; import javax.annotation.Resource; @Configuration public class NettyHttpServer implements ApplicationListener<ApplicationStartedEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(NettyHttpServer.class); @Value("${server.port}") private int port; @Resource private InterceptorHandler interceptorHandler; @Resource private HttpServerHandler httpServerHandler; @Override public void onApplicationEvent(@NonNull ApplicationStartedEvent event) { ServerBootstrap bootstrap = new ServerBootstrap(); EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); bootstrap.group(bossGroup, workerGroup); bootstrap.channel(NioServerSocketChannel.class); bootstrap.childOption(NioChannelOption.TCP_NODELAY, true); bootstrap.childOption(NioChannelOption.SO_REUSEADDR,true); bootstrap.childOption(NioChannelOption.SO_KEEPALIVE,false); bootstrap.childOption(NioChannelOption.SO_RCVBUF, 2048); bootstrap.childOption(NioChannelOption.SO_SNDBUF, 2048); bootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast("codec", new HttpServerCodec()); ch.pipeline().addLast("aggregator", new HttpObjectAggregator(512 * 1024)); ch.pipeline().addLast("logging", new FilterLogginglHandler()); ch.pipeline().addLast("interceptor", interceptorHandler); ch.pipeline().addLast("bizHandler", httpServerHandler); } }) ; ChannelFuture channelFuture = bootstrap.bind(port).syncUninterruptibly().addListener(future -> { String logBanner = "\n\n" + "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" + "* *\n" + "* *\n" + "* Netty Http Server started on port {}. *\n" + "* *\n" + "* *\n" + "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"; LOGGER.info(logBanner, port); }); channelFuture.channel().closeFuture().addListener(future -> { LOGGER.info("Netty Http Server Start Shutdown ............"); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); }); } }