refactor: 优化路由监听服务,移除已处理域名列表

- 移除 processed_domains 状态管理,改为直接检查 APISIX 实际 SSL 配置
- 简化代码逻辑,提高可靠性
- 修复 SSL 配置查找时的类型错误(key 字段是字符串而非字典)
- 添加路由状态检查,跳过禁用的路由(status=0)

优势:
- 更简单:无需维护状态文件
- 更准确:直接检查实际配置,避免状态不一致
- 更可靠:即使证书被删除,也能自动检测并重新申请
This commit is contained in:
jingrow 2026-01-01 19:32:58 +00:00
parent 3a37cc6e14
commit 7198a1376b

View File

@ -39,11 +39,7 @@ class RouteWatcher:
self.apisix_admin_url = os.getenv('APISIX_ADMIN_URL', 'http://localhost:9180')
self.apisix_admin_key = os.getenv('APISIX_ADMIN_KEY', '8206e6e42b6b53243c52a767cc633137')
# 已处理的域名集合
self.processed_domains: Set[str] = set()
# 加载已处理的域名
self._load_processed_domains()
# 不再使用已处理列表,直接检查实际 SSL 配置
def _get_apisix_headers(self):
"""获取 APISIX Admin API 请求头"""
@ -52,27 +48,6 @@ class RouteWatcher:
'Content-Type': 'application/json'
}
def _load_processed_domains(self):
"""加载已处理的域名列表"""
state_file = '/var/lib/apisix-ssl-manager/processed_domains.json'
if os.path.exists(state_file):
try:
with open(state_file, 'r') as f:
self.processed_domains = set(json.load(f))
logger.info(f"加载已处理域名: {len(self.processed_domains)}")
except Exception as e:
logger.warning(f"加载已处理域名失败: {e}")
def _save_processed_domains(self):
"""保存已处理的域名列表"""
state_file = '/var/lib/apisix-ssl-manager/processed_domains.json'
os.makedirs(os.path.dirname(state_file), exist_ok=True)
try:
with open(state_file, 'w') as f:
json.dump(list(self.processed_domains), f)
except Exception as e:
logger.error(f"保存已处理域名失败: {e}")
def get_all_routes(self) -> list:
"""获取所有路由"""
try:
@ -158,10 +133,6 @@ class RouteWatcher:
def should_request_cert(self, domain: str) -> bool:
"""判断是否需要申请证书"""
# 跳过已处理的域名
if domain in self.processed_domains:
return False
# 跳过本地域名
if domain in ['localhost', '127.0.0.1', '0.0.0.0']:
return False
@ -170,13 +141,12 @@ class RouteWatcher:
if domain.replace('.', '').isdigit():
return False
# 检查是否已有 SSL 配置
# 检查是否已有 SSL 配置(直接检查实际配置,最准确)
ssls = self.get_all_ssls()
for ssl in ssls:
ssl_domains = self.extract_domains_from_ssl(ssl)
if domain in ssl_domains:
logger.info(f"域名已有 SSL 配置: {domain}")
self.processed_domains.add(domain)
return False
return True
@ -202,8 +172,6 @@ class RouteWatcher:
try:
if self.ssl_manager.request_certificate(domain):
logger.info(f"证书申请成功: {domain}")
self.processed_domains.add(domain)
self._save_processed_domains()
else:
logger.error(f"证书申请失败: {domain}")
except Exception as e: