13 个版本

0.5.2 2020 年 4 月 3 日
0.4.11 2020 年 4 月 2 日
0.4.10 2020 年 3 月 29 日
0.4.6 2020 年 1 月 27 日

148WebSocket

34 每月下载次数

LGPL-3.0GPL-3.0-only

495KB
13K SLoC

Rust 7.5K SLoC // 0.0% comments JavaScript 5K SLoC // 0.1% comments Shell 148 SLoC // 0.3% comments Bitbake 28 SLoC // 0.5% comments

romp

Romp 是用 rust 编写的 stomp 服务器

Romp 是一个基于 xtomp(一个用 C 编写的类似项目)的内存中消息服务器。

客户端可以使用 STOMP 协议通过 TCP 连接,或者通过 WebSocket 使用 STOMP。

STOMP 是 pub/sub 的,就像 HTTP 是请求和响应一样。

示例 STOMP 帧

CONNECT
login:xtomp
passcode:mypassword

\0

大多数语言和平台上都有许多 STOMP 客户端,从头开始编写客户端是微不足道的。
使用 telnet 客户端连接并手动输入协议也很简单。

Romp 通过允许 rust 代码处理某些消息类型,充当 WebSocket 开发平台。Romp 还允许 rust 处理 GET HTTP 方法(不是 POST)。需要处理 HTTP GET 以执行将 HTTP 连接升级为 WebSocket 的初始请求,但存在一个通用的框架,允许在升级请求之前处理任意 rust 代码。

独立使用

Romp 可以作为独立 STOMP 服务器运行,默认情况下通过 cargo run 运行,默认情况下读取服务器配置 /etc/romp.roml。Romp 打开以下端口

  • 8080 - 假设面向 Web 的 HTTP GET 和 WebSocket 连接。
  • 61613 - 标准的 STOMP 端口,假设为 TCP 连接,无论是 Web 还是本地局域网。
  • 61616 - 管理端口,假设不是面向 Web 的,应在云部署中阻止,或将 enable_admin = false 设置为 false

客户端可以使用专用 STOMP 客户端、带有 STOMP/WebSocket 的浏览器或直接使用 telnet 连接。

服务器端代码

Romp 可以作为库从 crates.io 加载,撰写本文时 romp 使用 tokio 1.x,即 pre async。

Romp 的最小服务器主程序如下

fn main() {
    tokio::run(romp_bootstrap());
}

这启动了默认服务器。

可以通过在引导服务器之前调用初始化方法将自定义 HTTP GET 和 STOMP 消息处理程序添加到配置中。
在调用 romp_bootstrap() 方法后调用过滤器方法是不安全的。

消息处理器使用过滤器模式,这对于熟悉 Java Servlet 开发的开发者来说应该很熟悉。与 I/O 流不同,过滤器提供了整个预解析的消息和发送响应的 API。

用于处理 STOMP 消息的过滤器应实现 MessageFilter 特性,用于 HTTP GET 请求的过滤器应实现 HttpFilter

这两个特性都提供了一个 init() 方法来设置过滤器的初始状态,该方法在服务器初始化期间调用一次,以及一个 do_filter(context: &mut Context, message: &StompMessage) 方法,该方法对每个请求进行调用。

插入过滤器的两种方法如下

romp_stomp_filter(Box::new(PingFilter {}));

romp_http_filter(Box::new(HelloFilter {}));

romp::workflow::filter::ping::PingFilterromp::workflow::filter::http::hello::HelloFilter 包含处理消息的示例代码。

提供了两种方便的方法,这些方法接受闭包而不是指向过滤器的指针。

romp_stomp(|ctx, msg|)

romp_http(|ctx, msg|);

过滤器代码应避免阻塞线程,Context 结构体包含一个 StompSession,该会话包含向客户端异步发送回复的方法。

从源代码构建

注意:仅适用于 Unix 系统,(使用 libc)旨在便于在容器中部署,例如 lxinitd,lcx,lxd 或 docker。

源代码:gitlab.com/teknopaul

使用 rustup 安装 rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

您可能需要卸载包管理器版本的 rustc,它有点糟糕,但 rustup 团队无意支持任何其他包管理器或甚至尝试与其共存。呸。

apt remove rustc

确保 cargo 在您的路径中

. go

或者将以下内容添加到您的配置文件中

. $HOME/.cargo/env

然后运行 makecargo build

构建静态链接的二进制文件

rustup target add x86_64-unknown-linux-musl
cargo build --release --target=x86_64-unknown-linux-musl

BUGs

注意:错误和功能已移动到 .later

参考资料

依赖项

~10MB
~170K SLoC