Skip to main content

openlark_client/registry/
mod.rs

1//! 服务注册和发现机制
2//!
3//! 提供轻量级的服务元信息注册与查询功能
4
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7use thiserror::Error;
8
9pub(crate) mod bootstrap;
10
11/// 服务注册和发现错误
12#[derive(Error, Debug, Clone)]
13pub enum RegistryError {
14    /// 服务已存在错误
15    ///
16    /// 当尝试注册的服务名称已经存在时触发
17    #[error("服务 '{name}' 已存在")]
18    ServiceAlreadyExists {
19        /// 已存在的服务名称
20        name: String,
21    },
22
23    /// 服务不存在错误
24    ///
25    /// 当尝试访问不存在的服务时触发
26    #[error("服务 '{name}' 不存在")]
27    ServiceNotFound {
28        /// 不存在的服务名称
29        name: String,
30    },
31
32    /// 循环依赖错误
33    ///
34    /// 当检测到服务间存在循环依赖关系时触发
35    #[error("循环依赖检测: {dependency_chain}")]
36    CircularDependency {
37        /// 循环依赖链
38        dependency_chain: String,
39    },
40
41    /// 缺少依赖服务错误
42    ///
43    /// 当服务依赖的其他服务不存在时触发
44    #[error("缺少依赖服务: {missing_dependencies:?}")]
45    MissingDependencies {
46        /// 缺失的依赖服务列表
47        missing_dependencies: Vec<String>,
48    },
49
50    /// 无效功能标志错误
51    ///
52    /// 当使用了未定义的功能标志时触发
53    #[error("功能标志 '{flag}' 无效")]
54    InvalidFeatureFlag {
55        /// 无效的功能标志名称
56        flag: String,
57    },
58}
59
60/// 服务注册表结果类型
61pub type RegistryResult<T> = Result<T, RegistryError>;
62
63/// 服务元数据
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct ServiceMetadata {
66    /// 服务名称
67    pub name: String,
68    /// 服务版本
69    pub version: String,
70    /// 服务描述
71    pub description: Option<String>,
72    /// 依赖的服务列表
73    pub dependencies: Vec<String>,
74    /// 提供的功能
75    pub provides: Vec<String>,
76    /// 服务状态
77    pub status: ServiceStatus,
78    /// 服务优先级(数值越小优先级越高)
79    pub priority: u32,
80}
81
82/// 服务状态
83#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
84pub enum ServiceStatus {
85    /// 未初始化
86    Uninitialized,
87    /// 初始化中
88    Initializing,
89    /// 已就绪
90    Ready,
91    /// 运行中
92    Running,
93    /// 已停止
94    Stopped,
95    /// 错误状态
96    Error(String),
97}
98
99/// 服务条目
100#[derive(Debug)]
101pub struct ServiceEntry {
102    /// 服务元数据
103    pub metadata: ServiceMetadata,
104    /// 服务实例
105    pub instance: Option<Box<dyn std::any::Any + Send + Sync>>,
106    /// 创建时间
107    pub created_at: chrono::DateTime<chrono::Utc>,
108    /// 最后更新时间
109    pub updated_at: chrono::DateTime<chrono::Utc>,
110}
111
112/// 服务注册表特征
113pub trait ServiceRegistry: Send + Sync {
114    /// 注册服务
115    fn register_service(&mut self, metadata: ServiceMetadata) -> RegistryResult<()>;
116
117    /// 注销服务
118    fn unregister_service(&mut self, name: &str) -> RegistryResult<()>;
119
120    /// 获取服务
121    fn get_service(&self, name: &str) -> RegistryResult<&ServiceEntry>;
122
123    /// 获取服务实例(类型安全)
124    fn get_service_typed<T>(&self, name: &str) -> RegistryResult<&T>
125    where
126        T: 'static;
127
128    /// 列出所有服务
129    fn list_services(&self) -> Vec<&ServiceEntry>;
130
131    /// 检查服务是否存在
132    fn has_service(&self, name: &str) -> bool;
133
134    /// 更新服务状态
135    fn update_service_status(&mut self, name: &str, status: ServiceStatus) -> RegistryResult<()>;
136
137    /// 获取依赖关系图
138    fn get_dependency_graph(&self) -> HashMap<String, Vec<String>>;
139}
140
141/// 默认服务注册表实现
142#[derive(Debug)]
143pub struct DefaultServiceRegistry {
144    /// 服务存储
145    services: HashMap<String, ServiceEntry>,
146}
147
148impl Default for DefaultServiceRegistry {
149    fn default() -> Self {
150        Self::new()
151    }
152}
153
154impl DefaultServiceRegistry {
155    /// 创建新的服务注册表
156    pub fn new() -> Self {
157        Self {
158            services: HashMap::new(),
159        }
160    }
161}
162
163impl ServiceRegistry for DefaultServiceRegistry {
164    fn register_service(&mut self, metadata: ServiceMetadata) -> RegistryResult<()> {
165        // 检查服务是否已存在
166        if self.services.contains_key(&metadata.name) {
167            return Err(RegistryError::ServiceAlreadyExists {
168                name: metadata.name,
169            });
170        }
171
172        // 创建服务条目
173        let entry = ServiceEntry {
174            metadata: metadata.clone(),
175            instance: None,
176            created_at: chrono::Utc::now(),
177            updated_at: chrono::Utc::now(),
178        };
179
180        // 注册服务
181        self.services.insert(metadata.name.clone(), entry);
182
183        Ok(())
184    }
185
186    fn unregister_service(&mut self, name: &str) -> RegistryResult<()> {
187        if !self.services.contains_key(name) {
188            return Err(RegistryError::ServiceNotFound {
189                name: name.to_string(),
190            });
191        }
192
193        self.services.remove(name);
194        Ok(())
195    }
196
197    fn get_service(&self, name: &str) -> RegistryResult<&ServiceEntry> {
198        self.services
199            .get(name)
200            .ok_or_else(|| RegistryError::ServiceNotFound {
201                name: name.to_string(),
202            })
203    }
204
205    fn get_service_typed<T>(&self, name: &str) -> RegistryResult<&T>
206    where
207        T: 'static,
208    {
209        let entry = self.get_service(name)?;
210
211        entry
212            .instance
213            .as_ref()
214            .and_then(|instance| instance.downcast_ref::<T>())
215            .ok_or_else(|| RegistryError::ServiceNotFound {
216                name: format!("类型转换失败: {}", name),
217            })
218    }
219
220    fn list_services(&self) -> Vec<&ServiceEntry> {
221        self.services.values().collect()
222    }
223
224    fn has_service(&self, name: &str) -> bool {
225        self.services.contains_key(name)
226    }
227
228    fn update_service_status(&mut self, name: &str, status: ServiceStatus) -> RegistryResult<()> {
229        let entry = self
230            .services
231            .get_mut(name)
232            .ok_or_else(|| RegistryError::ServiceNotFound {
233                name: name.to_string(),
234            })?;
235
236        entry.metadata.status = status.clone();
237        entry.updated_at = chrono::Utc::now();
238
239        Ok(())
240    }
241
242    fn get_dependency_graph(&self) -> HashMap<String, Vec<String>> {
243        self.services
244            .iter()
245            .map(|(name, entry)| (name.clone(), entry.metadata.dependencies.clone()))
246            .collect()
247    }
248}
249
250#[cfg(test)]
251#[allow(unused_imports)]
252mod tests {
253    use super::*;
254
255    #[test]
256    fn test_service_registration() {
257        let mut registry = DefaultServiceRegistry::new();
258
259        let metadata = ServiceMetadata {
260            name: "test-service".to_string(),
261            version: "1.0.0".to_string(),
262            description: Some("测试服务".to_string()),
263            dependencies: vec![],
264            provides: vec!["test-feature".to_string()],
265            status: ServiceStatus::Uninitialized,
266            priority: 1,
267        };
268
269        assert!(registry.register_service(metadata).is_ok());
270        assert!(registry.has_service("test-service"));
271    }
272
273    #[test]
274    fn test_duplicate_registration() {
275        let mut registry = DefaultServiceRegistry::new();
276
277        let metadata = ServiceMetadata {
278            name: "test-service".to_string(),
279            version: "1.0.0".to_string(),
280            description: None,
281            dependencies: vec![],
282            provides: vec![],
283            status: ServiceStatus::Uninitialized,
284            priority: 1,
285        };
286
287        registry.register_service(metadata.clone()).unwrap();
288
289        let result = registry.register_service(metadata);
290        assert!(matches!(
291            result,
292            Err(RegistryError::ServiceAlreadyExists { .. })
293        ));
294    }
295}