v0.4.0模块有边界,业务有空间

THE MODULAR RUST FOUNDATION

专注你的业务,
其余交给 Aynur.

一个可组合的 Rust 服务内核。将认证、权限、数据与 API 装配成你的应用,让每一块业务都有清晰的位置。

从第一个服务开始

GraphQL + HTTP静态链接,按需组合

APPLICATION / COMPOSITIONFIG. 01
profiles / your-app.toml
你的业务模块YOUR DOMAIN
订单内容你的下一个想法
Aynur Core共享内核 · 确定性装配
0.4
module_apisdkruntimeschemagatewaymigrator
authrbacuserossmediatag
GraphQLHTTPSQLite / PostgreSQL
一份 Profile,组合你的服务。PROFILE → SERVICE
基于你熟悉的 Rust 生态
Rust 1.85+Axumasync-graphqlToastyTokio
MIT / Apache-2.0

BUILT TO COMPOSE

基础能力复用,业务边界保留。

共享的是基础设施,掌握在你手里的是应用本身。

01 / MODULES

按业务组合,不从零搭建

认证、角色、用户、媒体与标签已有官方模块。通过 Profile 声明启用项,让不同项目共享同一套基础能力。

认识官方模块
02 / CONTRACTS

契约明确,错误提早暴露

模块声明依赖、权限、端口与冲突。运行时在启动阶段校验契约,按稳定的拓扑顺序完成装配。

了解装配流程
03 / OWNERSHIP

内核通用,项目保持自主

业务模块、端口接线、初始数据与部署配置留在你的项目。通过强类型 PortRegistry 连接模块能力。

查看接入方式

01 / ARCHITECTURE

六个核心,各司其职。

从模块声明到请求处理,
把一条完整的服务链路拆成清晰的职责。

STARTUP FLOW
  1. 加载 Profile
  2. 校验并排序模块
  3. 连接数据库与端口
  4. 初始化模块
  5. 构建 Schema
  6. 挂载路由

模块通过 inventory 静态链接;启用项由 Profile 决定。

02 / OFFICIAL MODULES

常用能力,已经就位。

六个官方模块,与内核统一版本发布。
展开了解职责、依赖和使用边界。

01身份认证aynur_core_auth基础身份

密码认证、JWT、验证码与登录风控持久化,为其他模块提供公开的身份 API。

模块 ID
aynur.core_auth
模块依赖
无
查看模块源码
02角色与权限aynur_core_rbac授权管理

数据库持久化的角色、模块声明的权限和用户角色分配。项目角色可在启动时声明,由初始化流程同步权限。

模块 ID
aynur.core_rbac
模块依赖
aynur.core_auth
查看模块源码
03用户管理aynur_core_user账户管理

基于认证模块的公开身份 API 提供用户管理,包含 GraphQL 和 HTTP 接口,并在服务层执行权限校验。

模块 ID
aynur.core_user
模块依赖
aynur.core_auth
查看模块源码
04对象存储aynur_ali_oss外部集成

阿里云 OSS 集成,提供带作用域限制的上传策略与对象存储配置。

模块 ID
aynur.ali_oss
模块依赖
aynur.core_auth
查看模块源码
05媒体资源aynur_media文件与图像

本地与 OSS 媒体元数据、上传接口、图片变体及强类型媒体读取端口。使用本地存储时需配置绝对路径 MEDIA_DATA_ROOT。

模块 ID
aynur.media
模块依赖
aynur.core_auth、aynur.ali_oss
查看模块源码
06标签系统aynur_tag内容组织

可复用的标签分类、标签和实体关联。实体标签写入由业务模块先验证实体,再调用服务 API 完成。

模块 ID
aynur.tag
模块依赖
aynur.core_auth
查看模块源码
profiles/example.toml
# 启用身份、权限与用户模块
name = "example"

[[modules]]
name = "aynur.core_auth"

[[modules]]
name = "aynur.core_rbac"

[[modules]]
name = "aynur.core_user"
来自仓库中的 consumer 示例

