用于处理微服务请求的设计模式

时间:2017-06-20 14:11:04

标签: design-patterns asp.net-core rabbitmq microservices

我有一个基于微服务的应用程序。我有一个接收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?

2 个答案:

答案 0 :(得分:0)

您可以尝试CQRS架构。

在CQRS中,每个命令都只有一个处理程序;作为组件,您需要CommandDispatcher使用CommandSubscriber将每个命令分派给正确的处理程序。执行每个命令后,生成一个或多个事件;每个事件也会分派给一个或多个事件处理程序。

如果每条消息都有相同的类Message,那么您的CommandSubscriber应该根据message.EventCode注册命令处理程序。如果每个消息都有不同的类(即Messageinterface),那么CommandSubscriber应该根据消息类注册命令处理程序。这种架构风格尊重Open-close principle,而基于交换机的风格则不尊重。{/ p>

答案 1 :(得分:0)

这是“网关路由模式” 当API网关接收到请求时,它会查询路由映射,该路由映射指定将请求路由到的服务。路由映射例如可以将HTTP方法和路径映射到服务的HTTP URL。此功能与NGINX等网络服务器提供的反向代理功能相同。

[1] https://medium.com/@madhukaudantha/microservice-architecture-and-design-patterns-for-microservices-e0e5013fd58a