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
60pub(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 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 let env_filter = tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
84 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};