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

Posted

技术标签:

【中文标题】在微服务应用程序中实现 websocket【英文标题】:Implementing websockets in microservices application 【发布时间】:2019-05-26 15:07:10 【问题描述】:

我有一个相当复杂的练习,但到目前为止我做得很好。我唯一要做的就是将 WebSockets 添加到组合中。

这是一个关于两个主题的简单投票应用程序,但我必须使用特定的技术来使用特定的部分。此外,一切都在 Docker 中运行。

这是我的应用程序的架构:

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

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

【问题讨论】:

你可以添加一个web socket,但问题是你为什么需要它?它是否为您的应用增值? 这是练习的一部分,我知道,简单的投票应用程序可以很容易地完成。 “结果 API 应该在 NodeJS 中实现。组件负责应用程序的结果部分。与前端通信的接口应该是 WebSockets。”从这里我认为我应该将它与 NodeJS 链接,但这将如何工作? 好的,也许您需要在您的 UI 中进行实时更新?有很多关于如何做的教程,比如这个flaviocopes.com/websockets 是的,但是数据来自一个地方,我必须将其发送到另一个地方。我很难理解它:D 【参考方案1】:

Websockets 与 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:。在服务器端进行装配有点困难,但仍然以相同的方式工作。

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

【讨论】:

以上是关于在微服务应用程序中实现 websocket的主要内容,如果未能解决你的问题,请参考以下文章

使用 Websockets 在 Rails 应用程序中实现自动保存

如何在此服务器中实现 Websocket 握手?

使用 Native Sockets 在 Android 中实现 WebSockets

在 tornadoweb websockets 服务器中实现 SSL

如何在 AngularJS 中实现 websockets?

如何在微信小程序中实现具有@功能的输入框