一个简单的低负载联网网关,提供HTTP请求路由和处理功能
Project description
CallMe Gate
编写这个组件的初衷,是我希望有一个 内网穿透 服务,而且可以相当灵活地发布自己的个人 service 服务。
网络上有一些 SaaS 平台,都支持进行 回调(事件)这个特性,假如我们有一个稳定的服务器,接受这些回调,会让我们的 Service 多很多的扩展。
同时,要部署一个稳定的服务器,需要在线上一直部署一个 ECS,但对个人来说,这个非常浪费。因此我在构思,如何用一种比较低成本的方案,将我们的服务提供到公网进行服务呢?可以做一个非常简单的低负载联网网关,提供一个非常便宜及简洁的 Service 服务器。
技术调研上,我们可以将 gate 打包成一个函数计算程序包,可以发布到 aliyun 函数计算产品中,再使用一个 redis 实例保存状态,通过本地进程消费 redis 中状态进行计算服务。也就是说:gate 节点保存在线上, worker 节点可以保存在任意的进程中,甚至是你的移动设备。
因此我花了一点时间,编写了这个 gate 框架。
核心功能
- HTTP请求路由: 将客户端请求路由到合适的工作节点处理
- 动态路由注册: 工作节点可以动态注册API路由
- 服务发现: 支持工作节点的自动注册和发现
- 高可用设计: 支持多工作节点横向扩展
TODO
- 注册时通过分布式锁,避免路由状态错误
- 测试请求实际网络延迟 (阿里云深圳地区的函数计算接受一个 counter 的计数处理,worker 在广州家里。rtt 约 150ms )
- 实现一个简单的鉴权处理
- worker 的心跳机制, 避免强杀进程导致路由状态错误。
系统架构
客户端 -> 网关(gate.py) -> Redis队列 -> 工作节点(worker.py) -> Redis存储 -> 网关响应客户端
核心模块说明
网关 (gate.py)
网关是系统的入口点,负责接收所有客户端请求,并将请求转发给适当的工作节点处理。网关通过装饰器 @process_via_gateway 将API请求转换为HttpJob对象并推送到Redis队列。
工作节点 (worker.py)
工作节点从Redis队列中获取作业并处理。工作节点通过 @register_handler 装饰器将处理函数注册到特定路由路径和HTTP方法。
应用工作节点 (callme/app_worker.py)
实现了工作节点的核心逻辑,包括任务队列处理、路由处理器注册、以及处理结果的返回。
HTTP作业 (callme/model/http_job.py)
表示一个HTTP请求作业,包含请求和响应的所有相关信息,支持序列化和反序列化。
路由系统 (callme/router/)
- http_job_router.py: HTTP路由处理
- route_registry.py: 路由注册管理
- job_dispatcher.py: 任务分发和结果处理
- route_strategy.py: 路由策略实现(如轮询、随机等)
计数器示例 (exmaples/counter.py)
提供了一个完整的计数器API实现,演示如何使用网关-工作节点架构构建功能。
环境要求
- Python 3.7+
- Redis服务器
- 可选依赖库:Flask, redis, tabulate, python-dotenv
环境变量
在 .env 文件中配置:
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
REDIS_USE_SSL=false
快速开始
- 安装依赖
pip install -r requirements.txt
-
启动Redis服务器
-
运行工作节点
python worker.py
- 运行网关服务
python gate.py
网关默认在 http://localhost:9000 启动。
API端点
系统API
GET /health: 健康检查GET /routes: 获取所有已注册路由信息
计数器API示例
POST /api/counter/increment: 增加计数器,参数{"name": "计数器名", "amount": 数量}POST /api/counter/decrement: 减少计数器,参数{"name": "计数器名", "amount": 数量}POST /api/counter/reset: 重置计数器,参数{"name": "计数器名"}GET /api/counter/get?name=计数器名: 获取计数器值
工作节点扩展
系统支持多工作节点并行处理请求。可以通过启动多个工作节点实例来扩展系统处理能力:
python worker.py --version worker-1
python worker.py --version worker-2
...
使用示例
增加计数器
curl -X POST http://localhost:9000/api/counter/increment \
-H "Content-Type: application/json" \
-d '{"name": "visitors", "amount": 1}'
获取计数器值
curl http://localhost:9000/api/counter/get?name=visitors
单元测试
- 本地启动一个 redis 服务
./run.sh test
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file callme_gate-0.1.0.tar.gz.
File metadata
- Download URL: callme_gate-0.1.0.tar.gz
- Upload date:
- Size: 36.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e79ac07b170b01130cccdc10f1dbc4e80b00f6d250787a8e4d86acf732df1a5d
|
|
| MD5 |
4c85b1218987c5d99da111ddf0f2a886
|
|
| BLAKE2b-256 |
d75af2dbfb3af309fa98f5cecf750ee3380cce0c411b024b3c16ed9a03391a7c
|
File details
Details for the file callme_gate-0.1.0-py3-none-any.whl.
File metadata
- Download URL: callme_gate-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e409cb95287ea35434c7569dac6c3282e4326a36669a33436c4379a682aa010
|
|
| MD5 |
fd465936e491b808c27e7ca8d997ac58
|
|
| BLAKE2b-256 |
785a96e8d120d86dab2b33950e1ee1dd07b6a687b1af0b3363b63d1a27d0ada1
|