使用请求/响应模型在docker中进行批量传输,请求使用者异常,响应时未找到主机

时间:2018-10-04 16:18:50

标签: docker asp.net-core rabbitmq microservices masstransit

我对Masstransit / RabbitMq相当陌生,遇到一个无法处理的问题。 我有一个运行在Docker中的Rabbitmq服务器,也是一个在Docker容器中运行事件的小型微服务。除此之外,我在主机上运行Windows服务,该服务的任务是通过masstransit请求/响应模型将事件发送到微服务。有趣的是,事件按预期方式到达了使用者,但是当我尝试响应上下文时,使用consume方法的RespondAsync会得到一个异常

R-FAULT rabbitmq://autbus/exi_bus 80c60000-eca5-3065-0093-08d62a09d168 HwExi.Extensions.Events.ReservationCreateOrUpdateEvent HwExi.Api.Consumers.ReservationCrateOrUpdateConsumer(00:00:07.8902444) The host was not found for the specified address: rabbitmq://127.0.0.1/bus-SI-GEPE-HwService.Api-oddyyy8cwwagkoscbdmnwncfrg?durable=false&autodelete=true, MassTransit.EndpointNotFoundException: The host was not found for the specified address: rabbitmq://127.0.0.1/bus-SI-GEPE-HwService.Api-oddyyy8cwwagkoscbdmnwncfrg?durable=false&autodelete=true

我正在使用此模型在微服务之间进行消息传递,没有任何问题,并且可以在另一个队列中正常工作。

这是微服务/总线的领域

exiapi:
image: exiapi
build:
  context: .
  dockerfile: Service/HwExi.Api/Dockerfile
ports:
  - "54542:80"
environment:
  "BUS_USERNAME": "guest"
  "BUS_PASSWORD": "guest"
  "BUS_HOST": "rabbitmq://autbus"
  "BUS_URL": "exi_bus"
autbus:
image: rabbitmq:3-management
hostname: autbus
ports:
  - "15672:15672"
  - "5672:5672"
  - "5671:5671"
volumes:
  - ~/rabbitmq:/var/lib/rabbitmq/mnesia

Windows服务的配置:

"Bus": {
"Username": "guest",
"Password": "guest",
"Host": "rabbitmq://127.0.0.1",
"Url": "exi_bus"

},

Windows服务的连接方式如下:

var builder = new ContainerBuilder();
        builder.Register(context =>
        {
            return Bus.Factory.CreateUsingRabbitMq(rmq =>
            {
                var host = rmq.Host(new Uri(options.Value.Bus.Host), "/", h =>
                {
                    h.Username(options.Value.Bus.Username);
                    h.Password(options.Value.Bus.Password);
                });
                rmq.ExchangeType = ExchangeType.Fanout;
            });
        }).As<IBusControl>().As<IBus>().As<IPublishEndpoint>().SingleInstance();

容器内部的微服务这样连接

 public static class BusExtension
{
    public static void InitializeBus(this ContainerBuilder builder, Assembly assembly)
    {
        builder.Register(context =>
        {
            return Bus.Factory.CreateUsingRabbitMq(rmq =>
            {
                var host = rmq.Host(new Uri(Constants.Bus.Host), "/", h =>
                {
                    h.Username(Constants.Bus.UserName);
                    h.Password(Constants.Bus.Password);
                });
                rmq.ExchangeType = ExchangeType.Fanout;
                rmq.ReceiveEndpoint(host, Constants.Bus.Url, configurator =>
                {
                    configurator.LoadFrom(context);
                });
            });
        }).As<IBusControl>().As<IBus>().As<IPublishEndpoint>().SingleInstance();
        builder.RegisterConsumers(assembly);
    }

    public static void StartBus(this IContainer container, IApplicationLifetime lifeTime)
    {
        var bus = container.Resolve<IBusControl>();
        var busHandler = TaskUtil.Await(() => bus.StartAsync());
        lifeTime.ApplicationStopped.Register(() => busHandler.Stop());
    }
}

windows服务会触发如下事件:

var reservation = ReservationRepository.Get(message.KeyId, message.KeySource);
        var operation = await ReservationCreateOrUpdateClient.Request(new ReservationCreateOrUpdateEvent { Reservation = reservation });
        if (!operation.Success)
        {
            Logger.LogError("Fatal error while sending reservation create or update message to exi web service");
            return;
        }

最后,微服务捕获了这样的事件。

public class ReservationCrateOrUpdateConsumer : IConsumer<ReservationCreateOrUpdateEvent>
{
    public async Task Consume(ConsumeContext<ReservationCreateOrUpdateEvent> context)
    {
        await context.RespondAsync(new MessageOperationResult<bool>
        {
            Result = true,
            Success = true
        });
    }
}

我正在使用autofac在Windows服务中注册requestclient:

        Timeout = TimeSpan.FromSeconds(20);
        ServiceAddress = new Uri($"{Configurarion.Bus.Host}/{Configurarion.Bus.Url}");

            builder.Register(c => new MessageRequestClient<ReservationCreateOrUpdateEvent, MessageOperationResult<bool>>(c.Resolve<IBus>(), ServiceAddress, Timeout))
            .As<IRequestClient<ReservationCreateOrUpdateEvent, MessageOperationResult<bool>>>().SingleInstance();

有人可以帮助调试吗?如果这种结构是正确的,也要分享意见,也许我应该使用https从客户端计算机向微服务环境发送消息,然后通过网关或更合适的类似方法将其转换为总线?谢谢

0 个答案:

没有答案