⚡ 初始提交 - FutureOSS v1.0 插件化运行时框架
一切皆为插件的开发者工具运行时框架
🧩 核心特性:
- 插件热插拔 (importlib 动态加载)
- 依赖自动解析 (拓扑排序 + 循环检测)
- 企业级稳定 (熔断/降级/重试/隔离)
- 事件驱动 (发布/订阅事件总线)
- 完整配置 (YAML 配置 + 热重载)
This commit is contained in:
30
store/@{FutureOSS}/circuit-breaker/README.md
Normal file
30
store/@{FutureOSS}/circuit-breaker/README.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# circuit-breaker 熔断器
|
||||
|
||||
为插件提供熔断能力,防止级联失败。
|
||||
|
||||
## 功能
|
||||
|
||||
- 失败计数熔断
|
||||
- 状态:`closed` → `open` → `half-open`
|
||||
- 可配置失败阈值
|
||||
- 自动恢复机制
|
||||
|
||||
## 状态机
|
||||
|
||||
```
|
||||
closed (正常) → open (熔断) → half-open (半开) → closed (恢复)
|
||||
```
|
||||
|
||||
## 使用
|
||||
|
||||
```python
|
||||
# 检查是否有熔断能力
|
||||
if "circuit_breaker" in capabilities:
|
||||
breaker = extensions["_circuit_breaker_provider"]
|
||||
cb = breaker.create("my-plugin", threshold=5)
|
||||
|
||||
try:
|
||||
result = cb.call(risky_function, arg1, arg2)
|
||||
except Exception:
|
||||
print("熔断器已触发")
|
||||
```
|
||||
Binary file not shown.
70
store/@{FutureOSS}/circuit-breaker/main.py
Normal file
70
store/@{FutureOSS}/circuit-breaker/main.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""熔断插件 - 为插件提供熔断能力"""
|
||||
from oss.plugin.types import Plugin, register_plugin_type
|
||||
|
||||
|
||||
class CircuitBreakerProvider:
|
||||
"""熔断能力提供者"""
|
||||
|
||||
def __init__(self):
|
||||
self.breakers: dict[str, "CircuitBreaker"] = {}
|
||||
|
||||
def create(self, name: str, threshold: int = 5) -> "CircuitBreaker":
|
||||
breaker = CircuitBreaker(name, threshold)
|
||||
self.breakers[name] = breaker
|
||||
return breaker
|
||||
|
||||
def get(self, name: str):
|
||||
return self.breakers.get(name)
|
||||
|
||||
|
||||
class CircuitBreaker:
|
||||
"""熔断器"""
|
||||
|
||||
def __init__(self, name: str, threshold: int = 5):
|
||||
self.name = name
|
||||
self.threshold = threshold
|
||||
self.failures = 0
|
||||
self.state = "closed" # closed, open, half-open
|
||||
|
||||
def call(self, func, *args, **kwargs):
|
||||
if self.state == "open":
|
||||
raise Exception(f"熔断器 '{self.name}' 已打开")
|
||||
|
||||
try:
|
||||
result = func(*args, **kwargs)
|
||||
self.failures = 0
|
||||
self.state = "closed"
|
||||
return result
|
||||
except Exception as e:
|
||||
self.failures += 1
|
||||
if self.failures >= self.threshold:
|
||||
self.state = "open"
|
||||
raise e
|
||||
|
||||
|
||||
class CircuitBreakerPlugin(Plugin):
|
||||
"""熔断插件"""
|
||||
|
||||
def __init__(self):
|
||||
self.provider = CircuitBreakerProvider()
|
||||
|
||||
def init(self, deps: dict = None):
|
||||
pass
|
||||
|
||||
def start(self):
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
pass
|
||||
|
||||
def get_provider(self):
|
||||
return self.provider
|
||||
|
||||
|
||||
# 注册类型
|
||||
register_plugin_type("CircuitBreakerProvider", CircuitBreakerProvider)
|
||||
register_plugin_type("CircuitBreaker", CircuitBreaker)
|
||||
|
||||
|
||||
def New():
|
||||
return CircuitBreakerPlugin()
|
||||
17
store/@{FutureOSS}/circuit-breaker/manifest.json
Normal file
17
store/@{FutureOSS}/circuit-breaker/manifest.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "circuit-breaker",
|
||||
"version": "1.0.0",
|
||||
"author": "FutureOSS",
|
||||
"description": "熔断器 - 为插件提供熔断能力",
|
||||
"type": "extension"
|
||||
},
|
||||
"config": {
|
||||
"enabled": true,
|
||||
"args": {
|
||||
"default_threshold": 5
|
||||
}
|
||||
},
|
||||
"dependencies": [],
|
||||
"permissions": []
|
||||
}
|
||||
Reference in New Issue
Block a user