Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

一个用Go实现的轻量化分布式消息中间件。

Notifications You must be signed in to change notification settings

SWYZJustin/Majula

Repository files navigation

Majula - 分布式通信中间件

注意:该项目仍在开发中,可能存在各种各样的问题。请勿在生产环境中使用。(Rust相关功能以及节点自发现相关功能)

项目简介:Majula 是一个用 Go 语言编写的轻量级分布式通信中间件。其设计目的在于为节点提供了一套通信、控制与协作的功能集成,并加以弱网优化与节点的自发现机制,使得对边端节点的控制更加容易和方便。

核心特性:提供节点间消息传递、RPC、基于主题的发布/订阅、动态数据流穿透(基于隧道机制)、内置动态反向代理等功能,同时提供了节点选举与基于Raft和leveldb的分布式一致性存储来促进节点协作,辅以配合的信令服务器进行简便的节点自动发现和连接功能。

应用场景:潜在的应用场景有中控节点对边缘节点的远程控制,边缘节点之间的协作等等,适用于一些较为轻量化的场景。


核心功能

分布式节点管理

每个节点都有唯一 ID,支持节点发现、心跳检测和链路管理。节点通过 TCP 或 KCP 协议建立连接,形成网络拓扑。系统维护节点间连接状态,处理节点上线/下线场景。

轻量级消息路由

支持点对点直接通信、基于主题的发布/订阅和广播消息。消息路由根据目标节点选择合适路径,支持消息重试机制。发布/订阅模式允许节点订阅主题并接收相关消息。

RPC 远程调用

支持在节点间注册和调用自定义服务。支持同步和异步调用模式,能够指定目标节点和服务提供者。服务可由节点或是连接到节点的客户端进行动态提供。

WebSocket 和 HTTP API

提供统一的 API 接口,支持 WebSocket 和 HTTP 客户端。WebSocket 接口提供实时双向通信,HTTP 接口便于集成和测试。所有 API 使用 JSON 数据格式。

高性能 KCP 通道

除 TCP 连接外,还支持基于 UDP 的 KCP 通道。KCP 通道在弱网络环境下提供更低延迟,适用于对网络质量要求较高的场景。通讯信息使用messagepack进行序列化,减小信息大小。

信令服务器与节点发现

提供基于 UDP 打洞技术的信令服务器,支持自动节点发现和连接协调。信令服务器作为节点间的中介,帮助它们发现彼此并建立直接连接,适用于各种 NAT 环境。

分布式共识与协作

实现基于 Raft 的分布式共识算法,提供强一致性的分布式数据管理。支持静态核心集群和动态学习者机制,确保集群稳定性同时提供扩展性。

分布式选举

提供轻量级的分布式选举系统,不依赖复杂共识算法,实现快速故障转移。支持多选举组,适用于需要高可用性但不要求严格一致性的场景。


快速开始

1. 安装依赖

go mod tidy

2. 启动信令服务器(可选)

go run SignalingServerFromYaml.go

3. 启动本地节点

# 使用默认配置(不连接信令服务器)
go run MajulaNodeFromYaml.go

# 使用自定义配置
go run MajulaNodeFromYaml.go MajulaNode1.yaml

# 启用信令服务器连接
go run MajulaNodeFromYaml.go MajulaNodeWithSignaling.yaml

具体的配置文件设置请参照提供的模板YAML配置文件。

节点配置模板

基础节点配置 (MajulaNodeTemplate.yaml)

# 节点基础配置
node:
  id: "node-001"                    # 节点唯一标识
  name: "My Node"                   # 节点名称
  port: 18080                       # 节点监听端口
  
# 通道配置
channels:
  tcp:
    enabled: true                   # 启用TCP通道
    port: 18081                     # TCP通道端口
    tls_enabled: false              # 是否启用TLS加密
  
  kcp:
    enabled: false                  # 启用KCP通道
    port: 18082                     # KCP通道端口

