我开发了两个微服务,并集成了RabbitMQ作为消息代理.我关心的是,微服务架构是否允许使用直接API调用进行内部通信,或者它完全依赖于 消息代理用于相互通信?

例如:-即时重要的业务场景,如客户下单,这应该包含对orderAPI的CustomerAPI的API调用,而不是依赖于被视为异步操作的Message Broker.

    [Route("CallOrder")]
    [HttpGet]
    public async Task<IEnumerable<Product>> CallOrder()
    {
        logger.LogInformation("Call product controller from customer and get products");
        return  await httpClient.GetFromJsonAsync<IEnumerable<Product>>("http://shoppingapi-service/Product");
    }

我只想澄清的是,根据微服务体系 struct ,我们实际上是使用API调用来将一个微服务与另一个微服务通信,还是完全依赖于消息代理.或者我们两个都用

我try 了两种方式,如API调用和Message Broker进行通信,因为我认为这取决于业务场景它是一项紧迫的任务,我 Select 了API调用.如果不是,我会 Select Message Broker.生产者-消费者的方式.

推荐答案

我们是否真的使用API调用来将一个微服务与另一个微服务通信,或者我们完全依赖消息代理.或者我们两个都用

在微服务架构中,你不限于异步风格的通信(见Pattern: Messaging @microservices.io),在某些情况下也可以使用同步RPS/RPI(Pattern: Remote Procedure Invocation (RPI) @microservices.io),尽管由于微服务架构的性质和你想要解决的问题,它通常非常青睐异步选项,因为它能够提供更好的服务和可扩展性之间的解耦.

直接重要的业务场景,如客户下单,这应该包含对客户API到orderAPI的API调用,而不是依赖于被视为异步操作的Message Broker.

我将在这里对你的结论提出质疑.虽然下订单绝对是一个"重要"的业务场景,但这并不意味着它不能以异步方式处理.除了以同步方式使用异步通信通道之外,还有其他 Select --如将异步通信传播到UI(通过WebSockets)或在服务处理订单放置中使用其他服务数据的本地副本/"缓存"(并通过使用异步通信来维护副本以保持其更新).当跨多个服务(例如,Pattern: Command-side replica)复制数据(以只读方式)时,这实际上是微服务体系 struct 中非常常见的场景.

Csharp相关问答推荐

将C#字符串转换为其UTF8编码字符的十六进制表示

为什么EF Core 6会针对null验证Count(*)?

如何在Visual Studio代码中更改大括号模式{},用于C#语言

如何使用C#Interop EXCEL创建度量衡

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

如何在实体框架中添加包含列表?

具有可空类型的C#NOTNULL约束具有意外行为

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

为值对象编写自定义JsonConverter

Google OAuth令牌交换在.Net中不起作用

KeyDown从我的文本框中删除输入,如何停止?

使用DI实例化带有动态参数的服务?

为什么连接到Google OAuth2后,结果.Credential为空?

.NET EF Core Automapper项目到筛选不起作用

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

我如何为我的Blazor应用程序构建一个动态教程标注?

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

如何在C#中用Serilog记录类路径、方法名和行编号

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>