Azure 和 Apache Mina
Azure and Apache Mina
我不确定这个问题是与 Mina 相关还是与 Azure 更相关,但它与网络有关。我还添加了 Netty
标签,因为 Mina 和 Netty 共享许多网络原则。
我希望能得到一些建议。
我已经在本地网络中使用了某个Mina应用程序很长时间了,现在我正在尝试将其迁移到云端。我在 Azure 中部署了 Linux 个虚拟机(每个都有 public 个 IP,但这真的很重要吗?)。
他们连接(使用 Mina)到 Azure 之外的一台机器,该机器也有它的
拥有 public IP。平常事:
SocketConnector connector = new NioSocketConnector(numberOfConnectors);
ConnectFuture connectFuture = connector.connect(new
InetSocketAddress(remoteHost, remotePort));
connectFuture.awaitUninterruptibly(connectTimeout);
Azure 之外的那台 Mina 机器也运行着 Mina。让我们称之为
服务器机器。
它接受这样的连接:
NioSocketAcceptor acceptor = new NioSocketAcceptor(acceptor_threads);
org.apache.mina.core.buffer.IoBuffer.setUseDirectBuffer(false);
acceptor.getSessionConfig().setTcpNoDelay(true);
acceptor.setReuseAddress(true);
acceptor.getSessionConfig().setSendBufferSize(buffer_size);
acceptor.getSessionConfig().setMinReadBufferSize(64000);
acceptor.getSessionConfig().setReceiveBufferSize(buffer_size);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, iddle_time);
acceptor.getFilterChain().addLast("codec", new
ProtocolCodecFilter(CodecFactory.getInstance()));
acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
当 Azure 应用程序连接到服务器计算机时,服务器保存
IoSession session
将来像这样异步推送消息:
session.write(message);
这在本地网络(没有 Azure)中运行良好,但在当前
部署服务器发送消息
2017-01-17/15:45:19.823/GMT-00:00 [nioEventLoopGroup-3-3] [...] DEBUG
Sending message to /13.94.143.139:41790
并且 Azure 机器没有收到任何东西。而且,经过一个
服务器机器上出现以下异常:
2017-01-17/16:01:11.419/GMT-00:00 [NioProcessor-4] [...] ERROR
Exception in IOHandlerConnection timed out
java.io.IOException: Connection timed out
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:280)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:44)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:695)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access0(AbstractPollingIoProcessor.java:68)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1141)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
2017-01-17/16:01:11.424/GMT-00:00 [NioProcessor-3] [...] DEBUG sessionClosed
我使用的是 Mina 2.0.4 版(是的,它很旧,但现在可以在本地网络上使用几年了)。
我使用 Java Azure SDK 1.0.0-beta3
设置 Azure 网络
Network.DefinitionStages.WithCreate creatableNetwork = azure.networks()
.define(networkName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withAddressSpace("10.0.0.0/20");
并创建虚拟机为
VirtualMachine.DefinitionStages.WithCreate creatableVirtualMachine =
azure.virtualMachines()
.define(String.format(...))
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withNewPrimaryNetwork(creatableNetwork)
.withPrimaryPrivateIpAddressStatic(inetAddress.getHostAddress())
.withNewPrimaryPublicIpAddress(String.format("chr-vm-%04d", i)) .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS)
.withRootUserName(linuxUserName)
.withPassword(linuxUserPassword)
.withSize(VirtualMachineSizeTypes.STANDARD_D2_V2)
.withNewStorageAccount(creatableStorageAccount);
我想知道什么原因可能会阻止将消息从服务器传送到
Azure 客户端机器? Azure 网络配置?米娜配置? (从客户端机器到服务器机器的第一条消息在连接后确实会出现)
希望以上信息能有所线索
感谢 Peter Pan - MSFT
注意到 NSG - Network Security Group
。
我已经解决了我的问题
NSG 像 Windows 防火墙一样控制 in/out 规则。您应该创建 NSG,向其添加规则,并将 NSG 分配给特定实体:
至少有两个分配 NSG 的选项:
- 到网络子网
- 到网络接口
有教程1 and Java code sample 2。在我的例子中,为每个 VM 创建了一个单独的网络接口(因为每个 VM 都有 public IP)。因此,我将一个 NSG 分配给一个子网。
首先,创建 NSG:
NetworkSecurityGroup NSG = azure.networkSecurityGroups()
.define(networkSecurityGroup)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.defineRule("Inbound")
.allowInbound()
.fromAnyAddress()
.fromAnyPort()
.toAnyAddress()
.toAnyPort()
.withAnyProtocol()
.withDescription("Incoming messsages")
.withPriority(100)
.attach()
.create();
然后修改代码以显式定义子网并为其分配 NSG(如果 none 明确定义,则在没有 NSG 的情况下自动创建 subnet1
)
Network.DefinitionStages.WithCreate creatableNetwork = azure.networks()
.define(networkName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withAddressSpace("10.0.0.0/20")
.defineSubnet(subnetName)
.withAddressPrefix("10.0.0.0/20")
.withExistingNetworkSecurityGroup(NSG)
.attach();
因此,其余代码与上面问题中发布的代码相同。
有用的链接:
我不确定这个问题是与 Mina 相关还是与 Azure 更相关,但它与网络有关。我还添加了 Netty
标签,因为 Mina 和 Netty 共享许多网络原则。
我希望能得到一些建议。
我已经在本地网络中使用了某个Mina应用程序很长时间了,现在我正在尝试将其迁移到云端。我在 Azure 中部署了 Linux 个虚拟机(每个都有 public 个 IP,但这真的很重要吗?)。
他们连接(使用 Mina)到 Azure 之外的一台机器,该机器也有它的 拥有 public IP。平常事:
SocketConnector connector = new NioSocketConnector(numberOfConnectors);
ConnectFuture connectFuture = connector.connect(new
InetSocketAddress(remoteHost, remotePort));
connectFuture.awaitUninterruptibly(connectTimeout);
Azure 之外的那台 Mina 机器也运行着 Mina。让我们称之为 服务器机器。
它接受这样的连接:
NioSocketAcceptor acceptor = new NioSocketAcceptor(acceptor_threads);
org.apache.mina.core.buffer.IoBuffer.setUseDirectBuffer(false);
acceptor.getSessionConfig().setTcpNoDelay(true);
acceptor.setReuseAddress(true);
acceptor.getSessionConfig().setSendBufferSize(buffer_size);
acceptor.getSessionConfig().setMinReadBufferSize(64000);
acceptor.getSessionConfig().setReceiveBufferSize(buffer_size);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, iddle_time);
acceptor.getFilterChain().addLast("codec", new
ProtocolCodecFilter(CodecFactory.getInstance()));
acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
当 Azure 应用程序连接到服务器计算机时,服务器保存
IoSession session
将来像这样异步推送消息:
session.write(message);
这在本地网络(没有 Azure)中运行良好,但在当前 部署服务器发送消息
2017-01-17/15:45:19.823/GMT-00:00 [nioEventLoopGroup-3-3] [...] DEBUG
Sending message to /13.94.143.139:41790
并且 Azure 机器没有收到任何东西。而且,经过一个 服务器机器上出现以下异常:
2017-01-17/16:01:11.419/GMT-00:00 [NioProcessor-4] [...] ERROR
Exception in IOHandlerConnection timed out
java.io.IOException: Connection timed out
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:280)
at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:44)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:695)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access0(AbstractPollingIoProcessor.java:68)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1141)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
2017-01-17/16:01:11.424/GMT-00:00 [NioProcessor-3] [...] DEBUG sessionClosed
我使用的是 Mina 2.0.4 版(是的,它很旧,但现在可以在本地网络上使用几年了)。
我使用 Java Azure SDK 1.0.0-beta3
设置 Azure 网络Network.DefinitionStages.WithCreate creatableNetwork = azure.networks()
.define(networkName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withAddressSpace("10.0.0.0/20");
并创建虚拟机为
VirtualMachine.DefinitionStages.WithCreate creatableVirtualMachine =
azure.virtualMachines()
.define(String.format(...))
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withNewPrimaryNetwork(creatableNetwork)
.withPrimaryPrivateIpAddressStatic(inetAddress.getHostAddress())
.withNewPrimaryPublicIpAddress(String.format("chr-vm-%04d", i)) .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS)
.withRootUserName(linuxUserName)
.withPassword(linuxUserPassword)
.withSize(VirtualMachineSizeTypes.STANDARD_D2_V2)
.withNewStorageAccount(creatableStorageAccount);
我想知道什么原因可能会阻止将消息从服务器传送到 Azure 客户端机器? Azure 网络配置?米娜配置? (从客户端机器到服务器机器的第一条消息在连接后确实会出现)
希望以上信息能有所线索
感谢 Peter Pan - MSFT
注意到 NSG - Network Security Group
。
NSG 像 Windows 防火墙一样控制 in/out 规则。您应该创建 NSG,向其添加规则,并将 NSG 分配给特定实体:
至少有两个分配 NSG 的选项:
- 到网络子网
- 到网络接口
有教程1 and Java code sample 2。在我的例子中,为每个 VM 创建了一个单独的网络接口(因为每个 VM 都有 public IP)。因此,我将一个 NSG 分配给一个子网。
首先,创建 NSG:
NetworkSecurityGroup NSG = azure.networkSecurityGroups()
.define(networkSecurityGroup)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.defineRule("Inbound")
.allowInbound()
.fromAnyAddress()
.fromAnyPort()
.toAnyAddress()
.toAnyPort()
.withAnyProtocol()
.withDescription("Incoming messsages")
.withPriority(100)
.attach()
.create();
然后修改代码以显式定义子网并为其分配 NSG(如果 none 明确定义,则在没有 NSG 的情况下自动创建 subnet1
)
Network.DefinitionStages.WithCreate creatableNetwork = azure.networks()
.define(networkName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withAddressSpace("10.0.0.0/20")
.defineSubnet(subnetName)
.withAddressPrefix("10.0.0.0/20")
.withExistingNetworkSecurityGroup(NSG)
.attach();
因此,其余代码与上面问题中发布的代码相同。
有用的链接: