使用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
ChannelPool
与channelGroup
的区别
ChannelPool
是用来实现池化操作,像是数据库连接池、httpClient等,而channelGroup
是用来实现广播或者批量操作,比如一次性关闭同一个组中的所有Channel
或者是同时发送一条消息到同一个组中的所有Channel
。