我不確定這個問題是與Mina相關還是與Azure相關,但它與網絡有關。我還添加了Netty
標籤,因爲Mina和Netty分享了許多聯網原則。Azure和Apache Mina
我希望得到一個建議,在哪裏挖掘。
我在本地網絡中使用了很長的Mina應用程序,現在我試圖將它遷移到雲中。我在Azure中部署Linux虛擬機(每個都有公有IP,但確實很重要?)。
它們將使用Mina連接到Azure以外的機器,該機器的公有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.access$600(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
我用米娜版本2.0.4(是的,它是舊的,但它工作在本地網絡上數年現在)。
我安裝了Java SDK天青1.0.0-β3Azure的網絡
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網絡配置?米娜配置? (從客戶端機器到服務器機器的第一條消息確實在它們連接之後出現)
我希望上面的信息可能包含一條線索。
你能爲你的虛擬機,使入站通信NSG的規則?如果沒有,請參考[教程](https://docs.microsoft.com/zh-cn/azure/virtual-network/virtual-networks-create-nsg-arm-supportal)在Azure門戶上配置並嘗試你的Mina申請再次。任何更新,請隨時讓我知道。 –
@ PeterPan-MSFT你是一個嚮導!謝謝!我以前不知道NSG。我在下面發佈了我的答案。 – Antonio