fbc_starter/
lib.rs

1pub mod base;
2pub mod config;
3pub mod constants;
4pub mod entity;
5pub mod error;
6pub mod http;
7pub mod server;
8pub mod state;
9pub mod utils;
10
11#[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))]
12pub mod database;
13
14pub mod cache;
15
16#[cfg(feature = "balance")]
17pub mod balance;
18
19#[cfg(feature = "nacos")]
20pub mod nacos;
21
22#[cfg(feature = "kafka")]
23pub mod messaging;
24
25pub use base::{CursorPageBaseResp, R};
26pub use config::Config;
27#[cfg(feature = "kafka")]
28pub use config::{
29    KafkaConfig, KafkaConsumerConfig as ConfigKafkaConsumerConfig,
30    KafkaProducerConfig as ConfigKafkaProducerConfig,
31};
32pub use constants::{
33    CREATE_BY, CREATE_BY_FIELD, CREATE_ORG_ID_FIELD, CREATE_TIME, CREATE_TIME_FIELD, DELETE_FIELD,
34    ID_FIELD, LABEL, PARENT_ID, PARENT_ID_FIELD, SORT_VALUE, SORT_VALUE_FIELD, TENANT_ID,
35    UPDATE_BY, UPDATE_BY_FIELD, UPDATE_TIME, UPDATE_TIME_FIELD,
36};
37
38pub use entity::*;
39pub use error::{AppError, AppResult};
40pub use http::{
41    create_cors_layer, create_trace_layer, health_check, request_logger_middleware, root,
42};
43#[cfg(feature = "kafka")]
44pub use messaging::{
45    kafka::{KafkaConsumer, KafkaProducer},
46    Message, MessageConsumer, MessageConsumerType, MessageProducer, MessageProducerType,
47};
48#[cfg(feature = "consumer")]
49pub use messaging::{KafkaMessageHandler, KafkaMessageRouter};
50#[cfg(feature = "nacos")]
51pub use nacos::{
52    deregister_service, get_config, get_config_client, get_naming_client, get_service_instances,
53    get_subscribed_configs, get_subscribed_services, init_nacos, register_service,
54    subscribe_configs, subscribe_services,
55};
56pub use server::{Server, ServerBuilder};
57pub use state::AppState;
58pub use utils::get_uid_from_headers;
59
60/// 初始化日志系统(内部函数)
61///
62/// 设置时区为 +8(东八区,中国时区)
63pub(crate) fn init_logging(config: &Config) -> Result<(), anyhow::Error> {
64    use time::UtcOffset;
65    use tracing_subscriber::{
66        fmt::time::OffsetTime, layer::SubscriberExt, util::SubscriberInitExt,
67    };
68
69    // 设置时区为 +8 (东八区,中国时区)
70    let offset =
71        UtcOffset::from_hms(8, 0, 0).map_err(|e| anyhow::anyhow!("无效的时区偏移: {}", e))?;
72    let timer = OffsetTime::new(
73        offset,
74        time::format_description::parse(
75            "[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]",
76        )
77        .map_err(|e| anyhow::anyhow!("时间格式解析失败: {}", e))?,
78    );
79
80    // 初始化日志
81    // 优先使用 RUST_LOG 环境变量,如果没有则使用配置的日志级别
82    // 默认显示所有 crate 的 info 级别及以上的日志
83    let env_filter = tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
84        // 如果没有设置 RUST_LOG,使用配置的日志级别,显示所有 crate 的日志
85        // 格式:直接使用日志级别,如 "info" 会显示所有 crate 的 info 级别日志
86        config.log.level.as_str().into()
87    });
88
89    tracing_subscriber::registry()
90        .with(env_filter)
91        .with(
92            tracing_subscriber::fmt::layer()
93                .with_timer(timer)
94                .with_line_number(true),
95        )
96        .try_init()
97        .map_err(|e| anyhow::anyhow!("日志系统初始化失败: {}", e))?;
98
99    Ok(())
100}
101
102#[cfg(feature = "balance")]
103pub use balance::{
104    create_grpc_channel, create_grpc_client, get_load_balancer, get_service_endpoints,
105    GrpcClientBuilder, RoundRobinLoadBalancer, ServiceEndpoint,
106};