modules.toml 描述模块元信息,profiles/*.toml 决定启用哪些模块;构建期据此生成 GraphQL Schema。

03 / QUICKSTART

从一个能运行的服务开始。

准备 Rust 1.85+、Git 和 OpenSSL。
使用内置 SQLite 示例,走完第一条请求链路。

01

获取项目

下载与本页文档对应的 v0.4.0 代码,并进入仓库根目录。

浏览完整示例
Terminal
git clone --branch v0.4.0 --depth 1 \
  https://gitee.com/aynurcn/aynur_core.git
cd aynur_core
02

启动示例网关

指定 Profile 和数据库,生成本地 JWT 密钥。首次启动允许自动建表。

自动建表仅用于本地开发。
Terminal
APP_PROFILE=profiles/example.toml \
DATABASE_URL=sqlite:./data/example.db \
DATABASE_AUTO_MIGRATE=true \
JWT_SECRET="$(openssl rand -hex 32)" \
REGISTER_DEFAULT_ROLES=member \
cargo run -p aynur_core_example
03

发出第一条请求

在另一个终端检查健康状态,并向 GraphQL 发送查询。服务默认监听 4000 端口。

GET /healthPOST /graphql
Terminal
# 检查服务状态
curl --fail-with-body http://127.0.0.1:4000/health

# 查询 GraphQL 根类型
curl --fail-with-body http://127.0.0.1:4000/graphql \
  -H 'Content-Type: application/json' \
  --data '{"query":"{ __typename }"}'

服务跑起来之后,从 examples/consumer 的装配方式出发,加入你的业务模块。

继续接入

04 / INTEGRATION GUIDE

让 Aynur 成为你的项目内核。

保留业务的自主权,也遵守装配的明确契约。

在独立仓库中引入内核

开发时可使用本地 path 依赖;部署时,将全部核心 crate 和官方模块固定到同一个 Git tag。

Cargo.toml · dependencies
# 放入项目的 [dependencies]
aynur_core_module_api = { git = "https://gitee.com/aynurcn/aynur_core.git", tag = "v0.4.0" }
aynur_core_sdk = { git = "https://gitee.com/aynurcn/aynur_core.git", tag = "v0.4.0" }
aynur_core_gateway = { git = "https://gitee.com/aynurcn/aynur_core.git", tag = "v0.4.0" }

完整的运行入口、构建依赖与数据库 feature 接线,以 consumer 示例为准。生成到 Cargo OUT_DIR 的代码无需提交。

编写一个业务模块
  1. 依赖 aynur_core_module_api 和 aynur_core_sdk,声明模块的 ModuleDescriptor。
  2. 通过 inventory 注册一份 ModuleRegistration 和一份对应的 ModuleIntegration,连接模型、HTTP 路由与生命周期。
  3. 在项目 modules.toml 中填写模块 ID、crate 和 GraphQL 根类型,在 Profile 中启用模块。
  4. 在 build.rs 中生成 Schema 和模块链接代码,由网关装配入口引入。

依赖使用点分模块 ID,例如 aynur.core_auth。跨模块读取通过强类型端口连接,GraphQL resolver 仅提取请求数据,校验与业务逻辑放在服务层。

参考用户模块的注册方式
扩展 GraphQL Schema

生成代码公开 schema_builder、finish_schema 和 build_schema。需要注入项目专用的强类型数据时,使用 builder 扩展点。

src/main.rs · schema builder
#[derive(Clone)]
struct ProjectSchemaData;

fn build_project_schema(
    context: &aynur_core_sdk::AppContext,
) -> anyhow::Result<ActiveSchema> {
    Ok(finish_schema(
        schema_builder(context).data(ProjectSchemaData),
    ))
}

该片段放在已引入生成代码的装配入口中,再传入 GatewayBootstrap::new。生成的 Schema 内嵌构建期 Profile 名称;运行时 Profile 名称不一致会拒绝启动,需要重新构建。

选择 SQLite 或 PostgreSQL

默认使用 SQLite。切换到 PostgreSQL,需要同时启用编译特性和设置 PostgreSQL 连接 URL。仓库的 PostgreSQL 编译检查:

Terminal
cargo check --workspace \
  --no-default-features --features postgresql

仅修改 DATABASE_URL 不会启用数据库驱动。部署环境使用 aynur_core_migrator 与经过审查的迁移,不开启网关自动建表。

配置运行环境

网关和迁移器均以 project_root 为基准,加载其中的 .env,并解析相对 Profile 路径和 SQLite 数据库路径。

APP_PROFILE
必填,当前运行的 Profile 文件路径。
DATABASE_URL
SQLite 或 PostgreSQL 连接 URL,须匹配编译特性。
JWT_SECRET
JWT 与登录风控指纹使用的密钥。
TRUSTED_PROXY_IPS
允许提供转发头的确切代理 IP,逗号分隔,默认空。
GRAPHQL_MAX_DEPTH
查询深度限制,默认 16。
GRAPHQL_MAX_COMPLEXITY
查询复杂度限制,默认 500。
查看完整环境变量说明

05 / RELATED TOOLS

服务写好之后,还有这些伙伴。

内核负责装配业务,周边工具负责运行、发布和接收通知。按项目需要选择组合。

查看工具架构与协作方式

LESS BOILERPLATE. MORE BUSINESS.

下一块模块,属于你的业务。

从官方示例出发,把基础能力接好,把时间留给真正不同的部分。

打开 consumer 示例