sycommon-python-lib 0.1.21__py3-none-any.whl → 0.1.46__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sycommon/database/database_service.py +6 -1
- sycommon/logging/kafka_log.py +18 -8
- sycommon/logging/sql_logger.py +53 -0
- sycommon/middleware/middleware.py +1 -1
- sycommon/middleware/traceid.py +1 -1
- sycommon/models/mqlistener_config.py +1 -0
- sycommon/rabbitmq/rabbitmq_client.py +393 -600
- sycommon/rabbitmq/rabbitmq_pool.py +548 -66
- sycommon/rabbitmq/rabbitmq_service.py +381 -174
- sycommon/services.py +65 -22
- sycommon/synacos/example.py +153 -0
- sycommon/synacos/example2.py +129 -0
- sycommon/synacos/feign.py +76 -410
- sycommon/synacos/feign_client.py +317 -0
- sycommon/synacos/nacos_service.py +146 -105
- sycommon/synacos/param.py +75 -0
- {sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/METADATA +11 -11
- {sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/RECORD +21 -16
- {sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/WHEEL +0 -0
- {sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/entry_points.txt +0 -0
- {sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/top_level.txt +0 -0
|
@@ -10,7 +10,6 @@ import yaml
|
|
|
10
10
|
import time
|
|
11
11
|
import atexit
|
|
12
12
|
import random
|
|
13
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
14
13
|
|
|
15
14
|
from sycommon.config.Config import SingletonMeta
|
|
16
15
|
from sycommon.logging.kafka_log import SYLogger
|
|
@@ -34,22 +33,17 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
34
33
|
# 添加可重入锁用于状态同步
|
|
35
34
|
self._state_lock = threading.RLock()
|
|
36
35
|
|
|
37
|
-
# 优化线程池配置,增加工作线程数量
|
|
38
|
-
self._executor = ThreadPoolExecutor(max_workers=1) # 主线程池
|
|
39
|
-
self._heartbeat_executor = ThreadPoolExecutor(
|
|
40
|
-
max_workers=1) # 增加心跳线程
|
|
41
|
-
self._monitor_executor = ThreadPoolExecutor(
|
|
42
|
-
max_workers=1) # 增加监控线程
|
|
43
|
-
|
|
44
36
|
# 配置参数
|
|
45
37
|
self.max_retries = self.nacos_config.get('maxRetries', 5)
|
|
46
|
-
self.retry_delay = self.nacos_config.get('retryDelay',
|
|
47
|
-
self.retry_backoff = self.nacos_config.get('retryBackoff', 1.5)
|
|
38
|
+
self.retry_delay = self.nacos_config.get('retryDelay', 5)
|
|
48
39
|
self.max_retry_delay = self.nacos_config.get('maxRetryDelay', 30)
|
|
40
|
+
# 心跳间隔:优先从配置读取,默认15秒(可通过配置修改)
|
|
49
41
|
self.heartbeat_interval = self.nacos_config.get(
|
|
50
|
-
'heartbeatInterval',
|
|
42
|
+
'heartbeatInterval', 15)
|
|
43
|
+
# 心跳超时:固定设置为10秒(需求指定)
|
|
44
|
+
self.heartbeat_timeout = 15
|
|
51
45
|
self.register_retry_interval = self.nacos_config.get(
|
|
52
|
-
'registerRetryInterval',
|
|
46
|
+
'registerRetryInterval', 15) # 注册重试间隔
|
|
53
47
|
|
|
54
48
|
# 长期重试配置
|
|
55
49
|
self.long_term_retry_delay = self.nacos_config.get(
|
|
@@ -57,11 +51,13 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
57
51
|
self.max_long_term_retries = self.nacos_config.get(
|
|
58
52
|
'maxLongTermRetries', -1) # -1表示无限重试
|
|
59
53
|
|
|
60
|
-
#
|
|
54
|
+
# 注册验证配置:优化默认值(增加次数+延长间隔)
|
|
61
55
|
self.registration_verify_count = self.nacos_config.get(
|
|
62
56
|
'registrationVerifyCount', 1) # 验证次数
|
|
63
57
|
self.registration_verify_interval = self.nacos_config.get(
|
|
64
58
|
'registrationVerifyInterval', 1) # 验证间隔
|
|
59
|
+
self.registration_post_delay = self.nacos_config.get(
|
|
60
|
+
'registrationPostDelay', 3) # 注册后延迟3秒再开始验证
|
|
65
61
|
|
|
66
62
|
self.real_ip = self.get_service_ip(self.host)
|
|
67
63
|
self._long_term_retry_count = 0 # 长期重试计数器
|
|
@@ -87,10 +83,18 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
87
83
|
# 心跳相关
|
|
88
84
|
self._last_heartbeat_time = 0
|
|
89
85
|
self._heartbeat_fail_count = 0
|
|
86
|
+
self._heartbeat_lock = threading.Lock()
|
|
90
87
|
self._heartbeat_thread = None
|
|
88
|
+
|
|
91
89
|
self.max_heartbeat_timeout = self.nacos_config.get(
|
|
92
|
-
'maxHeartbeatTimeout', 30)
|
|
93
|
-
self._last_successful_heartbeat = time.time()
|
|
90
|
+
'maxHeartbeatTimeout', 30)
|
|
91
|
+
self._last_successful_heartbeat = time.time()
|
|
92
|
+
# 连接监控检查间隔(新增配置,默认30秒,避免硬编码)
|
|
93
|
+
self.connection_check_interval = self.nacos_config.get(
|
|
94
|
+
'connectionCheckInterval', 30)
|
|
95
|
+
# 配置监视线程检查间隔(默认30秒)
|
|
96
|
+
self.config_watch_interval = self.nacos_config.get(
|
|
97
|
+
'configWatchInterval', 30)
|
|
94
98
|
|
|
95
99
|
# 启动配置监视线程
|
|
96
100
|
self._watch_thread = threading.Thread(
|
|
@@ -121,8 +125,7 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
121
125
|
self._client_initialized = True
|
|
122
126
|
return True
|
|
123
127
|
except Exception as e:
|
|
124
|
-
delay = min(self.retry_delay
|
|
125
|
-
attempt), self.max_retry_delay)
|
|
128
|
+
delay = min(self.retry_delay, self.max_retry_delay)
|
|
126
129
|
SYLogger.error(
|
|
127
130
|
f"nacos:客户端初始化失败 (尝试 {attempt+1}/{self.max_retries}): {e}")
|
|
128
131
|
time.sleep(delay)
|
|
@@ -185,8 +188,7 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
185
188
|
|
|
186
189
|
except Exception as e:
|
|
187
190
|
attempt += 1
|
|
188
|
-
delay = min(self.retry_delay
|
|
189
|
-
(attempt - 1)), self.max_retry_delay)
|
|
191
|
+
delay = min(self.retry_delay, self.max_retry_delay)
|
|
190
192
|
|
|
191
193
|
SYLogger.error(
|
|
192
194
|
f"nacos:客户端初始化失败 (尝试 {attempt}/{max_attempts}): {e}")
|
|
@@ -300,12 +302,12 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
300
302
|
if not register_success:
|
|
301
303
|
raise RuntimeError("nacos:服务注册请求失败")
|
|
302
304
|
|
|
303
|
-
#
|
|
305
|
+
# 关键优化1:注册请求发送后,延迟一段时间再验证(默认3秒)
|
|
304
306
|
SYLogger.info(
|
|
305
|
-
f"nacos
|
|
306
|
-
time.sleep(self.
|
|
307
|
+
f"nacos:服务注册请求已发送,延迟 {self.registration_post_delay} 秒后开始验证(确保Nacos服务器完成实例写入)")
|
|
308
|
+
time.sleep(self.registration_post_delay)
|
|
307
309
|
|
|
308
|
-
#
|
|
310
|
+
# 关键优化2:多次验证服务是否真正注册成功(默认3次,每次间隔2秒)
|
|
309
311
|
registered = self.verify_registration()
|
|
310
312
|
|
|
311
313
|
# 带锁更新注册状态
|
|
@@ -334,8 +336,7 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
334
336
|
except Exception as e:
|
|
335
337
|
last_error = str(e)
|
|
336
338
|
retry_count += 1
|
|
337
|
-
delay = min(self.register_retry_interval
|
|
338
|
-
(self.retry_backoff ** (retry_count - 1)), self.max_retry_delay)
|
|
339
|
+
delay = min(self.register_retry_interval, self.max_retry_delay)
|
|
339
340
|
|
|
340
341
|
SYLogger.warning(
|
|
341
342
|
f"nacos:服务注册尝试 {retry_count} 失败: {last_error},{delay}秒后重试")
|
|
@@ -367,9 +368,9 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
367
368
|
|
|
368
369
|
metadata = {
|
|
369
370
|
"ignore-metrics": "true",
|
|
370
|
-
"preserved.heart.beat.interval": "3000", # 心跳间隔 3 秒
|
|
371
|
-
"preserved.heart.beat.timeout": "15000", # 心跳超时 15 秒
|
|
372
|
-
"preserved.ip.delete.timeout": "30000" # 实例删除超时 30 秒
|
|
371
|
+
# "preserved.heart.beat.interval": "3000", # 心跳间隔 3 秒
|
|
372
|
+
# "preserved.heart.beat.timeout": "15000", # 心跳超时 15 秒
|
|
373
|
+
# "preserved.ip.delete.timeout": "30000" # 实例删除超时 30 秒
|
|
373
374
|
}
|
|
374
375
|
if self.version:
|
|
375
376
|
metadata["version"] = self.version
|
|
@@ -421,8 +422,13 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
421
422
|
timeout = 60 # 60秒超时
|
|
422
423
|
start_time = time.time()
|
|
423
424
|
|
|
424
|
-
#
|
|
425
|
-
|
|
425
|
+
# 启动注册线程,不阻塞主线程(替换原线程池)
|
|
426
|
+
register_thread = threading.Thread(
|
|
427
|
+
target=instance.register_with_retry,
|
|
428
|
+
daemon=True,
|
|
429
|
+
name="NacosRegisterThread"
|
|
430
|
+
)
|
|
431
|
+
register_thread.start()
|
|
426
432
|
|
|
427
433
|
# 等待注册完成或超时
|
|
428
434
|
while True:
|
|
@@ -453,97 +459,135 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
453
459
|
|
|
454
460
|
# 启动连接监控线程
|
|
455
461
|
threading.Thread(target=instance.monitor_connection,
|
|
456
|
-
daemon=True).start()
|
|
462
|
+
daemon=True, name="NacosConnectionMonitorThread").start()
|
|
457
463
|
else:
|
|
458
464
|
SYLogger.info("nacos:本地开发模式,跳过服务注册流程")
|
|
459
465
|
|
|
460
466
|
return instance
|
|
461
467
|
|
|
462
468
|
def start_heartbeat(self):
|
|
463
|
-
"""
|
|
464
|
-
|
|
465
|
-
|
|
469
|
+
"""启动心跳线程(确保单例)"""
|
|
470
|
+
with self._heartbeat_lock: # 加锁确保线程安全
|
|
471
|
+
# 双重检查:先判断线程是否已存在且存活
|
|
472
|
+
if self._heartbeat_thread is not None and self._heartbeat_thread.is_alive():
|
|
473
|
+
return
|
|
466
474
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
name="NacosHeartbeatThread",
|
|
470
|
-
daemon=True
|
|
471
|
-
)
|
|
472
|
-
# 设置线程为守护线程并尝试提高优先级
|
|
473
|
-
self._heartbeat_thread.daemon = True
|
|
474
|
-
self._heartbeat_thread.start()
|
|
475
|
+
# 彻底清理可能的残留线程引用
|
|
476
|
+
self._heartbeat_thread = None
|
|
475
477
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
478
|
+
# 创建新的心跳线程
|
|
479
|
+
self._heartbeat_thread = threading.Thread(
|
|
480
|
+
target=self._send_heartbeat_loop,
|
|
481
|
+
name="NacosHeartbeatThread",
|
|
482
|
+
daemon=True
|
|
483
|
+
)
|
|
484
|
+
self._heartbeat_thread.daemon = True
|
|
485
|
+
self._heartbeat_thread.start()
|
|
486
|
+
SYLogger.info(
|
|
487
|
+
f"nacos:心跳线程启动,线程ID: {self._heartbeat_thread.ident},"
|
|
488
|
+
f"心跳间隔: {self.heartbeat_interval}秒,"
|
|
489
|
+
f"心跳超时: {self.heartbeat_timeout}秒"
|
|
490
|
+
)
|
|
486
491
|
|
|
487
492
|
def _send_heartbeat_loop(self):
|
|
488
493
|
"""优化后的心跳发送循环,确保严格按间隔执行"""
|
|
489
|
-
|
|
490
|
-
|
|
494
|
+
current_thread = threading.current_thread()
|
|
495
|
+
thread_ident = current_thread.ident
|
|
496
|
+
SYLogger.info(
|
|
497
|
+
f"nacos:心跳循环启动 - 线程ID: {thread_ident}, "
|
|
498
|
+
f"配置间隔: {self.heartbeat_interval}秒, "
|
|
499
|
+
f"超时时间: {self.heartbeat_timeout}秒"
|
|
500
|
+
)
|
|
501
|
+
|
|
502
|
+
consecutive_fail = 0 # 连续失败计数器
|
|
491
503
|
|
|
492
504
|
while not self._shutdown_event.is_set():
|
|
505
|
+
# 记录当前时间,作为本次心跳的基准
|
|
493
506
|
current_time = time.time()
|
|
494
|
-
# 计算距离下次心跳的时间(确保严格按间隔执行)
|
|
495
|
-
sleep_time = max(0, self.heartbeat_interval -
|
|
496
|
-
(current_time - last_heartbeat_time))
|
|
497
|
-
|
|
498
|
-
if sleep_time > 0:
|
|
499
|
-
self._shutdown_event.wait(sleep_time) # 精准等待
|
|
500
507
|
|
|
501
|
-
# 执行心跳逻辑
|
|
502
508
|
try:
|
|
503
|
-
#
|
|
509
|
+
# 检查注册状态(带锁读取)
|
|
504
510
|
with self._state_lock:
|
|
505
511
|
registered_status = self.registered
|
|
506
512
|
|
|
507
|
-
if registered_status
|
|
513
|
+
if not registered_status:
|
|
514
|
+
SYLogger.warning(
|
|
515
|
+
f"nacos:服务未注册,跳过心跳 - 线程ID: {thread_ident}")
|
|
516
|
+
consecutive_fail = 0
|
|
517
|
+
else:
|
|
518
|
+
# 发送心跳(10秒超时)
|
|
508
519
|
success = self.send_heartbeat()
|
|
509
520
|
if success:
|
|
510
|
-
|
|
521
|
+
consecutive_fail = 0
|
|
522
|
+
self._last_successful_heartbeat = current_time
|
|
511
523
|
SYLogger.info(
|
|
512
|
-
f"nacos
|
|
524
|
+
f"nacos:心跳发送成功 - 时间: {current_time:.3f}, "
|
|
525
|
+
f"间隔: {self.heartbeat_interval}秒"
|
|
526
|
+
)
|
|
513
527
|
else:
|
|
528
|
+
consecutive_fail += 1
|
|
514
529
|
SYLogger.warning(
|
|
515
|
-
f"nacos
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
530
|
+
f"nacos:心跳发送失败 - 连续失败: {consecutive_fail}次"
|
|
531
|
+
)
|
|
532
|
+
if consecutive_fail >= 5:
|
|
533
|
+
SYLogger.error("nacos:心跳连续失败5次,尝试重连")
|
|
534
|
+
self.reconnect_nacos_client()
|
|
535
|
+
consecutive_fail = 0
|
|
536
|
+
|
|
537
|
+
except Exception as e:
|
|
538
|
+
consecutive_fail += 1
|
|
539
|
+
SYLogger.error(
|
|
540
|
+
f"nacos:心跳异常: {str(e)}, 连续失败: {consecutive_fail}次")
|
|
541
|
+
|
|
542
|
+
# 计算下次执行时间(当前时间 + 配置间隔),确保间隔稳定
|
|
543
|
+
next_run_time = current_time + self.heartbeat_interval
|
|
544
|
+
sleep_time = max(0, next_run_time - time.time()
|
|
545
|
+
) # 避免负数(处理耗时超过间隔的情况)
|
|
546
|
+
self._shutdown_event.wait(sleep_time) # 精准休眠至下次执行时间
|
|
547
|
+
|
|
548
|
+
SYLogger.info(f"nacos:心跳循环已停止 - 线程ID: {thread_ident}")
|
|
525
549
|
|
|
526
550
|
def send_heartbeat(self):
|
|
527
|
-
"""
|
|
551
|
+
"""发送心跳并添加10秒超时控制(替换线程池实现)"""
|
|
528
552
|
if not self.ensure_client_connected():
|
|
529
553
|
SYLogger.warning("nacos:客户端未连接,心跳发送失败")
|
|
530
554
|
return False
|
|
531
555
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
556
|
+
# 用线程+join实现10秒超时控制
|
|
557
|
+
result_list = [] # 用于线程间传递结果
|
|
558
|
+
|
|
559
|
+
def heartbeat_task():
|
|
560
|
+
"""心跳实际执行任务"""
|
|
561
|
+
try:
|
|
562
|
+
result = self._send_heartbeat_internal()
|
|
563
|
+
result_list.append(result)
|
|
564
|
+
except Exception as e:
|
|
565
|
+
SYLogger.error(f"nacos:心跳任务执行异常: {e}")
|
|
566
|
+
result_list.append(False)
|
|
567
|
+
|
|
568
|
+
# 启动心跳任务线程
|
|
569
|
+
task_thread = threading.Thread(
|
|
570
|
+
target=heartbeat_task,
|
|
571
|
+
daemon=True,
|
|
572
|
+
name="NacosHeartbeatTaskThread"
|
|
573
|
+
)
|
|
574
|
+
task_thread.start()
|
|
575
|
+
|
|
576
|
+
# 等待线程完成,最多等待10秒
|
|
577
|
+
task_thread.join(timeout=self.heartbeat_timeout)
|
|
578
|
+
|
|
579
|
+
# 处理结果
|
|
580
|
+
if not result_list:
|
|
581
|
+
# 超时未返回
|
|
582
|
+
SYLogger.error(f"nacos:心跳发送超时({self.heartbeat_timeout}秒)")
|
|
544
583
|
self._client_initialized = False # 强制重连
|
|
545
584
|
return False
|
|
546
585
|
|
|
586
|
+
# 检查心跳结果
|
|
587
|
+
if result_list[0]:
|
|
588
|
+
self._last_successful_heartbeat = time.time()
|
|
589
|
+
return result_list[0]
|
|
590
|
+
|
|
547
591
|
def _send_heartbeat_internal(self):
|
|
548
592
|
"""实际的心跳发送逻辑"""
|
|
549
593
|
result = self.nacos_client.send_heartbeat(
|
|
@@ -571,10 +615,9 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
571
615
|
|
|
572
616
|
def monitor_connection(self):
|
|
573
617
|
"""优化的连接监控线程,缩短检查间隔"""
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
check_counter = 0 # 检查计数器
|
|
618
|
+
check_interval = self.connection_check_interval
|
|
619
|
+
thread_start_time = time.time()
|
|
620
|
+
check_counter = 0
|
|
578
621
|
|
|
579
622
|
while not self._shutdown_event.is_set():
|
|
580
623
|
try:
|
|
@@ -600,9 +643,13 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
600
643
|
else:
|
|
601
644
|
self.registered = False
|
|
602
645
|
SYLogger.warning(f"nacos:服务实例未注册,尝试重新注册")
|
|
603
|
-
#
|
|
604
|
-
|
|
605
|
-
self.register_with_retry
|
|
646
|
+
# 启动临时线程执行重新注册(替换原线程池)
|
|
647
|
+
retry_thread = threading.Thread(
|
|
648
|
+
target=self.register_with_retry,
|
|
649
|
+
daemon=True,
|
|
650
|
+
name="NacosRetryRegisterThread"
|
|
651
|
+
)
|
|
652
|
+
retry_thread.start()
|
|
606
653
|
|
|
607
654
|
# 20%的概率执行深度检查
|
|
608
655
|
if random.random() < 0.2:
|
|
@@ -653,13 +700,6 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
653
700
|
SYLogger.error(f"nacos:注销服务时发生错误: {e}")
|
|
654
701
|
finally:
|
|
655
702
|
self._shutdown_event.set()
|
|
656
|
-
# 优雅地关闭线程池
|
|
657
|
-
if self._executor and not self._executor._shutdown:
|
|
658
|
-
self._executor.shutdown(wait=True)
|
|
659
|
-
if self._heartbeat_executor and not self._heartbeat_executor._shutdown:
|
|
660
|
-
self._heartbeat_executor.shutdown(wait=True)
|
|
661
|
-
if self._monitor_executor and not self._monitor_executor._shutdown:
|
|
662
|
-
self._monitor_executor.shutdown(wait=True)
|
|
663
703
|
|
|
664
704
|
def handle_signal(self, signum, frame):
|
|
665
705
|
"""处理退出信号"""
|
|
@@ -724,18 +764,19 @@ class NacosService(metaclass=SingletonMeta):
|
|
|
724
764
|
|
|
725
765
|
def _watch_configs(self):
|
|
726
766
|
"""配置监听线程"""
|
|
727
|
-
check_interval =
|
|
767
|
+
check_interval = self.config_watch_interval
|
|
728
768
|
|
|
729
769
|
while not self._shutdown_event.is_set():
|
|
730
770
|
try:
|
|
731
771
|
for data_id, callback in list(self._config_listeners.items()):
|
|
732
772
|
new_config = self.get_config(data_id)
|
|
733
773
|
if new_config and new_config != self._config_cache.get(data_id):
|
|
734
|
-
|
|
774
|
+
# 直接执行回调(替换原线程池,配置回调通常为轻量操作)
|
|
775
|
+
callback(new_config)
|
|
735
776
|
self._config_cache[data_id] = new_config
|
|
736
777
|
except Exception as e:
|
|
737
778
|
SYLogger.error(f"nacos:配置监视线程异常: {str(e)}")
|
|
738
|
-
self._shutdown_event.wait(check_interval)
|
|
779
|
+
self._shutdown_event.wait(check_interval)
|
|
739
780
|
|
|
740
781
|
def discover_services(self, service_name: str, group: str = "DEFAULT_GROUP", version: str = None) -> List[Dict]:
|
|
741
782
|
"""发现服务实例列表 (与Java格式兼容)"""
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from typing import Any, Optional
|
|
2
|
+
|
|
3
|
+
# ------------------------------
|
|
4
|
+
# 参数类型标记类(兼容 Pydantic)
|
|
5
|
+
# ------------------------------
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Param:
|
|
9
|
+
"""基础参数元信息类"""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
default: Any = ...,
|
|
14
|
+
description: str = "",
|
|
15
|
+
alias: Optional[str] = None,
|
|
16
|
+
deprecated: bool = False
|
|
17
|
+
):
|
|
18
|
+
self.default = default # ... 表示必填
|
|
19
|
+
self.description = description
|
|
20
|
+
self.alias = alias
|
|
21
|
+
self.deprecated = deprecated
|
|
22
|
+
|
|
23
|
+
def is_required(self) -> bool:
|
|
24
|
+
return self.default is ...
|
|
25
|
+
|
|
26
|
+
def get_key(self, param_name: str) -> str:
|
|
27
|
+
return self.alias if self.alias is not None else param_name
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Path(Param):
|
|
31
|
+
"""路径参数"""
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Query(Param):
|
|
36
|
+
"""查询参数"""
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Header(Param):
|
|
41
|
+
"""请求头参数"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, *args, convert_underscores: bool = True, **kwargs):
|
|
44
|
+
super().__init__(*args, **kwargs)
|
|
45
|
+
self.convert_underscores = convert_underscores
|
|
46
|
+
|
|
47
|
+
def get_key(self, param_name: str) -> str:
|
|
48
|
+
key = super().get_key(param_name)
|
|
49
|
+
return key.replace("_", "-") if self.convert_underscores else key
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class Cookie(Param):
|
|
53
|
+
"""Cookie参数"""
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class Body(Param):
|
|
58
|
+
"""JSON请求体参数(支持Pydantic模型)"""
|
|
59
|
+
|
|
60
|
+
def __init__(self, *args, embed: bool = False, ** kwargs):
|
|
61
|
+
super().__init__(*args, **kwargs)
|
|
62
|
+
self.embed = embed # 是否包装在键中
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class Form(Param):
|
|
66
|
+
"""表单参数(支持Pydantic模型)"""
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class File(Param):
|
|
71
|
+
"""文件上传参数"""
|
|
72
|
+
|
|
73
|
+
def __init__(self, *args, field_name: str = "file", ** kwargs):
|
|
74
|
+
super().__init__(*args, **kwargs)
|
|
75
|
+
self.field_name = field_name
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.46
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
|
-
Requires-Dist: aio-pika>=9.5.
|
|
8
|
-
Requires-Dist: aiohttp>=3.
|
|
7
|
+
Requires-Dist: aio-pika>=9.5.8
|
|
8
|
+
Requires-Dist: aiohttp>=3.13.2
|
|
9
9
|
Requires-Dist: decorator>=5.2.1
|
|
10
|
-
Requires-Dist: fastapi>=0.
|
|
11
|
-
Requires-Dist: kafka-python>=2.2.
|
|
10
|
+
Requires-Dist: fastapi>=0.121.2
|
|
11
|
+
Requires-Dist: kafka-python>=2.2.16
|
|
12
12
|
Requires-Dist: loguru>=0.7.3
|
|
13
|
-
Requires-Dist: mysql-connector-python>=9.
|
|
13
|
+
Requires-Dist: mysql-connector-python>=9.5.0
|
|
14
14
|
Requires-Dist: nacos-sdk-python>=2.0.9
|
|
15
|
-
Requires-Dist: pydantic>=2.
|
|
16
|
-
Requires-Dist: python-dotenv>=1.
|
|
15
|
+
Requires-Dist: pydantic>=2.12.4
|
|
16
|
+
Requires-Dist: python-dotenv>=1.2.1
|
|
17
17
|
Requires-Dist: pyyaml>=6.0.3
|
|
18
|
-
Requires-Dist: sqlalchemy>=2.0.
|
|
19
|
-
Requires-Dist: starlette>=0.
|
|
18
|
+
Requires-Dist: sqlalchemy>=2.0.44
|
|
19
|
+
Requires-Dist: starlette>=0.49.3
|
|
20
20
|
Requires-Dist: uuid>=1.30
|
|
21
|
-
Requires-Dist: uvicorn>=0.
|
|
21
|
+
Requires-Dist: uvicorn>=0.38.0
|
|
22
22
|
|
|
23
23
|
# sycommon-python-lib
|
|
24
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
command/cli.py,sha256=bP2LCLkRvfETIwWkVD70q5xFxMI4D3BpH09Ws1f-ENc,5849
|
|
2
2
|
sycommon/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
sycommon/services.py,sha256=
|
|
3
|
+
sycommon/services.py,sha256=LHMRxxRvLAiekkVspaQClBgAR_jLKqiJpd5hqF74MIE,11369
|
|
4
4
|
sycommon/config/Config.py,sha256=9yO5b8WfvEDvkyrGrlwrLFasgh_-MjcEvGF20Gz5Xo4,3041
|
|
5
5
|
sycommon/config/DatabaseConfig.py,sha256=ILiUuYT9_xJZE2W-RYuC3JCt_YLKc1sbH13-MHIOPhg,804
|
|
6
6
|
sycommon/config/EmbeddingConfig.py,sha256=gPKwiDYbeu1GpdIZXMmgqM7JqBIzCXi0yYuGRLZooMI,362
|
|
@@ -9,46 +9,51 @@ sycommon/config/MQConfig.py,sha256=_RDcmIdyWKjmgM5ZnriOoI-DpaxgXs7CD0awdAD6z88,2
|
|
|
9
9
|
sycommon/config/RerankerConfig.py,sha256=dohekaY_eTynmMimIuKHBYGXXQO6rJjSkm94OPLuMik,322
|
|
10
10
|
sycommon/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
sycommon/database/base_db_service.py,sha256=J5ELHMNeGfzA6zVcASPSPZ0XNKrRY3_gdGmVkZw3Mto,946
|
|
12
|
-
sycommon/database/database_service.py,sha256=
|
|
12
|
+
sycommon/database/database_service.py,sha256=mun5vgM7nkuH6_UyHLHqQ2Qk_5gRgMxJu4_obIKLT6o,3253
|
|
13
13
|
sycommon/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
sycommon/health/health_check.py,sha256=EhfbhspRpQiKJaxdtE-PzpKQO_ucaFKtQxIm16F5Mpk,391
|
|
15
15
|
sycommon/health/metrics.py,sha256=fHqO73JuhoZkNPR-xIlxieXiTCvttq-kG-tvxag1s1s,268
|
|
16
16
|
sycommon/health/ping.py,sha256=FTlnIKk5y1mPfS1ZGOeT5IM_2udF5aqVLubEtuBp18M,250
|
|
17
17
|
sycommon/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
sycommon/logging/kafka_log.py,sha256=
|
|
18
|
+
sycommon/logging/kafka_log.py,sha256=qHq4sU42aGrTm9DWYKxGDp1pe9ENfYSbzI4iPDPNvJQ,21128
|
|
19
19
|
sycommon/logging/logger_wrapper.py,sha256=TiHsrIIHiQMzXgXK12-0KIpU9GhwQJOoHslakzmq2zc,357
|
|
20
|
+
sycommon/logging/sql_logger.py,sha256=aEU3OGnI_51Tjyuuf4FpUi9KPTceFRuKAOyQbPzGhzM,2021
|
|
20
21
|
sycommon/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
22
|
sycommon/middleware/context.py,sha256=_5ghpv4u_yAvjkgM-XDx8OnO-YI1XtntHrXsHJHZkwo,88
|
|
22
23
|
sycommon/middleware/cors.py,sha256=0B5d_ovD56wcH9TfktRs88Q09R9f8Xx5h5ALWYvE8Iw,600
|
|
23
24
|
sycommon/middleware/docs.py,sha256=bVdDBIHXGVBv562MQLSroa1DgHoObxR9gFzv71PIejg,1187
|
|
24
25
|
sycommon/middleware/exception.py,sha256=Bk8IchNND1wg6tUX9hf4xWeEJhvA-E_zE9ysBpRZrqE,3010
|
|
25
|
-
sycommon/middleware/middleware.py,sha256=
|
|
26
|
+
sycommon/middleware/middleware.py,sha256=SzZ4wufSNdwC4Ppw99TE7a6AVGkrZRc55NHSrA3PiC8,1447
|
|
26
27
|
sycommon/middleware/monitor_memory.py,sha256=pYRK-wRuDd6enSg9Pf8tQxPdYQS6S0AyjyXeKFRLKEs,628
|
|
27
28
|
sycommon/middleware/mq.py,sha256=4wBqiT5wJGcrfjk2GSr0_U3TStBxoNpHTzcRxVlMEHE,183
|
|
28
29
|
sycommon/middleware/timeout.py,sha256=fImlAPLm4Oa8N9goXtT_0os1GZPCi9F92OgXU81DgDU,656
|
|
29
|
-
sycommon/middleware/traceid.py,sha256=
|
|
30
|
+
sycommon/middleware/traceid.py,sha256=ugqPgHdUydj7m481rM_RH-yrIK9hAdkLemdPSSOnQvw,6821
|
|
30
31
|
sycommon/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
32
|
sycommon/models/base_http.py,sha256=EICAAibx3xhjBsLqm35Mi3DCqxp0FME4rD_3iQVjT_E,3051
|
|
32
33
|
sycommon/models/log.py,sha256=rZpj6VkDRxK3B6H7XSeWdYZshU8F0Sks8bq1p6pPlDw,500
|
|
33
|
-
sycommon/models/mqlistener_config.py,sha256=
|
|
34
|
+
sycommon/models/mqlistener_config.py,sha256=vXp2uMmd0XQ5B9noSRXWHewTy-juQ2y7IsWtISJD5aI,1661
|
|
34
35
|
sycommon/models/mqmsg_model.py,sha256=cxn0M5b0utQK6crMYmL-1waeGYHvK3AlGaRy23clqTE,277
|
|
35
36
|
sycommon/models/mqsend_config.py,sha256=NQX9dc8PpuquMG36GCVhJe8omAW1KVXXqr6lSRU6D7I,268
|
|
36
37
|
sycommon/models/sso_user.py,sha256=i1WAN6k5sPcPApQEdtjpWDy7VrzWLpOrOQewGLGoGIw,2702
|
|
37
|
-
sycommon/rabbitmq/rabbitmq_client.py,sha256=
|
|
38
|
-
sycommon/rabbitmq/rabbitmq_pool.py,sha256=
|
|
39
|
-
sycommon/rabbitmq/rabbitmq_service.py,sha256=
|
|
38
|
+
sycommon/rabbitmq/rabbitmq_client.py,sha256=dKpiptV892VbW3fErAoRZSE9UVVBZvbVPM3qPu8rQIk,21573
|
|
39
|
+
sycommon/rabbitmq/rabbitmq_pool.py,sha256=VLJ6JIIoVf1_NKV7FNmDFVkX5klN2JtLzbuUaaroEdc,27096
|
|
40
|
+
sycommon/rabbitmq/rabbitmq_service.py,sha256=UUvGkmDBQ7xTdCLYqkDSYZw5-FUNU7vnmgmANh4Z_bI,39960
|
|
40
41
|
sycommon/sse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
42
|
sycommon/sse/event.py,sha256=k_rBJy23R7crtzQeetT0Q73D8o5-5p-eESGSs_BPOj0,2797
|
|
42
43
|
sycommon/sse/sse.py,sha256=__CfWEcYxOxQ-HpLor4LTZ5hLWqw9-2X7CngqbVHsfw,10128
|
|
43
44
|
sycommon/synacos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
-
sycommon/synacos/
|
|
45
|
-
sycommon/synacos/
|
|
45
|
+
sycommon/synacos/example.py,sha256=61XL03tU8WTNOo3FUduf93F2fAwah1S0lbH1ufhRhRk,5739
|
|
46
|
+
sycommon/synacos/example2.py,sha256=adUaru3Hy482KrOA17DfaC4nwvLj8etIDS_KrWLWmCU,4811
|
|
47
|
+
sycommon/synacos/feign.py,sha256=-2tuGCqoSM3ddSoSz7h1RJTB06hn8K26v_1ev4qLsTU,7728
|
|
48
|
+
sycommon/synacos/feign_client.py,sha256=JxzxohrsscQNlAjRVo_3ZQrMQSfVHFOtRYyEnP6sDGk,15205
|
|
49
|
+
sycommon/synacos/nacos_service.py,sha256=2m1ZxIii3r657kQJfp7C7I5bxBUEGDweYMfloUUmBSw,35389
|
|
50
|
+
sycommon/synacos/param.py,sha256=KcfSkxnXOa0TGmCjY8hdzU9pzUsA8-4PeyBKWI2-568,1765
|
|
46
51
|
sycommon/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
52
|
sycommon/tools/docs.py,sha256=OPj2ETheuWjXLyaXtaZPbwmJKfJaYXV5s4XMVAUNrms,1607
|
|
48
53
|
sycommon/tools/snowflake.py,sha256=DdEj3T5r5OEvikp3puxqmmmz6BrggxomoSlnsRFb5dM,1174
|
|
49
54
|
sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
|
|
50
|
-
sycommon_python_lib-0.1.
|
|
51
|
-
sycommon_python_lib-0.1.
|
|
52
|
-
sycommon_python_lib-0.1.
|
|
53
|
-
sycommon_python_lib-0.1.
|
|
54
|
-
sycommon_python_lib-0.1.
|
|
55
|
+
sycommon_python_lib-0.1.46.dist-info/METADATA,sha256=TAAHgjLYJMlud71VM9Q_Fe98-3cNO9Gj2-mgUXmUWPI,7037
|
|
56
|
+
sycommon_python_lib-0.1.46.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
57
|
+
sycommon_python_lib-0.1.46.dist-info/entry_points.txt,sha256=q_h2nbvhhmdnsOUZEIwpuoDjaNfBF9XqppDEmQn9d_A,46
|
|
58
|
+
sycommon_python_lib-0.1.46.dist-info/top_level.txt,sha256=98CJ-cyM2WIKxLz-Pf0AitWLhJyrfXvyY8slwjTXNuc,17
|
|
59
|
+
sycommon_python_lib-0.1.46.dist-info/RECORD,,
|
|
File without changes
|
{sycommon_python_lib-0.1.21.dist-info → sycommon_python_lib-0.1.46.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|