跳到主要内容
版本:0.4.x(Latest)

基本介绍

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依赖运行时捕获结果,不应作为业务数据权威来源。

接口定义

源码插件接口

方法说明
DynamicRouteMetadatacontext.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

相关服务