first commit

This commit is contained in:
mol
2023-02-04 00:14:50 +08:00
commit a2f1b6d4fd
51 changed files with 839 additions and 0 deletions

66
Route.py Normal file
View File

@ -0,0 +1,66 @@
from utils import *
class Route(object):
"""
路由实体类,对应一项路由配置
TODO replace_placeholder 函数,替换字符串中的占位符
TODO extract_placeholders 函数,获取字符串中的点位符
TODO get_pipe 函数通过handler name获取对应的PipeHandler类
"""
SERVICE_NAME_PLACEHOLDER = 'service_name'
def __init__(self, name, service_name, methods, path, upstream_path, pipelines=None):
"""
:param str name: (string) 路由名称
:param str service_name: (string) 内部微服务名称(如 `resolver` `data_manager` 等)
:param list methods: (array) 支持的请求方法列表, 如 `['GET', 'PUT']`
:param str path: (string) 匹配的路径,使用`flask`的占位符 `<parameter_name>` 声明路径参数,服务名称固定使用 `<service_name>` 占位符
:param str upstream_path: (string) 转发到上游服务的路径,与`path`使用同样风格的参数占位符
:param dict pipelines: (object) 数据处理管道
"""
if not isinstance(methods, (list, set, tuple)):
raise ValueError("methods must be an iterable list")
pipelines = pipelines or {}
self.name = name
self.service_name = service_name
self.methods = list(set(methods))
# 使用 replace_placeholder 将 <service_name> 替换为路由配置中的后端服务
self.path = replace_placeholder(path, self.SERVICE_NAME_PLACEHOLDER, service_name)
self.upstream_path = replace_placeholder(upstream_path, self.SERVICE_NAME_PLACEHOLDER, service_name)
self.pipelines = {
"inbound": map(self.init_pipe_handler, pipelines.get('inbound') or []),
"outbound": map(self.init_pipe_handler, pipelines.get('outbound') or []),
}
# 导出上游服务资源所需的参数(占位符)
self.upstream_params = extract_placeholders(self.upstream_path)
def init_pipe_handler(self, pipe_conf):
try:
name = pipe_conf['name']
properties = pipe_conf.get('properties', {})
klass = get_pipe(name)
return klass(**properties)
except Exception as e:
raise ValueError("illegal pipe config {}: {}".format(pipe_conf, e))
def inbound_pipes(self):
return self.pipelines.get("inbound") or []
def outbound_pipes(self):
return self.pipelines.get("outbound") or []
def load(routes):
"""
:param list of dict routes: 路由配置列表
:rtype: list of Route
"""
return map(lambda kv: Route(**kv), routes)