Я не уверен, связан ли этот вопрос с Mina или более связан с Azure, но он связан с сетью. Я также добавил тэг Netty
, так как Mina и Netty используют многие сетевые принципы.Azure и Apache Mina
Надеюсь получить совет, куда врываться.
Я использовал некоторое приложение Mina довольно долго в локальной сети, теперь я пытаюсь перенести его в облако. Я развертываю виртуальные машины Linux в Azure (у каждого есть открытый IP-адрес, но действительно ли это имеет значение?).
Они подключаются (используя Мину) к машине за пределами Azure, которая также имеет собственный IP-адрес . Обычная вещь:
SocketConnector connector = new NioSocketConnector(numberOfConnectors);
ConnectFuture connectFuture = connector.connect(new
InetSocketAddress(remoteHost, remotePort));
connectFuture.awaitUninterruptibly(connectTimeout);
Эта машина Мины за пределами Лазурного берега также управляет Миной. Назовем это серверной машиной.
Он принимает соединения, как это:
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
Я использую Mina версии 2.0.4 (да, это старая, но она работает в локальной сети в течение нескольких лет в настоящее время).
I Настройка Azure сети с Java Azure SDK 1.0.0-бета3
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 для вашей VM, чтобы позволить входящие соединения? Если нет, обратитесь к [учебнику] (https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-create-nsg-arm-pportal) для настройки на портале Azure и попробуйте ваше приложение Мины снова. Любое обновление, пожалуйста, сообщите мне. –
@ PeterPan-MSFT вы волшебник! Спасибо! Раньше я не знал о NSG. Я написал свой ответ ниже. – Antonio