2017-08-09 112 views
0

我使用docker支持创建了一个简单的.net核心控制台应用程序。正在关注
Masstransit代码无法连接到主机上的RabbitMQ实例。但是使用RabitMq.Client的类似实现能够连接到主机RabbitMQ实例。Masstransit无法从码头集装箱访问主机RabbitMQ

Masstransit抛出

MassTransit.RabbitMqTransport.RabbitMqConnectionException:连接失败 :[email protected]:5672/---> RabbitMQ.Client.Exceptions.BrokerUnreachableException:

主机机器IP:192.168.0.9

使用Masstransit

 string rabbitMqUri = "rabbitmq://192.168.0.9/"; 
     string userName = "ctas"; 
     string password = "[email protected]"; 
     string assetServiceQueue = "hello"; 


     var bus = Bus.Factory.CreateUsingRabbitMq(cfg => 
     { 
      var host = cfg.Host(new Uri(rabbitMqUri), hst => 
      { 
       hst.Username(userName); 
       hst.Password(password); 
      }); 

      cfg.ReceiveEndpoint(host, 
       assetServiceQueue, e => 
       { 
        e.Consumer<AddNewAssetReceivedConsumer>(); 

       }); 

     }); 


     bus.Start(); 
     Console.WriteLine("Service Running.... Press enter to exit"); 
     Console.ReadLine(); 
     bus.Stop(); 

使用RabbitMQ的客户

 public static void Main() 
    { 
     var factory = new ConnectionFactory(); 
     factory.UserName = "ctas"; 
     factory.Password = "[email protected]"; 
     factory.VirtualHost = "watcherindustry"; 
     factory.HostName = "192.168.0.9"; 
     using (var connection = factory.CreateConnection()) 
     using (var channel = connection.CreateModel()) 
     { 
      channel.QueueDeclare(queue: "hello", 
           durable: false, 
           exclusive: false, 
           autoDelete: false, 
           arguments: null); 

      var consumer = new EventingBasicConsumer(channel); 
      consumer.Received += (model, ea) => 
      { 
       var body = ea.Body; 
       var message = Encoding.UTF8.GetString(body); 
       Console.WriteLine(" [x] Received {0}", message); 
      }; 
      channel.BasicConsume(queue: "hello", 
           autoAck: true, 
           consumer: consumer); 

      Console.WriteLine(" Press [enter] to exit."); 
      Console.ReadLine(); 
     } 
    } 

泊坞文件

FROM microsoft/dotnet:1.1-runtime 
ARG source 
WORKDIR /app 
COPY ${source:-obj/Docker/publish} . 
ENTRYPOINT ["dotnet", "TestClient.dll"] 

Dependencies

+0

您没有连接到MassTransit中的虚拟主机,为什么? –

回答

0

感谢您的回复。我设法解决了这个问题。我的发现如下。

要连接到另一个码头集装箱上的rabbitmq实例,它们必须移动/连接到同一个网络。要做到这一点 创建newtork

docker network create -d bridge my_bridge 

两个应用程序和RabbitMQ的集装箱连接到同一个网络

docker network connect my_bridge <container name> 

对于masstransit URI使用RabbitMQ的容器IP对网络或容器名称

要从Docker容器上的应用连接主机的rabbitmq实例。 masstransit uri应该包括机器名称(我试过IP,那是行不通的)

0

尝试使用MassTransit配置虚拟主机太多,不知道为什么你决定忽略它。

var host = cfg.Host("192.168.0.9", "watcherindustry", hst => 
{ 
    hst.Username(userName); 
    hst.Password(password); 
}); 
+0

感谢您的回复。但它没有或没有虚拟主机。我也使用你的主机重载来对抗基于URI的重载。 – pats

+0

正如你所看到的,异常是由RabbitMQ客户端库产生的,所以我不希望这是与MassTransit相关的东西。 –

+0

您的意思是MassTransit.RabbitMQ,我正在使用(https://www.nuget.org/packages/MassTransit.RabbitMQ/4.0.0.1216-develop)。否则,我没有任何RabbitMQ库参考。 – pats

0

看看你的问题阿列克谢Zimarev评论,如果你的兔子的容器上运行,那么它应该在您的码头工人,compese文件,然后使用您的端点定义,进入连接到兔子,因为码头工人创造的内部网络上,你是从源代码无关......

rabbitmq: 
    container_name: "rabbitmq-yournode01" 
    hostname: rabbit 
    image: rabbitmq:3.6.6-management 
    environment: 
     - RABBITMQ_DEFAULT_USER=yourusergoeshere 
     - RABBITMQ_DEFAULT_PASS=yourpasswordgoeshere 
     - RABBITMQ_DEFAULT_VHOST=vhost 
    volumes: 
     - rabbit-volume:/var/lib/rabbitmq 
    ports: 
     - "5672:5672" 
     - "15672:15672" 

在您的应用程序设置,您应该有一些谎言:

"ConnectionString": "host=rabbitmq:5672;virtualHost=vhost;username=yourusergoeshere;password=yourpasswordgoeshere;timeout=0;prefetchcount=1", 

如果你会使用EasyNEtQ你可以这样做:

_bus = RabbitHutch.CreateBus(_connectionString); // The one above 

我希望它能帮助,

胡安

+0

谢谢,但RabbitMQ在主机上。在Docker容器内运行的应用程序试图使用masstransit访问该RabbitMQ实例。 Masstransit连接在该设置中失败,但RabbitMq客户端成功。 – pats

0

我创建了一个example,并能够连接我的主机,使用预览包从masstransit。在泊坞窗

开始的RabbitMQ和暴露主机

docker run -d -p 5672:5672 -p 15672:15672 --hostname my-rabbit --name some-rabbit rabbitmq:3-management 

编译和运行控制台应用程序的端口。

docker build -t dotnetapp . 
docker run -d -e RABBITMQ_URI=rabbitmq://guest:[email protected]:5672 --name some-dotnetapp dotnetapp 

要验证您的邮件接收运行

docker logs some-dotnetapp --follow 

,你应该看到下面的输出

Application is starting... 
Connecting to rabbitmq://guest:[email protected]:5672 
Received: Hello, World [08/12/2017 04:35:53] 
Received: Hello, World [08/12/2017 04:35:58] 
Received: Hello, World [08/12/2017 04:36:03] 
Received: Hello, World [08/12/2017 04:36:08] 
Received: Hello, World [08/12/2017 04:36:13] 
... 

注:

172.17.0.2是我的兔容器的IP地址,但你可以用你的机器ip地址代替它 http://localhost:15672是rabbitmq管理控制台以guest用户名和密码登录。

最后portainer.io是一个非常有用的应用程序,可视化查看本地码头环境。

相关问题