You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					51 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					51 lines
				
				2.0 KiB
			| 
								 
											2 weeks ago
										 
									 | 
							
								# Memobus Relay Server
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## 概述
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								使用 Go 语言编写编写高性能的 TCP 隧道中转服务器。作为中转服务端方案,它负责在 P2P 或局域网直连失败时,安全、高效地代理 App 与设备之间的所有流量,包括 HTTP 请求、WebSocket 长连接和文件流。
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## 架构
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								本服务采用**应用层连接调度**架构,作为可水平扩展的无状态节点运行。
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1.  **服务发现**: 启动时向 Redis 注册自身信息(公网地址、负载),并定时发送心跳。
							 | 
						||
| 
								 | 
							
								2.  **被动调度**: 等待后端**调度服务器**的指令。调度服务器负责选择最合适的 `relay-server` 节点,并通知设备前来连接。
							 | 
						||
| 
								 | 
							
								3.  **本地转发**: 一旦 App 和设备被调度到同一个节点,所有流量都在该节点内存中通过 `yamux` 多路复用隧道进行流量转发。
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## 特性
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*   **高性能 & 低开销**: 基于 Go 和 `yamux`,为高吞吐量设计。
							 | 
						||
| 
								 | 
							
								*   **水平扩展**: 无状态节点,可通过增加实例来扩展容量。
							 | 
						||
| 
								 | 
							
								*   **协议支持**: 完全支持 HTTP/1.1,并对大文件流和 WebSocket 提供了优化。
							 | 
						||
| 
								 | 
							
								*   **安全**: 连接通过 JWT 进行认证。
							 | 
						||
| 
								 | 
							
								*   **高可用**: 支持优雅停机,并与调度服务器的健康检查机制配合。
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## 部署与运行
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### 依赖
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*   Go 1.21+
							 | 
						||
| 
								 | 
							
								*   Redis
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### 配置 (`config.yml`)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								通过 `config.yml` 文件配置服务。关键配置项如下:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```yaml
							 | 
						||
| 
								 | 
							
								server:
							 | 
						||
| 
								 | 
							
								  app_listen_addr: ":8089"
							 | 
						||
| 
								 | 
							
								  device_listen_addr: ":7002"
							 | 
						||
| 
								 | 
							
								  public_app_addr: "YOUR_PUBLIC_IP:8089"    # App 访问的公网地址
							 | 
						||
| 
								 | 
							
								  public_device_addr: "YOUR_PUBLIC_IP:7002" # 设备访问的公网地址
							 | 
						||
| 
								 | 
							
								  instance_id: ""                           # 实例ID (留空自动生成)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								auth:
							 | 
						||
| 
								 | 
							
								  app_access_secret: "your-app-secret"
							 | 
						||
| 
								 | 
							
								  device_relay_secret: "your-device-secret"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								redis:
							 | 
						||
| 
								 | 
							
								  enabled: true
							 | 
						||
| 
								 | 
							
								  addr: "redis.internal:6379"
							 | 
						||
| 
								 | 
							
								  instance_registry_key: "relay_instances"      # 服务注册用的 Redis Key
							 | 
						||
| 
								 | 
							
								  device_relay_mapping_key: "device_relay_mapping" # 设备-实例映射用的 Redis Key
							 | 
						||
| 
								 | 
							
								  heartbeat_interval_seconds: 15
							 |