首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure和Apache Mina

Azure和Apache Mina
EN

Stack Overflow用户
提问于 2017-01-18 07:53:50
回答 1查看 137关注 0票数 0

我不确定这个问题是与Mina相关的,还是更多的Azure相关的,但它与网络有关。自从Mina和Netty分享了许多网络原则以来,我还添加了Netty标记。

我希望能得到一个建议,深入到哪里去。

我已经在本地网络中使用了相当长时间的Mina应用程序,现在我正在尝试将它迁移到云中。我在Azure中部署Linux虚拟机(每个虚拟机都有公共IP,但这真的很重要吗?)

他们连接(使用Mina)到Azure外面的一台机器,这台机器也有自己的公共IP。通常的事情:

代码语言:javascript
复制
SocketConnector connector = new NioSocketConnector(numberOfConnectors);
ConnectFuture connectFuture = connector.connect(new
InetSocketAddress(remoteHost, remotePort));
connectFuture.awaitUninterruptibly(connectTimeout);

Azure外的Mina机器也运行Mina。让我们称它为服务器机器。

它接受这样的连接:

代码语言:javascript
复制
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应用程序连接到服务器机器时,服务器保存

代码语言:javascript
复制
IoSession session

将来要异步地将消息推回,如下所示:

代码语言:javascript
复制
session.write(message);

这在本地网络(没有Azure)中运行良好,但在当前部署服务器中发送消息。

代码语言:javascript
复制
2017-01-17/15:45:19.823/GMT-00:00 [nioEventLoopGroup-3-3] [...] DEBUG
Sending message to /13.94.143.139:41790

而Azure机器什么也收不到。此外,一段时间后,服务器机器上会出现以下异常:

代码语言:javascript
复制
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 (是的,它是旧的,但它在本地网络上工作了几年)。

我用JavaAzureSDK1.0.0-beta3建立Azure网络

代码语言:javascript
复制
Network.DefinitionStages.WithCreate creatableNetwork = azure.networks()
                    .define(networkName)
                    .withRegion(region)
                    .withExistingResourceGroup(resourceGroup)
                    .withAddressSpace("10.0.0.0/20");

并将虚拟机创建为

代码语言:javascript
复制
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网络配置?米娜配置?(从客户端计算机到服务器计算机的第一批消息是在连接之后发出的)

我希望上述资料能提供一个线索。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 10:20:38

由于Peter Pan - MSFT注意到了NSG - Network Security Group,我解决了我的问题。

NSG控制输入/输出规则,如Windows防火墙。您应该创建NSG,向其添加规则,并将NSG分配给特定实体:

指定核供应国集团至少有两种选择:

  • 到网络子网
  • 到网络接口

有一个教程1和Java代码示例2。在我的例子中,为每个VM创建了一个单独的网络接口(因为每个VM都有公共IP)。所以,我给一个子网分配了一个NSG。

Fisrt,创建NSG:

代码语言:javascript
复制
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 )。

代码语言:javascript
复制
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门户教程
  2. 示例
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41713944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档