代码之家  ›  专栏  ›  技术社区  ›  Red Riding Hood

如何在docker compose中使用主机名连接到RabbitMQ流插件

  •  0
  • Red Riding Hood  · 技术社区  · 1 年前

    我以中的示例为例: https://rabbitmq.github.io/rabbitmq-stream-dotnet-client/stable/htmlsingle/index.html

    我的应用程序通过docker compose运行:

    例如

    version: '3.8'
    
    services:
      rabbitmq:
        image: rabbitmq
        ports:
          - "5672:5672"  # AMQP
          - "15672:15672"  # RabbitMQ Management UI
          - "5552:5552"  # Streams
        volumes:
          - ./rabbitmq-plugins.txt:/etc/rabbitmq/enabled_plugins 
    
      dotnetapp:
        image: mcr.microsoft.com/dotnet/runtime:8.0
        volumes:
          - ./bin/Debug/net8.0/linux-x64:/app  
        working_dir: /app
        command: dotnet Example.dll  
        depends_on:
          - rabbitmq
    

    然而,使用官方示例,我无法使用友好连接 rabbitmq 地址,因为它们需要一个IP地址:

    // From official documentation
     var streamSystem = await StreamSystem.Create(
            new StreamSystemConfig()
            {
                UserName = "guest",
                Password = "guest",
                Endpoints = new List<EndPoint> 
                {
                    new IPEndPoint(IPAddress.Parse("192.168.5.12"), 5552), // What should I do here?
                }
            }
        ).ConfigureAwait(false);
    

    有办法设置吗 StreamSystemConfig 使用主机名?还是我需要以某种方式获得ip?

    0 回复  |  直到 1 年前
        1
  •  0
  •   datawookie    1 年前

    试试这样的方法:

    using System.Text;
    using System.Net;
    using Microsoft.Extensions.Logging;
    using RabbitMQ.Stream.Client;
    using RabbitMQ.Stream.Client.Reliable;
    
    class Program
    {
        public static async Task Main(string[] args)
        {         
            string dnsName = "rabbitmq"; // Use the name of the RabbitMQ service.
            int port = 5552;
            try
            {
                // Resolve DNS name into IP address.
                IPAddress[] addresses = Dns.GetHostAddresses(dnsName);
                // Add port to get a dull endpoint.
                IPEndPoint endPoint = new IPEndPoint(addresses[0], port);
                Console.WriteLine("Connect to RabbitMQ at {0}.", endPoint);
                var streamSystem = await StreamSystem.Create(
                    new StreamSystemConfig()
                    {
                        UserName = "guest",
                        Password = "guest",
                        Endpoints = new List<EndPoint>() {endPoint}
                    }
                ).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        }
    }
    

    当您构建并运行时,您应该会看到打印的消息如下:

    Connect to RabbitMQ at 192.168.224.2:5552.
    

    在Docker Compose网络中,RabbitMQ服务正在DNS名称的容器上运行 rabbitmq 这个 GetHostAddresses() 方法将此DNS名称动态转换为IP地址。无需硬编码任何地址。