2017-01-18 134 views
0

我不確定這個問題是與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網絡配置?米娜配置? (從客戶端機器到服務器機器的第一條消息確實在它們連接之後出現)

我希望上面的信息可能包含一條線索。

+1

你能爲你的虛擬機,使入站通信NSG的規則?如果沒有,請參考[教程](https://docs.microsoft.com/zh-cn/azure/virtual-network/virtual-networks-create-nsg-arm-supportal)在Azure門戶上配置並嘗試你的Mina申請再次。任何更新,請隨時讓我知道。 –

+0

@ PeterPan-MSFT你是一個嚮導!謝謝!我以前不知道NSG。我在下面發佈了我的答案。 – Antonio

回答

2

我已經解決了我的問題,感謝Peter Pan - MSFT注意到約NSG - Network Security Group

NSG控制輸入/輸出規則,如Windows防火牆。您應該創建NSG,規則添加到它,並分配NSG到特定的實體:

至少有兩個選項來指定NSG:

  • 到網絡的子網
  • 到網絡接口

有一個教程1和Java代碼示例2。就我而言,爲每個虛擬機創建一個單獨的網絡接口(因爲每個虛擬機都有公共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給它(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