基本介绍
services.Route()用于读取当前请求上的动态路由元数据。源码插件通过services.Route()访问,动态插件通过plugin.yaml声明service: route后使用pluginbridge.Default().Route()客户端访问。该服务主要服务宿主审计、操作记录或源码插件处理动态插件请求后的上下文补充。
源码插件注册自己的路由时不需要使用RouteService;路由注册通过pluginhost.Declarations.HTTP().RegisterRoutes完成。
能力阶段:运行期
类型支持:源码插件、动态插件
能力设计
元数据视图模型
DynamicRouteMetadata是附着在当前请求上的只读视图,包含动态路由的完整描述信息:
| 字段 | 说明 |
|---|---|
PluginID | 拥有当前动态路由的插件ID |
Method | 动态路由声明的HTTP方法 |
PublicPath | 宿主对外暴露并匹配的路径 |
Tags | 动态路由声明的标签 |
Summary | 动态路由声明的摘要 |
Meta | 插件自定义路由元数据 |
ResponseBody | 分发器捕获的原始响应体 |
ResponseContentType | 响应内容类型 |
路由分发流程
只读数据语义
调用方不能通过该服务修改动态路由或响应。非动态路由返回nil,使用前应判空。ResponseBody依赖运行时捕获结果,不应作为业务数据权威来源。
接口定义
源码插件接口
| 方法 | 说明 |
|---|---|
DynamicRouteMetadata | 从context.Context读取动态路由元数据,非动态路由返回nil |
动态插件接口
动态插件通过hostServices.route声明授权的方法:
| 动态方法 | 说明 |
|---|---|
metadata.get | 读取当前请求上的动态路由元数据 |
能力使用
源码插件使用
源码插件通过services.Route()读取动态路由元数据,典型场景包括审计日志和操作记录:
// 读取动态路由元数据
meta := services.Route().DynamicRouteMetadata(ctx)
if meta != nil {
// 记录审计日志
log.Infof("动态插件 %s 的路由 %s %s 被访问", meta.PluginID, meta.Method, meta.PublicPath)
}
源码插件注册自己的路由时使用pluginhost.Declarations.HTTP().RegisterRoutes:
plugin := pluginhost.NewDeclarations("my-author-my-domain-my-cap")
err := plugin.HTTP().RegisterRoutes(
pluginhost.ExtensionPointHTTPRouteRegister,
pluginhost.CallbackExecutionModeBlocking,
registerRoutes,
)
动态插件使用
动态插件在plugin.yaml中声明route服务:
hostServices:
- service: route
methods:
- metadata.get
动态插件通过pluginbridge.Default().Route()客户端调用:
routeSvc := pluginbridge.Default().Route()
meta := routeSvc.DynamicRouteMetadata(ctx)
设计约束
- 只读数据。 调用方不能通过该服务修改动态路由或响应。
- 非动态路由返回
nil。 使用前应判空。 - 响应体可能为空。
ResponseBody依赖运行时捕获结果,不应作为业务数据权威来源。 - 动态插件自身读取请求信封。 动态插件内的路由信息来自
BridgeRequestEnvelopeV1.Route,不是通过hostServices调用RouteService。