在微服务应用程序中实现Websocket

时间:2018-12-28 21:30:06

标签: node.js angular spring-boot websocket

我的锻炼非常复杂,但到目前为止我做得很好。我剩下要做的就是添加WebSockets。

这是一个涉及两个主题的简单投票应用程序,但是我必须使用特定技术才能在特定部分上使用。另外,一切都在Docker中运行。

这是我的应用程序的体系结构:

architecture

当前,该应用程序可以处理HTTP请求,但是我必须以某种方式实现WebSockets。我知道我必须链接Angular,但是另一个是什么?

在这种情况下,我将如何实现WebSockets?

1 个答案:

答案 0 :(得分:2)

Websocket与https有很多共同点。实际上,它们以https连接开始生活,然后升级到持久的websocket连接。

因此,您的客户端(浏览器中的Javascript)使用WebSocket object的实例启动连接。然后,它可以与服务器之间收发消息。您的浏览器代码可能如下所示。它启动连接。连接打开时,它将发送一条消息。

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:。在服务器端安装起来有点困难,但仍以相同的方式工作。

还要注意,我没有给出任何错误或超时处理。生产代码需要这些东西。