fbc_starter/
lib.rs

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