我正在使用 Netty 通过 TCP 实现协议的服务器和客户端。在服务器端,我为它侦听的每个端口创建了一个 bootStrap 和 pipelineFactory 类的实例,它运行良好且快速。
但是在客户端,我对如何构建它没有一个清晰的想法。我需要打开数千个连接到数千个不同的目的地。我正在 Spring Framework 上开发项目,因此我可以轻松创建单例 bean 并将它们作为属性注入。我正在评估 3 个选项:
使用 ClientBootstrap 和 PipelineFactory 的单例实例。每个连接都使用这样的代码来获取通道:
public Channel connect(final InetSocketAddress serverAddress, final ChannelPipelineFactory pipelineFactory, int timeout, TimeUnit unit) throws InterruptedException { ChannelFuture future; synchronized (bootstrap){ bootstrap.setPipelineFactory(pipelineFactory); future = bootstrap.connect(serverAddress); future.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { //TODO set here some channelLocal properties I need to configure the session (eg: user, password etc...) } else{ throw new RuntimeException(future.getCause() .getMessage()); } } }); } return future.getChannel();
}
我的解决方案还必须能够配置管道以启用或禁用 SSL 或日志处理程序,也许使用此Abe 解决方案来配置 getPipeline()
我的第二个选择是使用 ClientBootstrap 的单例实例,但在每个传出客户端连接上创建一个新的 PipelineFactory。这有助于我配置我拥有的管道,因为我可以在 pipelineFactory 实例上设置属性。
第三个选项是在每个传出连接上创建新的 bootStrap 对象和 pipelineFactory。这允许我在每个连接上配置 tcp.delay 或 tcp.keepalive 等属性,并允许我删除连接方法上的同步块,这可以加快客户端连接。
我认为第一个是最快的并且使用最少的内存,但第三个是最可配置的并且可能易于开发。
你能给我一些关于这种方法的优缺点的建议吗?也许其中一个是错的?
非常感谢你!