【问题标题】:Architectural design of a protocol agnostic server协议无关服务器的架构设计
【发布时间】:2016-10-02 03:26:49
【问题描述】:

我想构建一个服务器,它能够处理 TCP、HTTP 和 Websockets 协议(不能同时处理),并且无论在运行时使用什么协议,它都能以相同的方式工作。

基本上我不会对每种类型的请求进行不同的处理,而是以某种方式制作一个通用请求对象和一个通用响应对象。

通过 TCP 和 Websocket 接收的消息将具有 http 请求的结构。

所有请求/消息都将类似于 REST。

为了不重复每个协议的路由/处理,我应该使用什么架构设计?

【问题讨论】:

  • 很好。你有什么问题?无论如何,您不应该将您的业务逻辑绑定到特定的网络协议。看看微软的 WCF 是如何做到这一点的:使用“绑定”。绑定将“消息”转换为特定于协议的格式。
  • 关于您的编辑,您能否再详细说明一下关于“路由/处理”的内容?
  • @CodeCaster 因为所有请求/消息都会“看起来”相同,我想使用相同的路由机制,进行一些处理,然后回复。
  • 是的,我明白了。我不明白这个“路由”或“处理”的哪一部分你需要帮助,以及你需要什么帮助。我可以轻松地为您提供一个类似于其他人如何实现此功能的高级概述,但我不确定这是否会有所帮助。
  • 基本上我想为通过 TCP 或 Websockets 接收的消息模拟经典的 http 路由。我不知道是否有这样的库或类似的东西,或者可以使用什么设计。

标签: http tcp architecture websocket server


【解决方案1】:

任何 TCP 服务器也可以是 HTTP 服务器。如果您检查https://docs.python.org/2/library/socketserver.htmlhttps://docs.python.org/2/library/basehttpserver.html,您将看到HTTPServer 扩展了TCPServer。

在请求进入您的 TCP 服务器后,只需确定它是否是“HTTP 请求”(这是困难的部分)并将其转发到 HTTP 路由器(几乎任何语言的任何体面的 MVC 框架都有一个)。

如果我们认为 TCP 请求和 HTTP 请求是相似的,您可以将 TCP 请求转换为 HTTP 请求并将其转发到同一个路由器。无论如何,这种方法会减慢所有处理速度。

另外,如果您已经只有 TCP 客户端和服务器,那么我会将它们分开保存,因为 HTTP 引入了一些开销。因此,另一种方法是按照协议分别保留服务器和路由器,并仅使用业务逻辑类(模型)作为公共层。

TCP Server --> FC -->TCP Router --> TCPController(Controller) --> TCP Response
                                         |
                                         \/
                                       Model
                                         /\
                                         |
HTTP Server --> FC --> HTTP Router --> HTTPController(Controller) --> HTTP Response

*FC = 前端控制器

使用这种方法,您可以随时将 HTTP 服务器替换为另一个,这可以带来多种优势:使用众所周知的 Web 服务器(如 nginx)或您自己用不同语言编写的自定义服务器。

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多