Netty 客户端开发连接池


使用Netty提供的连接池

通常来说,使用netty开发服务端应用不需要使用到连接池来管理客户端与服务端的连接,但是在客户端开发中,在发送请求时就新开一个Tcp连接会导致性能低下,所以在web开发中我们会使用到Druid这样的数据库连接池。

Netty在4.0.28.Final 版本发布时添加了ChannelPool接口,方便开发客户端池化Channel,以此减少重复代码。在Reactor-netty中就使用到了ChannelPool来开发它自己的HttpClient

官方提供的使用案例

public static void main(string[] args){
        EventLoopGroup group = new NioEventLoopGroup();
        final Bootstrap cb = new Bootstrap();
        InetSocketAddress addr1 = new InetSocketAddress("10.0.0.10", 8888);
        InetSocketAddress addr2 = new InetSocketAddress("10.0.0.11", 8888);

        cb.group(group).channel(NioSocketChannel.class);

        ChannelPoolMap<InetSocketAddress, SimpleChannelPool> poolMap = new AbstractChannelPoolMap<InetSocketAddress, SimpleChannelPool>() {
            @Override
            protected SimpleChannelPool newPool(InetSocketAddress key) {
                return new SimpleChannelPool(cb.remoteAddress(key), new TestChannelPoolHandler());
            }
        };

        // depending on when you use addr1 or addr2 you will get different pools.
        final SimpleChannelPool pool = poolMap.get(addr1);
        Future<Channel> f = pool.acquire();
        f.addListener(new FutureListener<Channel>() {
            @Override
            public void operationComplete(Future<Channel> f) {
                if (f.isSuccess()) {
                    Channel ch = f.getNow();
                    // Do somethings
                    // ...
                    // ...

                    // Release back to pool
                    pool.release(ch);
                }
            }
        });
}

TIP:ChannelPoolMap的key可以是任何对象,所以极其灵活,比如它还可以是不同的EventLoop

ChannelPoolchannelGroup的区别

ChannelPool是用来实现池化操作,像是数据库连接池、httpClient等,而channelGroup是用来实现广播或者批量操作,比如一次性关闭同一个组中的所有Channel或者是同时发送一条消息到同一个组中的所有Channel


文章作者: Ubi-potato
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ubi-potato !
评论
  目录