genies_context
Genies 框架的应用上下文管理库,提供全局上下文、数据库连接、缓存服务和跨服务认证。
概述
genies_context 提供应用运行时上下文的集中管理,包括数据库连接池、缓存服务、Keycloak 认证密钥和跨服务 Token 管理。使用 lazy_static 模式在整个应用中提供全局单例访问。
核心特性
- 全局上下文单例:
CONTEXT提供对配置、数据库和缓存的访问 - 数据库连接池:通过 RBatis 实现异步 MySQL 连接池
- 缓存服务:Redis 支持的缓存,分离数据缓存和持久化缓存通道
- Keycloak 集成:JWT 密钥获取和 Token 验证
- 跨服务 Token:
REMOTE_TOKEN用于服务间认证 - K8s 健康状态:
SERVICE_STATUS用于就绪/存活探针 - Salvo 认证中间件:
salvo_auth用于 JWT 认证
架构设计
核心组件
| 组件 | 文件 | 功能 |
|---|---|---|
ApplicationContext |
app_context.rs | 主上下文结构,包含配置、rbatis、缓存服务 |
CONTEXT |
lib.rs | 通过 lazy_static 实现的全局单例 |
REMOTE_TOKEN |
lib.rs | 跨服务 Token 存储(Mutex<RemoteToken>) |
SERVICE_STATUS |
lib.rs | K8s 探针状态(Mutex<HashMap>) |
init_mysql |
app_context.rs | 异步数据库连接池初始化 |
RemoteToken |
app_context.rs | 服务间认证 Token |
salvo_auth |
auth.rs | Salvo JWT 认证中间件 |
checked_token |
auth.rs | Token 验证函数 |
is_white_list_api |
auth.rs | API 白名单检查 |
初始化流程
应用启动 → CONTEXT (lazy_static) → init_mysql() → 就绪
│
├── ApplicationConfig (./application.yml)
├── Keycloak Keys (异步获取)
├── CacheService (Redis)
└── RBatis (MySQL 连接池)
快速开始
1. 添加依赖
[]
= { = "../path/to/genies_context" }
= { = "../path/to/genies_config" }
= { = "../path/to/genies_cache" }
= { = "../path/to/genies_core" }
= "4.x"
2. 初始化数据库
use CONTEXT;
async
3. 使用数据库连接
use CONTEXT;
use Executor;
pub async
// 使用事务
pub async
4. 使用缓存服务
use CONTEXT;
pub async
5. 配置 Salvo 认证中间件
use salvo_auth;
use *;
let router = new
.hoop // JWT 认证中间件
.push;
API 参考
ApplicationContext 结构体
全局单例
lazy_static!
RemoteToken 结构体
认证函数
/// 检查路径是否在 API 白名单中
;
/// 验证 Token 并返回 JWTToken
pub async ;
/// 检查授权(当前返回 Ok)
pub async ;
/// Salvo JWT 认证中间件
pub async ;
配置说明
application.yml 结构
server_url: "0.0.0.0:5800"
database_url: "mysql://user:pass@localhost:3306/db"
max_connections: 10
wait_timeout: 30
max_lifetime: 3600
# Redis
redis_host: "localhost"
redis_port: 6379
# Keycloak
keycloak_auth_server_url: "http://localhost:8080"
keycloak_realm: "myrealm"
keycloak_resource: "myapp"
keycloak_credentials_secret: "secret"
# 白名单 API(跳过认证)
white_list_api:
- "/health"
- "/dapr/*"
- "/swagger-ui/*"
认证中间件流程
请求 → salvo_auth
│
├── is_white_list_api? → 是 → 继续(跳过认证)
│
└── 否 → checked_token()
│
├── 有效 → check_auth() → depot.insert("jwtToken", token)
│ → 继续
│
└── 无效 → 401 Unauthorized
K8s 健康状态
use SERVICE_STATUS;
// 更新就绪状态
// 检查存活状态
依赖项
- genies_config - 应用配置
- genies_cache - 缓存服务抽象
- genies_core - JWT 工具、错误类型
- rbatis - ORM 框架
- rbdc-mysql - MySQL 驱动
- lazy_static - 全局单例模式
- tokio - 异步运行时
- salvo - Web 框架(用于认证中间件)
与其他 Crate 集成
- genies_auth:使用
CONTEXT.rbatis存储策略,使用salvo_auth进行 JWT 验证 - genies_ddd:使用
CONTEXT.rbatis发布事件 - genies_dapr:使用
CONTEXT.rbatis进行事务管理 - genies_config:为上下文初始化提供
ApplicationConfig
线程安全
CONTEXT:lazy_static确保单次初始化,字段是线程安全的init_mysql():使用Once实现幂等初始化REMOTE_TOKEN:Mutex<RemoteToken>实现线程安全访问SERVICE_STATUS:Mutex<HashMap>实现线程安全状态更新
许可证
请参阅项目根目录的许可证信息。