83 个版本 (27 个稳定版)
2.3.0 | 2024年7月24日 |
---|---|
2.2.3 | 2024年3月7日 |
2.0.0 | 2023年12月29日 |
1.1.7 | 2023年11月26日 |
0.5.2 | 2017年3月25日 |
#109 在 网络编程
每月120次 下载
37KB
590 代码行
mles-rs
Mles (现代轻量级通道服务) 是一种客户端-服务器数据分发协议,旨在作为轻量级且可靠的分布式发布/订阅数据服务。
请访问 https://mles.io 和 https://mles.io/blog.html 了解 Mles 的通用概述,以及 /c/mles 了解最新动态。
Mles v2 协议概述
Mles 客户端首先使用 TLS [1] WebSocket [2] 会话中的 Mles 协议头部第一帧值三元组(uid,通道,可选认证)连接到 Mles 服务器。三元组是 JavaScript 对象表示法(JSON)封装的。Mles 客户端首先通过发送正确的 Mles 协议头部第一帧值三元组(uid,通道,可选认证)订阅一个通道,其中 通道 是发布/订阅的通道。如果需要在 WebSocket TLS 上进行身份验证,则可能包含 认证。Mles 客户端必须将 Sec-WebSocket-Protocol 子协议设置为 "mles-websocket" [3],才能成功与 Mles 服务器建立连接。
Mles 服务器验证 Mles 协议头部第一帧,然后将 Mles 客户端加入到所选通道。每个通道都有自己的上下文,与其他通道独立:因此,总是使用每个(uid,通道)对的一个 TLS 会话。加入后,Mles 服务器将值三元组分发到同一通道上的所有客户端。如果 Mles 客户端想离开一个通道,它只需关闭 Websocket TLS 会话。如果 Mles 客户端不想接收任何消息,它只需关闭 WebSocket TLS 会话的接收端。
一个Mles服务器可以联系一个Mles对等服务器。Mles对等服务器将此会话视为另一个Mles客户端会话。这允许Mles服务器以有组织、强大且简单的方式在其他Mles服务器之间共享和分发值三元组数据。
Mles服务器可以保存接收到的数据的历史记录,这些数据可以在新客户端连接到Mles服务器时分发。如果Mles服务器重新启动,Mles对等服务器或Mles客户端都可以为Mles服务器提供历史数据,作为已具有历史记录的通道的重新同步。这允许对通道信息进行分布式数据保护。
Mles客户端和服务器独立于IP版本,不使用IP广播或多播。Mles服务器可以配置为使用IP单播。
Mles协议详情
Mles的第一个协议头帧如下
{
"uid":"<user identification>",
"channel":"<selected channel>",
"auth":"<optional authentication hash>"
}
服务器使用
Usage: mles [OPTIONS] --domains <DOMAINS> --wwwroot <WWWROOT>
Options:
-d, --domains <DOMAINS> Domain(s)
-e, --email <EMAIL> Contact info
-c, --cache <CACHE> Cache directory
-l, --limit <LIMIT> History limit [default: 200]
-f, --filelimit <FILELIMIT> Open files limit [default: 256]
-w, --wwwroot <WWWROOT> Www-root directory for domain(s) (e.g. /path/static where domain example.io goes to static/example.io)
-s, --staging Use Let's Encrypt staging environment (see https://letsencrypt.org/docs/staging-environment/)
-p, --port <PORT> [default: 443]
-r, --redirect Use http redirect for port 80
-h, --help Print help
示例服务器
- 获取一个具有静态IP+域名的公共互联网服务器
- 打开防火墙的TLS端口443
- 确保您的wwwroot目录下有静态网页,例如static/your.domain
- 以root身份运行Mles服务器(由于端口443),启用Let's Encrypt缓存和调试日志,如下所示
RUST_LOG=debug mles--domains your.domain--cache. --wwwrootstatic
您可以将多个域名列出来,例如 --domains your.domain --domains www.your.domain
。
示例客户端
使用websocat
的一个示例客户端会话如下所示
% websocat wss://mles.io --header "Sec-WebSocket-Protocol: mles-websocket"
{ "uid":"alice", "channel":"example" }
Hello Bob!
基于Mles(WebSocket)协议的现有客户端实现
- MlesTalk in JavaScript
- <请在此处添加您的客户端!>
参考资料
- 传输层安全(TLS)协议版本1.3,https://tools.ietf.org/html/rfc8446
- WebSocket协议,https://tools.ietf.org/html/rfc6455
- IANA注册的Mles WebSocket子协议,https://www.iana.org/assignments/websocket
依赖关系
~38–51MB
~1M SLoC