genies_core
Genies (神灯) 框架的核心工具库,提供响应模型、错误处理、JWT 认证和条件表达式求值功能。
概述
genies_core 为基于 Genies 的微服务提供基础构建模块:
- 响应模型:
RespVO<T>和ResultDTO<T>用于 HTTP 响应格式化 - 错误处理:统一的
Error类型和Result<T>类型别名 - JWT 工具:Keycloak 集成,支持令牌验证
- 条件引擎:基于 JSON 的条件表达式求值
核心特性
- 双响应模型:字符串状态码(
RespVO)和数字状态码(ResultDTO)格式可选 - Salvo Writer 集成:两种响应类型均实现
Writertrait,支持直接渲染 - Keycloak JWT 支持:从 Keycloak 服务器获取密钥并验证令牌
- 灵活错误处理:支持从多种错误类型转换(
io::Error、rbdc::Error等) - Dapr Pubsub 支持:内置 Dapr 消息确认响应辅助方法
核心 API 参考
响应模型
| 类型 | 状态字段 | 说明 |
|---|---|---|
RespVO<T> |
code: String |
主模型,使用 CODE_SUCCESS / CODE_FAIL |
ResultDTO<T> |
status: i32 |
Java 兼容模型,使用 1(成功)/ 0(失败) |
常量
pub const CODE_SUCCESS: &str = "SUCCESS";
pub const CODE_FAIL: &str = "FAIL";
pub const CODE_SUCCESS_I32: i32 = 1;
pub const CODE_FAIL_I32: i32 = 0;
RespVO 方法
// 从成功数据创建
from
// 从 Result 创建
from_result
// 创建带自定义 code 的错误响应
from_error
from_error_info
// Dapr pubsub 响应
resp.is_success // {"status": "SUCCESS"}
resp.is_retry // {"status": "RETRY"}
ResultDTO 方法
// 创建成功响应
success
success_empty
// 创建错误响应
error
from_error
from_error_info
// 创建自定义 code 和消息
from_code_message
Error 类型
use Error;
// 从字符串创建
let err = from;
// 从其他错误转换
let err: Error = io_error.into;
let err: Error = rbdc_error.into;
JWT 模块
use ;
// 获取 Keycloak 公钥
let keys: Keys = get_keycloak_keys.await?;
// 获取服务账号访问令牌
let token = get_temp_access_token.await?;
// 使用 Keycloak 密钥验证令牌
let jwt = verify_with_keycloak?;
// 访问令牌声明
println!;
println!;
条件模块
use ;
use json;
// 定义条件树
let condition = ConditionTree ;
// 测试对象是否满足条件
let obj = json!;
let matches = obj_test;
支持的操作符:
| 类别 | 操作符 |
|---|---|
| 逻辑 | and, or |
| 比较 | =, <>, !=, <, <=, >, >= |
| 字符串 | contain, !contain |
| 数组 | arr_size_*, arr_exist_*, arr_each_* |
ID 生成模块
基于 rs-snowflake 的全局唯一雪花 ID 生成器,生成 64 位分布式 ID(String 类型),适用于数据库 VARCHAR 主键。
API
| 函数 | 签名 | 说明 |
|---|---|---|
init |
fn init(machine_id: i32, datacenter_id: i32) |
初始化生成器(启动时由 ApplicationContext 调用一次) |
next_id |
fn next_id() -> String |
生成全局唯一 ID |
用法
// 在业务代码中(通过 genies 重导出)
let id = next_id;
// 在核心库中(直接访问)
let id = next_id;
注意:生成器在
ApplicationContext::new()期间自动初始化。 除非有特殊原因,请勿手动调用init()。
快速开始
1. 添加依赖
也可以手动在
Cargo.toml中添加依赖,请前往 crates.io 查看最新版本。
2. 在 Salvo Handler 中使用
use *;
use ;
async
async
async
3. JWT 认证
use ;
async
4. ID 生成
use id_gen;
// 初始化(通常由 ApplicationContext 自动完成)
init;
// 生成唯一 ID
let order_id = next_id; // 例如 "4133437931841"
let event_id = next_id; // 例如 "4133437931842"
RespVO 与 ResultDTO 选择指南
| 场景 | 推荐 |
|---|---|
| 新的纯 Rust 服务 | RespVO<T> |
| 与 Java 服务互操作 | ResultDTO<T> |
| 需要字符串错误码 | RespVO<T> |
| 需要数字状态码 | ResultDTO<T> |
| Dapr pubsub 处理器 | RespVO<T>(有 is_success(), is_retry()) |
配置说明
JWT 函数需要 ApplicationConfig 中的 Keycloak 参数:
keycloak_auth_server_url: "http://keycloak.example.com/auth/"
keycloak_realm: "my-realm"
keycloak_resource: "my-client"
keycloak_credentials_secret: "your-client-secret"
依赖项
- salvo - Web 框架(Writer trait)
- serde / serde_json - 序列化
- jsonwebtoken - JWT 编解码
- reqwest - Keycloak HTTP 客户端
- thiserror - 错误派生宏
与其他 Crate 集成
- genies_config:JWT 函数使用
ApplicationConfig参数 - genies_context:
CONTEXT.config()提供 Keycloak 配置 - genies_auth:
salvo_auth中间件使用JWTToken进行认证
许可证
请参阅项目根目录的许可证信息。