docker - docker-compose 与 rabbitmq
问题描述
我正在尝试设置一个 docker-compose 脚本 - 启动一个虚拟对象:网站、API、网关和 RabbitMQ。(微服务方式)
请求管道:
Web >> 网关 >> API >> RabbitMQ
我的 docker-compose 看起来像这样:
version: "3.4"
services:
web:
image: webclient
build:
context: ./WebClient
dockerfile: dockerfile
ports:
- "4000:4000"
depends_on:
- gateway
gateway:
image: gatewayapi
build:
context: ./GateWayApi
dockerfile: dockerfile
ports:
- "5000:5000"
depends_on:
- ordersapi
ordersapi:
image: ordersapi
build:
context: ./ExampleOrders
dockerfile: dockerfile
ports:
- "6002:6002"
depends_on:
- rabbitmq
rabbitmq:
image: rabbitmq:3.7-management
container_name: rabbitmq
hostname: rabbitmq
volumes:
- rabbitmqdata:/var/lib/rabbitmq
ports:
- "7000:15672"
- "7001:5672"
environment:
- RABBITMQ_DEFAULT_USER=rabbitmquser
- RABBITMQ_DEFAULT_PASS=some_password
该管道有效:
网页 >> 网关 >> API
我从网站上的 API 得到响应。
但是当我尝试从 API 向 rabbitmq 推送消息时,我收到以下错误:
System.AggregateException: One or more errors occurred. (Connection failed) ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:7001
RabbitMQ 管理 GUI 仍然在定义的端口 7000 上工作。对端口 7001 的请求不起作用。
但是,如果我手动启动 API 和 RabbitMQ,它就像一个魅力。API 我只是从调试器开始(.Net core + IIS - 默认设置在 VS 中按 F5),这是我用来手动启动 docker 映像的命令:
docker run -p 7001:5672 -p 7000:15672 --hostname localhost -e RABBITMQ_DEFAULT_USER=rabbitmquser -e RABBITMQ_DEFAULT_PASS=some_password rabbitmq:3.7-management
更新
这就是我在 .Net 核心管道中注入配置的方式。
启动.cs
public void ConfigureServices(IServiceCollection services)
{
// setup RabbitMQ
var configSection = Configuration.GetSection("RabbitMQ");
string host = configSection["Host"];
int.TryParse(configSection["Port"], out int port);
string userName = configSection["UserName"];
string password = configSection["Password"];
services.AddTransient<IConnectionFactory>(_ => new ConnectionFactory()
{
HostName = host,
Port = port,
UserName = userName,
Password = password
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
控制器.cs
private readonly IConnectionFactory _rabbitFactory;
public ValuesController(IConnectionFactory rabbitFactory)
{
_rabbitFactory = rabbitFactory;
}
public void PublishMessage()
{
try
{
using (var connection = _rabbitFactory.CreateConnection())
using (var channel = connection.CreateModel())
{
string exchangeName = "ExampleApiController";
string routingKey = "MyCustomRoutingKey";
channel.ExchangeDeclare(exchange: exchangeName, type: "direct", durable: true);
SendMessage("Payload to queue 1", channel, exchangeName, routingKey);
}
}
catch (Exception e)
{
Console.WriteLine(e.InnerException);
}
}
private static void SendMessage(string message, IModel channel, string exchangeName, string routingKey)
{
byte[] body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: exchangeName,
routingKey: routingKey,
basicProperties: null,
body: body);
Console.WriteLine($" Sending --> Exchange: { exchangeName } Queue: { routingKey } Message: {message}");
}
解决方案
我想在你的来电者中你将 rabbitmq_url 设置为localhost:7001
. 但是,调用者在一个容器中,该容器确实在端口 7001 上运行任何东西。Rabbitmq在您的主机上的端口 7001 上运行。
您需要更改 url 以rabbitmq:5672
使用内部网络,或者host.docker.internal:7001
如果您使用的是 window 或 mac docker 18.03+,请使用
推荐阅读
- kotlin - Kotlin 扩展字段设置/获取异常
- json - 提交表单时更改我的 JSON 数据
- angular - 如何在Angular中通过布尔值过滤数组?
- laravel-5 - 如果用户注销,则更新值
- javascript - 如何使用 Fetch API 从 API 显示图像?
- laravel - 在 Web 上播放 RTSP 直播流的可能方式有哪些?
- javascript - 变量在 for 循环内不可见
- javascript - 如何避免在angularjs中的多项选择中自动排序
- ionic2 - 当我从 ionic 3 的导航栏中单击页面时,多次订阅事件。如何解决这个问题?
- java - 从 HandlerInterceptor 抛出 HTTP 状态代码异常