【问题标题】:Does CometD application needs Websocket Protocol as mandatoryCometD 应用程序是否需要强制使用 Websocket 协议
【发布时间】:2020-01-07 00:09:04
【问题描述】:

我必须向用户发送帐户更新消息,以便更新可以像实时更新一样直接显示在浏览器中。

我们现有的应用程序架构有 Zuul 1.x.x 代理、Spring boot RESTFul 微服务(只是一个传递)和一个 3rd 方应用程序作为后端。 Spring boot Restful 服务使用 OAuth 作为安全性来验证收到的请求。

这些都是在 AWS ELB 和 EC2 中建立的,除了第 3 方。

所以我的问题是,CometD 集成/应用程序可以在没有 websockets 的情况下使用上述功能吗?

当我阅读他们的文档时,他们总是说,它可以通过 HTTP 或 Websocket 工作,但我无法得出结论,我是否可以通过使用 CometD 集成仅使用 HTTP 来推送消息。

我的困惑是如果我将 cometD 集成到现有的 Spring boot 微服务应用程序中

  1. CometD 能否仅提供 HTTP 推送机制并与 Server 建立连接?或者它需要 Websockets (ws://) 并且需要在 Zuul 代理和 web 服务器中连续启用 websocket 才能建立 从浏览器/用户界面与服务器连接?
  2. 是否将现有 Spring Boot Restful 微服务的完整性质改变为 Web 应用程序

请指导我,以便我可以进一步进行。

【问题讨论】:

    标签: spring-boot tomcat websocket netflix-zuul cometd


    【解决方案1】:

    CometD 在没有 WebSocket 的情况下也能正常工作,因此您可以使用 HTTP 将消息从 CometD 服务器推送到浏览器客户端。

    来自CometD documentation preface

    CometD 为您提供 API 来实现这些消息传递模式:发布/订阅、点对点(通过服务器)和远程过程调用。这是通过使用独立于传输的协议、Bayeux 协议实现的,可以通过 HTTP 或 WebSocket(或其他传输协议)进行传输,这样您的应用程序就不会绑定到特定的传输技术。

    您可以在服务器端禁用 WebSocket 传输(参见this section 中的allowedTransports 参数):

    <web-app ...>
      ...
      <servlet>
        <servlet-name>cometd</servlet-name>
        <servlet-class>org.cometd.server.CometDServlet</servlet-class>
        <init-param>
          <param-name>allowedTransports</param-name>
          <param-value>long-polling</param-value>
        </init-param>
        ...
      </servlet>
      ...
    </web-app>
    

    如需进一步定制,您可以在其中指定要使用的传输实现类,另请参阅this section

    【讨论】:

    • 非常感谢您的回复。然而,这可以通过 Spring Boot 应用程序嵌入 tomcat 而不是码头来实现。另外,既然您已经确认它不需要 websocket,那么我们不需要在服务器上打开/启用 TCP。
    • 我不明白你的评论。 CometD 独立于 Servlet 容器,因此适用于 Tomcat 和 Jetty。 CometD 推荐使用 Jetty,因为 CometD+Jetty 的组合经过了良好的测试、良好的部署等。您可以将 Spring Boot 配置为使用 Jetty 而不是 Tomcat。服务器上必须有 TCP,因为 HTTP 是基于 TCP 的。
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2018-04-15
    • 2017-09-14
    相关资源
    最近更新 更多