# 信令服务器配置(可选)
signaling:
  enabled: false                    # 是否启用信令服务器连接
  url: "ws://localhost:18090"       # 信令服务器地址
  udp_port: 18091                   # 信令服务器UDP端口

# Raft配置
raft:
  enabled: false                    # 是否启用Raft共识
  groups: []                        # Raft组配置列表

# 选举配置
election:
  enabled: false                    # 是否启用分布式选举
  groups: []                        # 选举组配置列表

启用信令服务器的配置 (MajulaNodeWithSignaling.yaml)

# 节点基础配置
node:
  id: "node-with-signaling"
  name: "Node with Signaling"
  port: 18080

# 通道配置
channels:
  tcp:
    enabled: true
    port: 18081
    tls_enabled: false
  
  kcp:
    enabled: true                   # 启用KCP通道
    port: 18082

# 信令服务器配置
signaling:
  enabled: true                     # 启用信令服务器连接
  url: "ws://localhost:18090"
  udp_port: 18091
  reconnect_interval: "30s"
  heartbeat_interval: "30s"

# 其他配置...

通道协议配置

Majula 支持 TCP 和 KCP 通道协议。TCP 通道提供可靠有序传输,支持 TLS 加密。KCP 通道基于 UDP,在弱网络环境下表现更好,但不支持 TLS。


API 接口概览

Majula 提供 API 接口,所有端点都在 /majula 路径下,支持 GET 和 POST 方法。

核心功能接口

  • WebSocket 连接:提供实时双向通信
  • 消息发送/接收:支持点对点和广播消息传递
  • 主题订阅:支持基于主题的发布/订阅模式
  • RPC 调用:支持远程过程调用,包括同步和异步模式
  • 私密消息:支持节点间私密消息传递

高级功能接口

  • RPC 服务管理:注册、注销和查询 RPC 服务
  • 内置反向代理管理:动态配置反向代理规则
  • 数据流穿透隧道管理:配置和管理跨节点 TCP 数据流隧道
  • 基于隧道的文件传输:支持节点间文件上传和下载
  • 基于Raft的动态Learner加入:支持节点动态加入配置的Raft组,实现基于Raft的动态同步
  • 节点选举:支持节点动态加入选举组,达成最终一致性的选举
  • 信令服务器管理:节点发现、连接协调和状态管理

开发工具

Go SDK

Majula 提供封装核心功能的 Go SDK。SDK 提供高级 API,处理底层网络通信细节。

客户端库

提供支持 WebSocket 和 HTTP 通信方式的客户端库。客户端库处理连接管理、消息序列化、错误重试等细节。

配置管理

支持 YAML 格式配置文件,用于节点参数、网络设置、安全选项等。


动态数据流穿透(基于隧道机制)

说明:内置数据流隧道,提供可靠的流式转发与重传控制。

隧道功能

提供跨节点的 TCP 数据流转发能力,支持端口映射、文件传输与服务暴露等。不同网络环境中的节点可在协商后建立数据通道。

动态端口映射

支持动态配置端口映射规则,无需手动配置防火墙。节点可以自动注册和注销端口映射,实现灵活的网络访问控制。

文件传输(基于隧道)

依托内置隧道实现节点间文件传输。支持大文件传输、断点续传、传输进度监控等特性。

服务暴露

可以通过 FRP 隧道将本地服务暴露给远程节点,实现跨网络服务访问。支持 HTTP、TCP、UDP 等协议。


内置动态反向代理

说明:反向代理为内置实现,基于 URL 前缀与查询参数匹配进行请求分发。

代理功能

提供内置动态反向代理能力,将本地或远端服务通过中间件对外映射。支持 HTTP 服务映射与代理转发,规则可通过 API 动态配置。

动态配置

支持运行时动态添加、修改和删除代理规则,无需重启服务。通过简单的 API 调用实现实时更新。

代理转发

支持 HTTP 服务代理转发,将服务在节点间进行透明暴露与访问。


信令服务器

