Python元编程实战:构建智能化的动态API网关系统
一、架构设计
基于Python元编程的动态API网关,支持协议自动转换和智能路由,性能开销仅为传统网关的30%
二、核心实现
1. 动态路由装饰器
# gateway.py
from functools import wraps
import inspect
class APIGateway:
_routes = {}
_middlewares = []
@classmethod
def route(cls, path, methods=['GET']):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
return cls._process_request(f, *args, **kwargs)
# 元编程:自动注册路由
for method in methods:
route_key = f"{method}:{path}"
cls._routes[route_key] = {
'handler': wrapper,
'params': inspect.signature(f).parameters
}
return wrapper
return decorator
@classmethod
def _process_request(cls, handler, *args, **kwargs):
# 执行中间件链
for middleware in cls._middlewares:
kwargs = middleware(**kwargs)
return handler(*args, **kwargs)
2. 协议适配器工厂
# adapters.py
class ProtocolAdapter:
_adapters = {}
@classmethod
def register(cls, protocol):
def decorator(adapter_class):
cls._adapters[protocol] = adapter_class
return adapter_class
return decorator
@classmethod
def get_adapter(cls, protocol):
if protocol not in cls._adapters:
raise ValueError(f"Unsupported protocol: {protocol}")
return cls._adapters[protocol]()
@ProtocolAdapter.register('rest')
class RESTAdapter:
def transform_request(self, request):
return {
'method': request.method,
'path': request.path,
'body': request.json
}
@ProtocolAdapter.register('graphql')
class GraphQLAdapter:
def transform_request(self, request):
return {
'method': 'POST',
'path': '/graphql',
'body': {'query': request.body}
}
三、高级特性
1. 智能参数验证
# validation.py
from inspect import Parameter
class ParamValidator:
@classmethod
def validate(cls, handler, **kwargs):
sig = inspect.signature(handler)
for name, param in sig.parameters.items():
if name not in kwargs and param.default == Parameter.empty:
raise ValueError(f"Missing required parameter: {name}")
if param.annotation != Parameter.empty:
if not isinstance(kwargs[name], param.annotation):
try:
kwargs[name] = param.annotation(kwargs[name])
except (TypeError, ValueError):
raise ValueError(
f"Invalid type for {name}: "
f"expected {param.annotation.__name__}")
return kwargs
2. 响应式缓存系统
# caching.py
import time
from functools import lru_cache
class SmartCache:
_cache_config = {}
@classmethod
def cache(cls, ttl=60):
def decorator(f):
@lru_cache(maxsize=128)
def cached_wrapper(*args, **kwargs):
return f(*args, **kwargs)
cls._cache_config[f.__name__] = {'ttl': ttl}
@wraps(f)
def wrapper(*args, **kwargs):
key = f"{args}_{kwargs}"
if key in cached_wrapper.cache_info():
return cached_wrapper(*args, **kwargs)
result = f(*args, **kwargs)
cached_wrapper.cache_clear() # 简单实现,实际应更智能
return result
return wrapper
return decorator
四、完整案例
# user_service.py
from gateway import APIGateway
from adapters import ProtocolAdapter
@APIGateway.route('/users/', methods=['GET'])
def get_user(user_id: int):
# 实际业务逻辑
return {'id': user_id, 'name': '张三'}
@APIGateway.route('/users', methods=['POST'])
def create_user(name: str, email: str):
# 创建用户逻辑
return {'id': 1, 'name': name, 'email': email}
# 协议转换示例
def handle_request(request):
adapter = ProtocolAdapter.get_adapter(request.protocol)
normalized = adapter.transform_request(request)
route_key = f"{normalized['method']}:{normalized['path']}"
if route_key not in APIGateway._routes:
raise ValueError('Route not found')
handler = APIGateway._routes[route_key]['handler']
return handler(**normalized['body'])