[氖-Neon] Rust 开发工具集
# 按需启用 feature
cargo add neon-rs --features "crypto,macros,redis,sql-mysql"| 模块 | 说明 |
|---|---|
core |
基础模块(始终可用) |
config |
配置模块,基于 config crate 统一加载与读取;支持 Nacos |
crypto |
加密模块,支持:hash / aes / des / rsa |
helper |
辅助模块,支持:经纬度坐标转换、远程读取 ZIP 解析 等 |
log |
日志模块,封装 tracing Layer,对接外部日志后端;支持 sls |
macros |
宏模块,支持:sqlx 模型派生宏 Model |
redis |
Redis 模块,支持:异步连接创建、redlock 分布式锁、辅助方法 |
sql |
DB 模块,支持:连接创建 和 基于 sea-query 的 CRUD 封装 |
config— 第三方配置接入,基于configcrate 统一加载与读取config-nacos— Nacos 配置源(toml / yaml / json 等;本地文件或远程;热更新)
crypto— 加密模块全集(hash / aes / des / rsa)crypto-hash— HASH 与 HMACcrypto-aes— AES (CBC / ECB / GCM)crypto-des— DEScrypto-rsa— RSA
helper— 一些辅助方法log— 封装 tracing Layer,对接外部日志后端log-sls— 阿里云 SLS 异步批量投递(含 span 上下文)
macros—sqlx模型派生宏Modelredis— 异步连接创建、redlock 分布式锁、辅助方法redis-cluster— Redis Cluster 异步连接redis-sync-lock— 同步RedLock(r2d2)redis-tls-rustls— TLS(rediss://,rustls 后端)redis-tls-rustls-insecure— TLS + 跳过证书校验(自签名证书,rediss://...#insecure)redis-tls-native-tls— TLS(rediss://,native-tls 后端)
sql— 连接创建 和 基于sea-query的 CRUD 封装sql-mysql— 仅 MySQLsql-postgres— 仅 PostgreSQLsql-sqlite— 仅 SQLite
启用 config-nacos 后,通过 neon::config::nacos 访问。APP_ENV=local 时加载本地文件,其它环境从 Nacos 拉取并自动热更新。详见 neon-config 模块文档。
use neon::config::nacos::{DEFAULT_ENV_VAR, Env, NacosConfig, NacosSource};
let source = NacosSource::new("127.0.0.1:8848", "").data_id("app.toml");
let cfg = NacosConfig::builder()
.local_file("config/app.local.toml")
.nacos(source)
.build(Env::from_var(DEFAULT_ENV_VAR))
.await?;
let port = cfg.get_int("server.port")?;启用 log 或 log-sls 后,通过 neon::log::sls 接入 tracing Layer:无锁有界队列解耦生产与投递,后台 worker 负责攒批与异步发送,热路径 lock-free、零 I/O。详见 neon-log 模块文档。
use neon::log::sls::{SlsConfig, StaticCredentialsProvider, build};
let config = SlsConfig::new(
endpoint,
project,
logstore,
StaticCredentialsProvider::new(ak_id, ak_secret),
);
let (sls_layer, _guard) = build(config).expect("init sls layer");
// _guard 须持有到进程结束redlock 为单 key SET NX + TTL 互斥锁,非 Antirez 多 master quorum Redlock;未获锁时 acquire 返回 None
pgsql::insert / batch_insert 通过 query_as 读取结果,INSERT 语句须包含 RETURNING(例如:.returning_all() 或 .returning_col(...))
生成带
sqlx::FromRow的子 struct(字段子集),便于查询映射
#[derive(Model)]
#[model(UserLite !(email, phone))] // 排除字段
#[model(UserBrief (id, age), derive(Copy, Debug))] // 包含字段
pub struct User {
pub id: i64,
#[sqlx(rename = "username")]
pub name: String,
pub age: i8
pub email: String,
pub phone: String,
}- 生成代码
#[derive(sqlx::FromRow)]
pub struct UserLite {
pub id: i64,
#[sqlx(rename = "username")]
pub name: String,
pub age: i8,
}
#[derive(sqlx::FromRow, Copy, Debug)]
pub struct UserBrief {
pub id: i64,
pub age: i8,
}Enjoy 😊