核心机制:轻量级的信令服务器基于UDP打洞机制,通过公网的信令服务器可以提供节点之间的自发现与连接自动创建的功能。

UDP 打洞

提供基于 UDP 打洞技术的信令服务器,支持自动节点发现和连接协调。信令服务器作为节点间的中介,帮助它们发现彼此并建立直接连接。通过 UDP 打洞技术实现 NAT 穿透,适用于各种 NAT 环境。

消息中继

当无法建立直接连接时,信令服务器可以作为消息中继,确保节点间通信可靠性。


分布式共识

架构设计:实现了分布式的Raft共识算法,用于确保节点数据管理之间的强一致性,同时采取了静态核心集群+动态学习者的机制,用于确保Raft核心组的稳定并辅以一定的扩展性和动态性。提供了学习者的状态机快照快速加入,提升进组效率。

Raft 共识算法

Majula 实现 Raft 共识算法,提供强一致性的分布式数据管理。每个 Raft 组都有独立的领导者选举、日志复制和状态机。

多组支持

单个节点可以参与多个独立的 Raft 组,每个组管理不同的数据。这种设计允许根据业务需求进行数据分区。

静态核心集群

核心节点在配置文件中静态定义,确保集群稳定性。核心节点参与所有共识决策,保证数据一致性。

动态学习者

支持动态添加学习者节点,可以读取数据但不参与共识决策。适用于数据同步、备份等场景。动态者通过一套推荐流程加入Raft组。Raft组通过决议实现学习者加入的一致性,并可通过快照快速加入,提升入组效率。


分布式选举

设计思路:分布式选举是基于Raft的第一段流程选举设计的,在设计上提供了更快的响应速度和优雅放弃机制,实现了节点之间的最终一致性选举。

轻量级设计

选举系统采用轻量级设计,不依赖复杂的共识算法,提供快速故障转移能力。适用于需要高可用性但不要求严格一致性的场景。

三状态机制

节点在选举过程中有三种状态:忙碌(初始化)、待命(准备接管)和值班(当前领导者)。状态转换基于心跳和超时机制。

多选举组

支持多个独立的选举组,每个组独立进行领导者选举。适用于不同业务模块的高可用性要求。


额外系统特点

系统优化:Majula 在性能、安全性和可观测性方面进行了全面优化,确保在各种网络环境下都能稳定运行。

网络优化

  • 连接池管理:管理连接池实现连接复用
  • 流量控制:实现连接速率限制防止系统过载
  • 超时重试:处理网络超时和重试逻辑

安全机制

  • TLS 加密:支持 TLS 加密通信
  • 身份认证:支持基于令牌的身份认证
  • 访问控制:支持 IP 白名单和访问权限控制

监控和调试

  • 日志系统:支持结构化日志和日志级别控制
  • 调试工具:提供调试接口和工具

项目结构

代码组织:项目采用模块化设计,核心功能、API接口、服务器实现和示例代码分别组织在不同目录中,便于维护和扩展。

  • core/:核心逻辑模块,包括节点管理、消息路由、RPC 框架等
  • api/:客户端 SDK 和 API 定义
  • server/:信令服务器实现
  • example/:示例代码和使用演示
  • MajulaNodeFromYaml.go:节点启动入口程序
  • SignalingServerFromYaml.go:信令服务器启动入口程序
  • MajulaNodeTemplate.yaml:节点配置模板
  • SignalingServerTemplate.yaml:信令服务器配置模板

联系和贡献

开源协作:Majula 是一个开源项目,我们欢迎社区贡献。无论是功能建议、代码改进还是文档完善,都是对项目的宝贵贡献。

如有建议、错误报告或贡献,请提交 Issues 或 PR!我们欢迎任何形式的贡献,包括但不限于:

  • 功能建议和需求反馈
  • 代码改进和优化
  • 文档改进和翻译
  • 测试用例和示例代码
  • 性能优化和错误修复

About

一个用Go实现的轻量化分布式消息中间件。

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages