在微服务应用中实现Websockets

6
我有一个相当复杂的练习,但到目前为止我处理得不错。我唯一需要做的就是将WebSockets添加到其中。
这是一个有关两个主题的简单投票应用程序,但我必须使用特定技术来实现特定部分。此外,所有内容都在Docker中运行。
以下是我的应用程序架构图: architecture 目前该应用程序仅能通过HTTP请求运行,但我必须想办法实现WebSockets。我知道我必须连接Angular,但还需要另外一个什么?
在这种情况下,我该如何实现WebSockets?

你可以添加一个Web套接字,但问题是为什么需要它?它是否为您的应用程序增加了价值? - Mikkel
这只是练习的一部分,简单的投票应用程序可以更容易地完成,我知道。“结果API应该在NodeJS中实现。组件负责应用程序的结果部分。 与前端通信的接口应该是WebSockets。”从这里我了解到我应该将其与NodeJS链接起来,但是这将如何工作呢? - eixcs
好的,也许你需要在你的用户界面进行实时更新?有很多教程可以教你如何做到这一点,比如这个 https://flaviocopes.com/websockets/。 - Mikkel
是的,但我需要从一个地方获取数据并将其发送到另一个地方。我有些难以理解 :D - eixcs
1个回答

2
WebSocket与https有许多共同点。实际上,它们最初都是作为https连接开始,并被升级为持久的WebSocket连接。
因此,您的客户端(浏览器中的Javascript)使用WebSocket对象的实例初始化连接。然后,它可以发送和接收来自服务器的消息。您的浏览器代码可能如下所示。它启动一个连接。当连接打开时,它会发送一条消息。
const ws = new WebSocket("ws://www.example.com:8090/socketserver");

ws.onmessage = function (event) {
    console.log ('incoming', event.data);
}

ws.onopen = function (event) {
    ws.send ("Hey there server!");
}

在服务器(nodejs)端,您需要设置一个websocket服务器来接受客户端的连接。您可以使用npm's ws package来完成此操作。(还有其他的包可用,但我知道这个是有效的。)
您的最小可行的ws服务器代码也很简单。
const WebSocket = require('ws');
... 
const wss = new WebSocket.Server({ port: 8090 });

wss.on('connection', function connection(ws) {
  /* Here an incoming websocket connection is accepted 
   * You must keep the ws object in scope for the lifetime
   * of the connection */

  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  /* respond to ping keepalives from client */
  ws.on('ping', function ping() {
      ws.pong();
  }

  /* send messages as needed */
  ws.send('hey there client!');
});

注意:浏览器安全性不允许您在浏览器和服务器之间混合连接模式(https / http)。因此,如果您的前端剩余部分是通过https:提供的,则需要使用wss:而不是ws:。这在服务器端有点难以设置,但仍然可以按照相同的方式工作。
另外请注意,我没有提供任何错误或超时处理。生产代码需要这些内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接