我正在尝试设置一个docker-compose脚本 - 启动一个虚拟的网站、API、网关和RabbitMQ。(微服务方法)
请求管道:
Web >> 网关 >> API >> RabbitMQ
我的docker-compose如下:
这是一段关于Web、Gateway和API之间通信管道的描述,其中API可以从网站获取响应。但是,当尝试从API向rabbitmq推送消息时,会出现连接失败的错误。RabbitMQ管理GUI仍然可以在定义的端口7000上工作,而对端口7001的请求则无法正常运行。但是,如果手动启动API和RabbitMQ,则可以正常工作。在.NET核心中,这是如何注入配置的。
请求管道:
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
这是一段关于Web、Gateway和API之间通信管道的描述,其中API可以从网站获取响应。但是,当尝试从API向rabbitmq推送消息时,会出现连接失败的错误。RabbitMQ管理GUI仍然可以在定义的端口7000上工作,而对端口7001的请求则无法正常运行。但是,如果手动启动API和RabbitMQ,则可以正常工作。在.NET核心中,这是如何注入配置的。
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);
}
controller.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}");
}