问题描述
我是 docker 新手。我创建了一个 .net core 5.0 web api 项目。
更新 最初,我在启动时收到以下错误。我目前在尝试发送消息时收到错误消息。
目标:通过大众运输发送消息
错误: 警告:大众运输[0] 重试 00:00:08.1220000:代理无法访问:guest@localhost:5672/ Masstransit.RabbitMqTransport.RabbitMqConnectionException:代理无法访问:guest@localhost:5672/ ---> RabbitMQ.Client.Exceptions.brokerUnreachableException: 指定的端点都不可达 ---> System.AggregateException:发生一个或多个错误。 (连接失败) ---> RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败 ---> System.Net.sockets.socketException (111): 连接被拒绝
version: '3.4'
networks:
poc:
services:
rabbitmq:
image: masstransit/rabbitmq:latest
networks:
- poc
container_name: rabbitmq
environment:
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
ports:
- 5672:5672
- 15672:15672
webapi:
image: ${DOCKER_REGISTRY-}webapi
build:
context: .
dockerfile: WebApi/Dockerfile
ports:
- 5100:80
test:
image: ${DOCKER_REGISTRY-}test
build:
context: .
dockerfile: Test/Dockerfile
ports:
- 5101:80
在我的 startup.cs 中的 WebApi 端...
services.AddMasstransit(mt =>
{
mt.UsingRabbitMq((context,cfg) =>
{
cfg.AutoStart = true;
cfg.Host("rabbitmq");
cfg.UseRabbitMqMessageScheduler();
cfg.ConfigureEndpoints(context);
});
});
我的控制器
public class OrderController : Controller
{
private readonly IBusControl _bus;
public OrderController(IBusControl bus)
{
_bus = bus;
}
[HttpPost("apI/Order")]
public async Task<IActionResult> Index([FromBody] Order order)
{
try
{
Uri uri = new Uri("queue:order-queue");
var endpoint = await _bus.GetSendEndpoint(uri);
await endpoint.Send(order);
return Ok("Success");
}
catch (Exception exception)
{
return StatusCode(500,exception);
}
}
}
解决方法
当我在 Docker 中运行服务时,我发现 iplist= list(ipaddress.ip_network(network).hosts())
notepad1 = open('oddnetworks.txt','w')
for i in range(10,len(iplist),2):
print(iplist[I])
notepad1.write(iplist)
# Don't forget to close!
notepad1.close()
不起作用。因此,我使用检查来查看我是否在容器中并使用 localhost
主机名(或任何 RabbitMQ 容器的主机名在 rabbitmq
中。
docker-compose.yml
然后,在 static bool? _isRunningInContainer;
static bool IsRunningInContainer =>
_isRunningInContainer ??= bool.TryParse(Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER"),out var inContainer) && inContainer;
中:
UsingRabbitMq
working example,如果您需要了解它是如何连接的。