config_manager.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. """
  2. 配置管理服务
  3. 统一管理环境配置和爬虫配置
  4. """
  5. import json
  6. from typing import Dict, Any, Optional
  7. from core.utils.spider_config import SpiderConfig
  8. from core.models.spiders_config_models import PlatformConfig
  9. class ConfigManager:
  10. """
  11. 统一配置管理器
  12. 提供对环境配置和爬虫配置的统一访问接口
  13. """
  14. def __init__(self):
  15. # 延迟导入settings以避免循环导入
  16. from config import settings
  17. self._env_settings = settings
  18. self._spider_config = SpiderConfig
  19. @property
  20. def env_settings(self):
  21. """
  22. 获取环境配置
  23. """
  24. return self._env_settings
  25. def get_platform_config(self, platform_name: str) -> PlatformConfig:
  26. """
  27. 获取平台爬虫配置
  28. """
  29. return self._spider_config.get_platform_config(platform_name)
  30. def list_platforms(self) -> list:
  31. """
  32. 获取所有平台列表
  33. """
  34. return self._spider_config.list_all_platforms()
  35. def reload_spider_configs(self):
  36. """
  37. 重新加载爬虫配置
  38. """
  39. self._spider_config.reload_config()
  40. def get_config_stats(self) -> Dict[str, Any]:
  41. """
  42. 获取配置统计信息
  43. """
  44. stats = self._spider_config.get_config_stats()
  45. stats["env"] = self._env_settings.ENV
  46. return stats
  47. def validate_platform_config(self, platform_name: str) -> bool:
  48. """
  49. 验证平台配置是否有效
  50. """
  51. try:
  52. self.get_platform_config(platform_name)
  53. return True
  54. except Exception:
  55. return False
  56. def export_configs(self) -> Dict[str, Any]:
  57. """
  58. 导出所有配置信息(用于调试和监控)
  59. """
  60. return {
  61. "env_settings": {
  62. "env": self._env_settings.ENV,
  63. "log_level": self._env_settings.LOG_LEVEL,
  64. "db_host": self._env_settings.DB_HOST,
  65. "rocketmq_endpoint": str(self._env_settings.ROCKETMQ_ENDPOINT),
  66. # 不包含敏感信息如密码、密钥等
  67. },
  68. "spider_configs": self.list_platforms(),
  69. "stats": self.get_config_stats()
  70. }
  71. def get_platform_configs_summary(self) -> Dict[str, Dict[str, Any]]:
  72. """
  73. 获取所有平台配置摘要信息
  74. """
  75. platforms = self.list_platforms()
  76. summary = {}
  77. for platform in platforms:
  78. try:
  79. config = self.get_platform_config(platform)
  80. summary[platform] = {
  81. "platform": config.platform,
  82. "mode": config.mode,
  83. "method": config.method,
  84. "url": str(config.url),
  85. "loop_times": config.loop_times,
  86. }
  87. except Exception as e:
  88. summary[platform] = {
  89. "error": str(e)
  90. }
  91. return summary
  92. async def reload_configs_runtime(self):
  93. """
  94. 运行时重新加载配置(支持不重启服务的情况下重新加载配置)
  95. 这个方法可以在接收到特定信号或API调用时被调用
  96. """
  97. try:
  98. # 重新加载爬虫配置
  99. self.reload_spider_configs()
  100. return True
  101. except Exception as e:
  102. # 记录错误日志
  103. print(f"运行时重新加载配置失败: {e}")
  104. return False
  105. # 全局配置管理器实例
  106. config_manager = ConfigManager()
  107. def get_config_manager() -> ConfigManager:
  108. """
  109. 获取配置管理器实例
  110. """
  111. return config_manager