沿着SOCK JS的HTTP升级
使用STOMP客户端的Apache Kafka PUSH范式在行动
STOMP客户端、SOCK JS和WebSocket架构
范围
这篇文章是为了帮助初学者和中级人士了解WebSocket双向的和全双工 通信到 API(应用程序接口)和 UI(用户界面)的通信,并附有代码示例。
对以下概念进行了解释。
a.WebSocket, HTTP升级
b.Sock JS, JavaScript
libraryc.STOMP客户端(Simple Text-Oriented Messaging Protocol)
d.Kafka异步PUSH范式
先决条件
a. kafka_2.13-2.8.
0b.Offset Explorer 2.0(Kafka工具)
c.Spring boot
什么是WebSocket?与HTTP相比,我们看到了哪些优势?
HTTP 编码是同步的,并且是基于 拉动 范例。在PULL范式中,客户必须发起请求 ,并轮询服务器以接收新数据,这是半双工和单向的**。
一种新的TCP(传输控制协议)** 每次建立连接时,都需要一个新的TCP传输控制协议。
WebSocket 是全双工和双向的。这意味着客户端或服务器可以发起一个请求,通信可以在浏览器和服务器之间的持续连接中平行流动,直到其中任何一方断开并关闭连接。
与http相反,websocket支持异步通信,允许服务器基于PUSH范式发起请求。服务器可以发起请求并向客户推送实时信息。
最初的http连接被 升级为websocket,并用于单个 TCP会话_中的_所有未来通信_。与 http相比,websocket的数据交换规模要小得多**。
**HTTP每次发出请求时都会携带开销,并将头文件和cookies传输到服务器,这增加了_延时。 websocket提供了一个持久的低延迟连接。
这篇文章是如何组织的?它分享了哪些组件和产品来解释?
让我们了解一下设计:-
一个简单的浏览器客户端将通过Sock JS(一个JavaScript库)建立websocket连接。浏览器发起的请求将升级到websocket,以提供一个持久的、全双工的、双向的连接。Sock JS客户端将尝试使用最佳的可用传输方式进行连接,即[websocket、xhr轮询、xhr流]。
STOMP(Simple Text-Oriented Messaging Protocol)在websocket协议的基础上发挥作用,向服务器发起请求,同时订阅一个内存中的消息代理。在这个设计中,数据由Kafka Listener从Kafka Topic接收并异步发送到内存中的消息代理。由于STOMP客户端已经订阅了内存消息代理,它将收到数据并显示在客户端。
来自客户端的数据传输和来自服务器的数据接收是异步进行的。
让我们来看看这个代码,了解它是如何工作的?
a.JavaScript代码
JavaScript代码--连接和订阅
上述JavaScript代码调用函数connect(),启动了http连接并升级到websocket。传递给Sock JS构造函数的端点是一个已注册的STOMP端点,支持Sock JS与websocket通信。STOMP客户端订阅了一个内存中的消息代理,以接收由Kafka在服务器端推送的异步数据。
b.Spring boot配置类
配置代码显示了STOMP端点的注册和启用内存中消息代理。
STOMP注册和启用内存中的消息代理
_c.Spring boot Kafka Listener类
_Kafka Listener将异步接收来自Kafka Topic的数据,并将收到的数据推送给STOMP客户端订阅的端点,该端点是内存中的消息代理,如下所示。
Kafka监听器
让我们运行该应用程序。浏览器到服务器
In this application the following are performed:-
1.启动Zookeeper和Kafka broker
在2181端口运行的Zookeeper实例
在9092端口运行的Kafka Broker 0
2.启动Offset Explorer工具,向Kafka Topic发送消息
向Kafka代理发送消息--键/值对
3.启动Spring boot应用程序
收到来自Kafka Broker的消息
4.在开发工具模式下启动浏览器,查看连接 升级 到WebSocket
模式。开发者工具 - 连接UPGRADE
5.查看由STOMP客户端订阅的从Kafka Topic收到的消息
PUSH通知 - 从Kafka代理处收到的异步消息
总结
通过本文的总结,我们了解了WebSocket与Sock JS和STOMP客户端的定义和使用优势。应用设计和实现帮助我们理解了简单的代码片段,它启动了websocket连接,并从Kafka Topic异步接收数据,发布到客户端的用户界面上。