Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 处理微服务请求的设计模式_Design Patterns_Asp.net Core_Rabbitmq_Microservices - Fatal编程技术网

Design patterns 处理微服务请求的设计模式

Design patterns 处理微服务请求的设计模式,design-patterns,asp.net-core,rabbitmq,microservices,Design Patterns,Asp.net Core,Rabbitmq,Microservices,我有一个基于微服务的应用程序。我有一个接收HTTP请求的代理/网关API。然后我还有两个服务服务A和服务B。当代理API收到消息时,它使用RabbitMQ将其发送到服务。然后在每一种情况下,我都应该根据消息的不同来处理和处理它(执行不同的操作) 这是我当前处理消息的方式: 服务A 如果我的消息类型不超过5-10种,那么使用switch语句是有意义的。但在我的应用程序中,我有30个。写这么大的条件语句既难看又不好维护。我正在寻找一种设计模式,它将从应用程序中消除这个问题。你有什么想法吗?您对状态模

我有一个基于微服务的应用程序。我有一个接收HTTP请求的代理/网关API。然后我还有两个服务服务A和服务B。当代理API收到消息时,它使用RabbitMQ将其发送到服务。然后在每一种情况下,我都应该根据消息的不同来处理和处理它(执行不同的操作)

这是我当前处理消息的方式:

服务A

如果我的消息类型不超过5-10种,那么使用switch语句是有意义的。但在我的应用程序中,我有30个。写这么大的条件语句既难看又不好维护。我正在寻找一种设计模式,它将从应用程序中消除这个问题。你有什么想法吗?您对状态模式有何看法?

您可以尝试该体系结构

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

如果每条消息都有相同的类,
message
,那么您的
CommandSubscriber
应该基于
message.EventCode
注册命令处理程序。如果每条消息都有不同的类(即
消息
接口
),则
命令订户
应根据消息类注册命令处理程序。此体系结构样式尊重打开-关闭原则,而基于交换机的样式则不尊重。

您可以尝试此体系结构

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

如果每条消息都有相同的类,
message
,那么您的
CommandSubscriber
应该基于
message.EventCode
注册命令处理程序。如果每条消息都有不同的类(即
消息
接口
),则
命令订户
应根据消息类注册命令处理程序。此体系结构样式尊重
打开-关闭原则
,而基于交换机的样式则不尊重。

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

[1]

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

[1]

    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!");
        }
    }