【问题标题】:http server on top of net server网络服务器之上的http服务器
【发布时间】:2017-11-26 18:36:08
【问题描述】:

我用 express 实现了 2 个网络服务器。一个是主,一个是微服务。

他们通过 HTTP REST API 进行通信,过去我们在微服务上启动了一个 socket.io 服务器来观察主服务器的启动/关闭状态。

              ----HTTP-----
[main server]               [microservice]
              --socket.io--

然后我意识到 socket.io 不是正确的工具。所以我决定用 socket.io 换一个原始的 TCP 套接字。

所以问题是:是否可以在原始 TCP 服务器的“顶部”启动 http 服务器(在同一端口上)?(允许通过 TCP 客户端连接并发送 HTTP请求?)

到目前为止我有这个:

  const app = express();
  const server = http.createServer(app);
  // const io = sio(server);
  server.listen(config.port, config.ip, callback);

我正在尝试与this集成

我正在尝试实现并使用 socket.io 成功实现的目标是在微服务上启动一个套接字服务器,在主服务器上连接到它,使其保持活动状态,并监视事件以保持全局变量布尔值“连接”与它同步。我正在使用这个变量来了解我的微服务前端状态,还可以预先检查我是否应该在请求时尝试请求微服务,以及用于登录目的。我想避免手动轮询,首先是为了可维护性,也是为了实时目的。

【问题讨论】:

    标签: node.js express tcp server


    【解决方案1】:

    是否可以启动原始 TCP 服务器的 http 服务器“在顶部”(在同一端口上)?

    有点,不是真的。 HTTP 运行在 TCP 之上。因此,您可以在技术上打开一个原始 TCP 服务器,然后编写您自己的代码来解析传入的 HTTP 请求并发送合法的 HTTP 响应。但是,现在您刚刚编写了自己的 HTTP 服务器,因此它不再是原始 TCP。

    尝试让一个服务器同时接受 HTTP 和其他协议的挑战在于,您的服务器必须能够找出任何给定的传入数据包,以及它应该如何处理它。是 HTTP 请求吗?还是您的其他类型的自定义请求。写这样的东西在技术上是可行的。

    或者,您可以使用以 HTTP 请求开始的 webSocket 技术,但使用 upgrade 标头请求升级到其他协议。 http 规范中完全定义了如何执行此操作。

    但是,除非您有一些网络限制,您只能拥有一台服务器或一个开放端口,否则我会问为什么?这是一种复杂的做事方式。为不同类型的通信使用不同的端口和不同的侦听服务器实际上并不需要任何成本。而且,当每台服务器只监听一种类型的流量时,事情就简单多了。您可以将标准 HTTP 服务器用于您的 HTTP 请求,也可以将您自己的自定义 TCP 服务器用于您的自定义 TCP 请求。


    我无法从您的问题中真正看出您要解决的真正问题是什么。如果您只想测试您的 HTTP 服务器是否启动/关闭,则使用一些外部进程,每隔一段时间查询一次您的 HTTP REST API 调用,然后判断服务器是否按预期响应。有许多现有的代码体也可以配置为执行此操作(检查 Web 服务器的运行状况是一项常见任务)。

    您链接到的代码显示了一个示例服务器,该服务器仅将收到的任何消息发送回(称为回显服务器)。这只是一个经典的测试服务器,供客户端作为测试连接。第二个代码块是一段客户端代码示例,用于连接服务器、发送短消息然后断开连接。


    来自您的 cmets:

    底层 TCP 服务器甚至不会用于消息传递,它只会用于监视连接/断开连接事件

    http 服务器已经从 TCP 服务器继承,因此它具有服务器本身的所有相同事件。您可以在http server doc 中查看所有这些事件。我不知道你到底想要什么,但有一些服务器生命周期事件,例如:

    listening   (server now listening)
    close       (server now closed)
    

    而且,还有一些服务器活动事件,例如:

    connect     (new client connected)
    request     (new client issues a request)
    

    而且,从请求事件中,您可以获得httpClientRequesthttpServerResponse 对象,它们允许您监控单个连接的生命周期,包括事件获取传入连接的实际套接字对象。

    这是 http 服务器文档中 connect 事件的 code example

    【讨论】:

    • 感谢您的回答。我明白。我想知道 node.js 中是否嵌入了类似的东西,例如 http.createServer(net.createServer(port)).. 使用不同的端口并不需要任何成本。好吧,在一个复杂的架构中,比如说 5 个微服务,复制,这可能会导致大量的配置。
    • 只是每隔一段时间查询一次你的 HTTP REST API 调用要求实时,而轮询对我们来说不是解决方案(主要是性能)
    • @CyrilCHAPON - 好吧,您可以查看 Web 服务器是否处于活动状态并做出响应的唯一方法是不时对其进行轮询。我想我真的不知道你的要求是什么,如果那是被禁止的。鉴于您在问题中提出的内容,我已经告诉过您我可以告诉您的内容。如果您想添加更多有关您的实际需求的相关信息,那么我可以在早上再看一下。而且,您究竟希望http.createServer(net.createServer(port)) 做什么?认真告诉我们您的真正需求是什么,然后,只有这样,我们才能为您提供解决方案。
    • 嗯,查看 Web 服务器是否处于活动状态并做出响应的唯一方法是不时对其进行轮询。。好吧,基本上没有?您可以在打开的套接字上观看连接/断开连接事件。 (即使它暗示了模块中的底层轮询/心跳/keepalive)
    • 你究竟希望 http.createServer(net.createServer(port)) 做什么来打开一个 TCP 服务器,并在它上面打开一个 HTTP 解析器,它将“抓取”HTTP 格式的消息。底层 TCP 服务器甚至不会用于消息传递,它只会用于监视连接/断开连接事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2011-08-03
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2012-10-07
    相关资源
    最近更新 更多