pub struct CoreConfig { /* private fields */ }Expand description
§零拷贝配置共享实现
Config 内部使用 Arc<ConfigInner> 实现零拷贝共享:
§性能特性
- 内存效率: 所有克隆共享同一份配置数据(~300-500字节)
- 克隆成本:
Config::clone()只复制Arc指针(8字节 + 原子操作) - 线程安全: Arc保证多线程安全的只读访问
- 引用计数: 自动管理内存,无泄漏风险
§使用建议
// ✅ 推荐: 克隆Config传递给服务
let service = MyService::new(config.clone());
// ✅ 推荐: 在Request中持有Config
pub struct MyRequest {
config: Config, // 持有Arc指针,成本低
}
// ⚠️ 不必要: 使用Arc<Config> (Config内部已经是Arc)
// Arc<Arc<ConfigInner>> = 双重Arc,没有额外收益§性能验证
运行 cargo test config_arc 查看基准测试:
- 克隆速度: ~10-20纳秒
- 内存开销: 每个克隆仅8字节
- 引用计数: 自动维护
Implementations§
Source§impl Config
impl Config
Sourcepub fn builder() -> ConfigBuilder
pub fn builder() -> ConfigBuilder
创建配置构建器
Sourcepub fn new(inner: ConfigInner) -> Config
pub fn new(inner: ConfigInner) -> Config
创建新的 Config 实例,直接从 ConfigInner
Sourcepub fn with_token_provider(
&self,
provider: impl TokenProvider + 'static,
) -> Config
pub fn with_token_provider( &self, provider: impl TokenProvider + 'static, ) -> Config
基于当前配置生成一个“替换 TokenProvider”的新配置
说明:
- 这是一个纯拷贝操作(
Config本身是Arc包装),不会修改原配置 - 推荐用法:先构建一个“基础 Config”(默认
NoOpTokenProvider),再用该基础 Config 构建业务 TokenProvider, 最后调用此方法把 provider 注入到“业务 Config”中,避免循环引用。
Sourcepub fn reference_count(&self) -> usize
pub fn reference_count(&self) -> usize
获取内部 Arc 的引用计数
Sourcepub fn app_secret(&self) -> &str
pub fn app_secret(&self) -> &str
获取应用密钥
Sourcepub fn req_timeout(&self) -> Option<Duration>
pub fn req_timeout(&self) -> Option<Duration>
获取超时时间
Sourcepub fn enable_token_cache(&self) -> bool
pub fn enable_token_cache(&self) -> bool
是否启用令牌缓存
Sourcepub fn http_client(&self) -> &Client
pub fn http_client(&self) -> &Client
获取 HTTP 客户端引用
Sourcepub fn token_provider(&self) -> &Arc<dyn TokenProvider>
pub fn token_provider(&self) -> &Arc<dyn TokenProvider>
获取 TokenProvider 引用
Sourcepub fn max_response_size(&self) -> u64
pub fn max_response_size(&self) -> u64
获取响应体最大大小限制
Sourcepub fn retry_count(&self) -> u32
pub fn retry_count(&self) -> u32
获取重试次数
Sourcepub fn enable_log(&self) -> bool
pub fn enable_log(&self) -> bool
是否启用日志记录
Sourcepub fn allow_custom_base_url(&self) -> bool
pub fn allow_custom_base_url(&self) -> bool
是否允许自定义 base_url 域名(绕过白名单 SSRF 防护)
Sourcepub fn validate(&self) -> Result<(), CoreError>
pub fn validate(&self) -> Result<(), CoreError>
校验配置有效性
§校验规则
app_id/app_secret非空base_url非空且以<http://>/<https://>开头base_url域名在飞书/Lark 白名单内(*.feishu.cn/*.larksuite.com/*.larkoffice.com);allow_custom_base_url为 true 时豁免(SSRF 防护)retry_count不超过 10
builder().build() 不会自动调用本方法——与 core 现有行为一致,避免破坏
所有现有 core::Config 用户;from_env() 会在内部调用本方法但失败时仅记录、
不阻塞返回。需要强校验的调用方应显式调用 validate()。
Sourcepub fn from_env() -> Config
pub fn from_env() -> Config
从 OPENLARK_* 环境变量加载配置
读取环境变量构建 Config,缺失变量用默认值。内部调用 validate,
校验失败仅记录警告、不阻塞返回(与 builder().build() 不校验语义一致)。
返回的 Config 可能未通过校验,关键路径应追加显式 .validate() 确认。
§环境变量
OPENLARK_APP_ID/OPENLARK_APP_SECRET/OPENLARK_APP_TYPE(self_build/selfbuild/self或marketplace/store)OPENLARK_BASE_URL/OPENLARK_ENABLE_TOKEN_CACHEOPENLARK_TIMEOUT(秒)→req_timeout(Some(Duration));未设保持NoneOPENLARK_RETRY_COUNT/OPENLARK_MAX_RESPONSE_SIZE/OPENLARK_ENABLE_LOG
Sourcepub fn load_from_env(&mut self)
pub fn load_from_env(&mut self)
从 OPENLARK_* 环境变量加载到当前实例(写时复制:独占引用时原地修改)
仅设置存在且非空的环境变量(OPENLARK_APP_TYPE 除外,它对非法值静默忽略)。
Sourcepub fn summary(&self) -> ConfigSummary
pub fn summary(&self) -> ConfigSummary
生成不含敏感信息的配置摘要
app_secret 仅以布尔「是否已设置」表示,不泄露明文。
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Config
impl !UnwindSafe for Config
impl Freeze for Config
impl Send for Config
impl Sync for Config
impl Unpin for Config
impl UnsafeUnpin for Config
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more