问题遇到的现象和发生背景
因业务需要,我们netty服务端需要新监听一个端口号 8866,用来接收新报文格式的报文,测试环境正常,可投产以后偶发性的会给客户端报connection refused by remote host,十次有两次这种情况。
问题相关代码,请勿粘贴截图
1 |
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">App</span> { <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">( String[] args )</span> <span class="hljs-keyword">throws</span> Exception { <span class="hljs-type">CodeServer</span> <span class="hljs-variable">codeServer</span> <span class="hljs-operator">=</span> SpringBeanUtil.getBean(<span class="hljs-string">"codeServer"</span>,CodeServer.class); <span class="hljs-type">NewCodeServer</span> <span class="hljs-variable">newCodeServer</span> <span class="hljs-operator">=</span> SpringBeanUtil.getBean(<span class="hljs-string">"newCodeServer"</span>,NewCodeServer.class); <span class="hljs-keyword">try</span> { <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Runnable</span>() { <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> { <span class="hljs-keyword">try</span> { codeServer.start(); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } } }).start(); <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Runnable</span>() { <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> { <span class="hljs-keyword">try</span> { newCodeServer.start(); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } } }).start(); } <span class="hljs-keyword">catch</span> (Exception e) { e.printStackTrace(); } } } |
NewCodeServer :
1 |
@<span class="hljs-constructor">Service(<span class="hljs-string">"newCodeServer"</span>)</span> public <span class="hljs-keyword">class</span> NewCodeServer { <span class="hljs-keyword">private</span> static final Logger logger = <span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">LoggerFactory</span>.</span></span>get<span class="hljs-constructor">Logger(NewCodeServer .<span class="hljs-params">class</span>)</span>; public NewCodeServer <span class="hljs-literal">()</span> { } @Autowired <span class="hljs-keyword">private</span> NewCodeServerInitializer newCodeServerInitializer; public void start<span class="hljs-literal">()</span> throws Exception { EventLoopGroup bossGroup =<span class="hljs-keyword">new</span> <span class="hljs-constructor">NioEventLoopGroup()</span>; EventLoopGroup work =<span class="hljs-keyword">new</span> <span class="hljs-constructor">NioEventLoopGroup()</span>; <span class="hljs-keyword">try</span>{ ServerBootstrap b = <span class="hljs-keyword">new</span> <span class="hljs-constructor">ServerBootstrap()</span>; b.group(bossGroup,work).channel(<span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">NioServerSocketChannel</span>.</span></span><span class="hljs-keyword">class</span>).local<span class="hljs-constructor">Address(8866)</span> .child<span class="hljs-constructor">Handler(<span class="hljs-params">newCodeServerInitializer</span>)</span>; ChannelFuture cf = b.bind<span class="hljs-literal">()</span>.sync<span class="hljs-literal">()</span>; logger.info(<span class="hljs-module-access"><span class="hljs-module"><span class="hljs-identifier">NewCodeServer</span>.</span></span><span class="hljs-keyword">class</span> + <span class="hljs-string">" started and listen on "</span> + cf.channel<span class="hljs-literal">()</span>.local<span class="hljs-constructor">Address()</span>); cf.channel<span class="hljs-literal">()</span>.close<span class="hljs-constructor">Future()</span>.sync<span class="hljs-literal">()</span>; }finally{ bossGroup.shutdown<span class="hljs-constructor">Gracefully()</span>.sync<span class="hljs-literal">()</span>; work.shutdown<span class="hljs-constructor">Gracefully()</span>.sync<span class="hljs-literal">()</span>; } } } |
NewCodeServerInitializer :
1 |
(<span class="hljs-string">"newCodeServerInitializer"</span>) public <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NewCodeServerInitializer</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ChannelInitializer<SocketChannel></span></span>{ <span class="hljs-keyword">private</span> <span class="hljs-type">NewCodeServerHandler</span> newCodeServerHandler; <span class="hljs-keyword">protected</span> void initChannel(<span class="hljs-type">SocketChannel</span> ch) <span class="hljs-keyword">throws</span> <span class="hljs-type">Exception</span> { <span class="hljs-type">ChannelPipeline</span> cp = ch.pipeline(); <span class="hljs-type">ByteBuf</span> delimiter = <span class="hljs-type">Unpooled</span>.copiedBuffer(<span class="hljs-string">"/r/n"</span>.getByte()); cp.addLast( <span class="hljs-keyword">new</span> <span class="hljs-type">DelimiterBasedFrameDecoder</span>(<span class="hljs-number">10240</span>,delimiter)); cp.addLast( <span class="hljs-keyword">new</span> <span class="hljs-type">StringEncoder</span>()); cp.addLast( <span class="hljs-keyword">new</span> <span class="hljs-type">StringDecoder</span>( )); cp.addLast(<span class="hljs-string">"chunkedWriteHandler"</span>, <span class="hljs-keyword">new</span> <span class="hljs-type">ChunkedWriteHandler</span>()); cp.addLast(<span class="hljs-string">"NewCodeServerHandler "</span>,newCodeServerHandler); } } |
运行结果及报错内容
这个是报错现象:
我的解答思路和尝试过的方法
我原先以为是网络问题,可是网络抓包分析发现并不是;
网上说可能是连接数过多了,cat /proc/sys/net/ipv4/tcp_max_syn_backlog 服务器最大连接数:2048
当前连接数:
我想要达到的结果
希望能给点思路,已经愁的快秃顶了