modify: 网关拆为独立包 chongming-gateway(源码迁出到 utils/gateway,打包只留 plugins.mbank)

This commit is contained in:
2026-10-13 17:29:38 +08:00
parent ac7ddb7445
commit 6d087fa4e3
44 changed files with 298 additions and 5594 deletions
+2 -1
View File
@@ -84,8 +84,9 @@ use_embedded_broker = true
# 详细参数参考: https://github.com/Yakifo/amqtt
[production.module_system]
# 运行期模块银行加载清单(frozen 产物用):网关本体是普通依赖包(chongming-gateway,
# 已由 PyInstaller/Nuitka 打进产物),只有内置插件经模块银行加载。
path = [
"resources/app.mbank",
"resources/plugins.mbank",
]
type = "module-bank"
+10 -8
View File
@@ -18,22 +18,22 @@ import os
import platform
import sys
from multiprocessing import freeze_support
from pathlib import Path
import server # noqa: F401 # 预加载:master 内完成模块银行装载,fork 出的 worker 共享
import server # noqa: F401 # 预加载:master 内完成插件模块银行装载,fork 出的 worker 共享
import uvloop # noqa: F401 # 显式导入保证打包时收集 uvloop(uvicorn/granian loop 依赖)
from chongming import RELOAD_PATHS # 热重载监听目录(网关包内定义)
from chongming.app.core.logger import get_logger
from chongming.app.core.parent_death import guard_parent_death
from utils.launch import launch
from uvicorn.workers import UvicornWorker
use_shell = platform.system() == "Windows"
# 未设置 APP_SERVER 时的平台默认(保持现状)
DEFAULT_SERVER = "uvicorn" if use_shell else "gunicorn"
# DEFAULT_SERVER = "uvicorn" if use_shell else "gunicorn"
DEFAULT_SERVER = "granian"
SUPPORTED_SERVERS = ("gunicorn", "uvicorn", "granian")
# 热重载(reload=true)监听的源码目录,避免 granian 默认扫 cwd 时被 logs/ 写日志触发
RELOAD_PATHS = [Path("src/chongming"), Path("src/plugins")]
class UvloopUvicornWorker(UvicornWorker):
CONFIG_KWARGS = {"loop": "uvloop"}
@@ -134,8 +134,6 @@ def app_run(app_config: dict, default_config: dict):
Returns:
None: 此函数不返回值,直接启动服务器并阻塞运行
"""
from app.core.logger import get_logger # type: ignore
logger = get_logger("app")
params = _server_params(app_config)
@@ -182,6 +180,10 @@ def main():
Returns:
None: 此函数不返回值,调用launch函数启动应用
"""
# 父进程死亡防护(master 侧):引导进程(onefile 引导/终端 shell)死亡时
# ——含被 SIGKILL——内核给本进程发 SIGTERM,granian 走优雅停机收掉全部 worker;
# worker 侧在 app 的 lifespan 里各自设置(PR_SET_PDEATHSIG 不跨 fork 继承)。
guard_parent_death(get_logger("app"))
freeze_support()
launch(app_run, "production")
+6 -7
View File
@@ -3,18 +3,17 @@ import sys
from utils.launch import init_module_bank
from utils.config import ConfigLoader
# 加载配置文件并初始化模块银行
# 加载配置文件并初始化模块银行(当前只剩内置插件 plugins.mbank)
config = ConfigLoader("config.toml")
init_module_bank(config)
# 从数据库动态导入 app 模块
# 该模块存储在 SQLite 数据库中,通过自定义导入机制加载
# 网关本体是普通依赖包(chongming-gateway),直接导入即可——打包时
# PyInstaller/Nuitka 也沿这行静态收集网关及其依赖。
# 插件(plugins 包)由上面的模块银行提供,在 lifespan 启动时被网关按配置加载。
try:
import app # type: ignore
app_instance = app.app
from chongming.app import app as app_instance
except ImportError as e:
print(f"无法从数据库导入 app 模块: {e}")
print(f"无法导入网关(chongming.app): {e}")
sys.exit(1)
# 暴露 ASGI 应用实例,供 uvicorn 服务器使用