2017-01-18 7 views
0

Я не уверен, связан ли этот вопрос с 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? Конфигурация Мины? (первые сообщения с клиентских машин на серверную машину поступают после их подключения)

Надеюсь, что над информацией может быть ключ.

+1

Вы могли бы создать правило NSG для вашей VM, чтобы позволить входящие соединения? Если нет, обратитесь к [учебнику] (https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-create-nsg-arm-pportal) для настройки на портале Azure и попробуйте ваше приложение Мины снова. Любое обновление, пожалуйста, сообщите мне. –

+0

@ PeterPan-MSFT вы волшебник! Спасибо! Раньше я не знал о NSG. Я написал свой ответ ниже. – Antonio

ответ

2

Я решил свою проблему благодаря Peter Pan - MSFT, отметив около NSG - Network Security Group.

NSG контролирует правила входа/выхода, такие как брандмауэр Windows.Вы должны создать NSG, добавить правила к нему, и назначить NSG для конкретного объекта:

Есть по крайней мере два варианта назначить NSG:

  • к сети подсети
  • к сетевому интерфейсу

Существует учебное пособие 1 и пример кода Java 2. В моем случае для каждой виртуальной машины создается отдельный сетевой интерфейс (поскольку каждая виртуальная машина имеет открытый IP-адрес). Итак, я назначил одну NSG для одной подсети.

Fisrt, создать 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 к нему (subnet1 автоматически создается без NSG, если никто не определен явно)

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(); 

Так , остальная часть кода остается такой же, как и в предыдущем вопросе.

Полезные ссылки:

  1. Azure Portal Tutorial
  2. Java Azure SDK NSG Example