服务器应用程序的传统单体应用程序架构最近在软件行业发生了范式转变,微服务架构目前正在取而代之。 轻量级、松散连接的模块集合的想法,每个模块代表一个单一的功能并在其流程中执行,这一想法非常流行,并且有充分的理由。 微服务架构使可扩展性、可靠性和高可用性成为可能,因为每个单独的服务都是独立创建、管理和测试的,没有任何依赖性。
由于微服务是松散耦合的,因此消息代理适合此基础架构以允许异步微服务通信,同时保持解耦是有意义的。 异步通信意味着任何一个服务都不必等待另一个。 为此,发布-订阅模型已被广泛采用作为微服务之间通信的媒介。
NCache 是 .NET 的内存中分布式数据存储,并为事件驱动的通信提供功能丰富的内存中发布/订阅。 因此, NCache 可以很容易地配置为消息代理,用于使用 Pub/Sub 模型在微服务之间进行异步通信。
NCache 更多信息 Pub/Sub 消息传递和事件 发布/订阅 NCache 配套文档
运用 NCache 用于微服务的内存中发布/订阅
Pub/Sub 在 NCache 通过定义微服务(内置于 .NET/.NET Core) 可以发布事件以及订阅它们。 事件在微服务之外发布到 NCache 消息代理。 每个订阅者微服务都包含一个事件处理程序,用于在发布者微服务发布后处理相应的事件。 图 1 突出显示了该架构的简单逻辑图:
对于.NET/.NET Core 微服务, NCache 充当事件总线或消息代理,通过它将消息中继到一个或多个订阅者。 有关更多详细信息 NCache Pub/Sub 模型,请参阅 NCache 文件 或我们的博客 运用 NCache 作为内存发布/订阅。
这篇博文使用 容器上的网上商店 扩展的示例应用程序 NCache 和 上传到 GitHub. 该项目注入 NCache 作为 .NET 微服务之间应用程序协调的事件总线。 NCache在这个应用程序中的作用如图 2 所示。
NCache 更多信息 Pub/Sub 消息传递和事件 发布/订阅 NCache 配套文档
快速使用示例 NCache 内存中发布/订阅
使用 容器上的网上商店 应用, NCache 在多种场景中充当消息代理。 此处突出显示的一种情况是用户结帐事件,其中购物篮详细信息是 出版 到 NCache 事件总线,订单应用程序可能有 认购 到用户结帐时的任何传入篮子以处理订单。
- 发布: 这个简化的代码片段显示了 Basket.API 微服务中购物车结账逻辑的一部分,其中用户 ID 和所有购物车详细信息(如地址、卡号等)作为消息负载添加并发布在事件总线上。 Basket.API 代码可以在 篮子控制器.cs GitHub 上的课程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Route("checkout")] [HttpPost] public async Task<ActionResult> CheckoutAsync([FromBody]BasketCheckout basketCheckout, [FromHeader(Name = "x-requestid")] string requestId) { var userId = GetUserIdentity(); basketCheckout.RequestId = GetRequestID(); var basket = await GetBasketAsync(userId); var userName = User.FindFirst(x => x.Type == "unique_name").Value; var eventMessage = new UserCheckoutAcceptedIntegrationEvent(userId, userName, basketCheckout.Address, basketCheckout.CardNumber, basketCheckout.RequestId, basket); // This message is published to the NCache Pub/Sub store eventBus.Publish(eventMessage); } |
- 订阅: 以下代码片段来自 Ordering.API 微服务,其代码为 上传到 GitHub. 这包含对 UserCheckout 事件的订阅,在该事件中,一旦用户签出购物篮,就会将事件作为消息发布,并调用来自订阅者的处理程序来进一步处理订单。
1 2 3 4 |
var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>(); eventBus.Subscribe<UserCheckoutAcceptedEvent, IIntegrationEventHandler<UserCheckoutAcceptedEvent>>(); |
NCache 更多信息 Pub/Sub 消息传递和事件 发布/订阅 NCache 配套文档
具有持久订阅的 Pub/Sub 消息持久性
由于微服务是松散耦合的,这意味着微服务可能随时加入或离开应用程序。 此外,如果您在高流量消息传递过程中遇到任何网络故障怎么办? 这意味着与事件总线的微服务连接必须具有足够的弹性,因此即使网络暂时中断,消息也不会丢失。
NCache 提供两种类型的持久订阅以适应您在 .NET/ 中的消息持久性.NET Core 微服务:
- 共享持久订阅: 多个订阅者可以订阅一个订阅。 Round Robin 方法用于向多个订阅者发送消息。 即使任何订阅者离开网络,活动订阅者之间的消息也会继续分发。
- 独家持久订阅: 一个订阅一次只有一个活跃订阅者。 在连接处于活动状态之前,不会接受同一订阅上的新订阅者请求。
NCache 更多信息 Pub/Sub 消息传递和事件 发布/订阅 NCache 配套文档
连接重试的通信可靠性
由于微服务依赖于网络进行通信,因此可能会出现意外的网络故障,这需要具有连接建立机制。 因此, NCache 保持可靠的沟通平台 连接重试 和 活着 确保您的 .NET/.NET Core 如果网络出现故障,服务会自动尝试连接到缓存。 这消除了任何第三方库(例如 Polly)对重试策略的需要。
NCache 更多信息 连接重试 通信可靠性 NCache 配套文档
为什么 NCache?
由于组织现在在单体应用程序上采用微服务架构, NCache 成为您的首选内存分布式数据存储,用作 .NET/ 的中介介质.NET Core 微服务应用。
- 极快且可线性扩展: 在记忆中, NCache 提供比其他 Pub/Sub 解决方案更快的通信。 此外,分布式允许 NCache 让您在向 Message Broker 集群添加更多服务器以处理更大负载时随时随地进行扩展。
- 高可用性: NCache 提供动态的、自我修复的点对点集群架构,确保没有单点故障。 而且, NCache 智能地复制消息并提供持久订阅,因此在缓存服务器出现故障时不会丢失消息,从而保证微服务的高可用性以进行通信。 NCache 当您需要增加集群中的服务器数量时,还可以通过让您在运行时添加这些服务器而不停止集群来提供高可用性。
- 本地人 .NET Core: 对于在 .NET/ 中构建的微服务.NET Core, NCache 提供 100% .NET / .NET Core 本机堆栈无缝集成到您的应用程序堆栈中。
总而言之,虽然微服务将您的应用程序简化为逻辑单元,但管理它们之间的通信也变得困难。 因此, NCache 消除了引入高度可用的消息传递代理的额外复杂性,该代理同时也尊重解耦。
我们有另一个博客 使用分布式缓存扩展微服务性能. 去看看吧!