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