我有一个基于微服务的应用程序。我有一个接收HTTP请求的Broker / Gateway API。然后我还有两个服务A和服务B.当Broker API收到消息时,它使用RabbitMQ将其发送到服务。然后在每一个中我应该处理它并根据消息以不同的方式处理它(执行不同的动作)。
这是我处理当前消息的方式:
服务A
public string ProcessAsync(Message message)
{
switch (message.EventCode)
{
case "context 1":
return action1();
case "context 2":
return action2();
case "context 3":
return action3();
case "context 4":
return action4();
case "context 5":
return action5();
default:
throw new Exception("Unknown message event code!");
}
}
如果我的消息类型不超过5-10种,则使用switch语句是有意义的。但是在我的应用程序中,我有30个。写这么大的条件语句是丑陋的,不同的维护。我正在寻找一个设计模式,将从应用程序中删除此问题。你有什么想法?您如何看待State Pattern?
答案 0 :(得分:0)
您可以尝试CQRS架构。
在CQRS中,每个命令都只有一个处理程序;作为组件,您需要CommandDispatcher
使用CommandSubscriber
将每个命令分派给正确的处理程序。执行每个命令后,生成一个或多个事件;每个事件也会分派给一个或多个事件处理程序。
如果每条消息都有相同的类Message
,那么您的CommandSubscriber
应该根据message.EventCode
注册命令处理程序。如果每个消息都有不同的类(即Message
是interface
),那么CommandSubscriber
应该根据消息类注册命令处理程序。这种架构风格尊重Open-close principle
,而基于交换机的风格则不尊重。{/ p>
答案 1 :(得分:0)
这是“网关路由模式” 当API网关接收到请求时,它会查询路由映射,该路由映射指定将请求路由到的服务。路由映射例如可以将HTTP方法和路径映射到服务的HTTP URL。此功能与NGINX等网络服务器提供的反向代理功能相同。