2017-08-09 87 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是一個非常有用的應用程序,可視化查看本地碼頭環境。