写第一个 HTTP 插件
本页从零写一个可装载、可编排的 HTTP 插件步骤:鉴权令牌检查——缺头短路 401,有头放行。
示例代码按当前 SDK 契约编写,类型与方法名与 KernLab.Traffic.Contracts 程序集逐字一致。
1. 工程与引用
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="KernLab.Traffic.Contracts" Version="*" />
</ItemGroup>
</Project>
SDK 契约零 MEDI、零 AspNetCore——引用 Contracts 即可编译,不引入宿主框架。
2. 写特性类
using KernLab.Traffic.Contracts.Plugins;
[PluginFeature("token-check", Domain = PluginFeatureDomain.Http,
Description = "校验 X-Api-Token 请求头")]
public sealed class TokenCheckFeature : HttpFeatureBase
{
protected override ValueTask<FeatureResult> ExecuteCoreAsync(
PluginHttpContext context, CancellationToken ct)
{
var token = context.RequestHeader("X-Api-Token");
if (string.IsNullOrEmpty(token))
return ValueTask.FromResult(FeatureResult.ShortCircuit(401));
// 与后续步骤/上游共享的值:写槽位(声明 produces 后可见)
context.SetSlot("acme:token-checked", "1");
return ValueTask.FromResult(FeatureResult.Continue);
}
}
要点:
- 继承
HttpFeatureBase,overrideExecuteCoreAsync——强类型PluginHttpContext以参数传入,无强转、无接口成员动物园; [PluginFeature("code")]的 code=编排单元标识(catalog 键末段{ns}/{name}/{code});FeatureResult.Continue放行;FeatureResult.ShortCircuit(401)短路——后续步骤 不执行,401 落给客户端;- 槽位键
{ns}:{slot}两段 slug——acme即本插件命名空间。
3. (可选)启动钩子与服务
轻量插件到此为止。需要自有服务(连接池/缓存客户端)的插件加启动钩子:
public sealed class Startup : IPluginStartup
{
public void ConfigureServices(IPluginServiceRegistrar registrar)
=> registrar.AddSingleton(typeof(ITokenStore), typeof(TokenStore));
}
特性类构造器声明依赖即自动注入(SDK 六面服务与自有服务同池)。
Scoped 在插件容器语义下=容器级单例(包即作用域)。
4. 清单
包根放 manifest.json(清单 v2——字段只增):
{
"specVersion": 2,
"namespace": "acme",
"name": "token-check",
"version": "1.0.0",
"mode": "Assembly",
"entry": { "assembly": "Acme.TokenCheck.dll", "startup": "Startup" },
"capabilities": []
}
| 字段 | 语义 |
|---|---|
namespace/name/version |
插件身份三元组(ns 即隔离与协作域) |
mode |
Assembly(ALC 内核——缺省)|Wasm|Grpc|Script|Subprocess |
entry.startup |
可选——缺省走内核模板化启动 |
capabilities |
能力声明制授权(state.kv/events.pubsub/net.call/metrics.emit/trace.emit/http.headers/http.query)——未声明的能力注入面不注册(构造解析即失败),声明×内核矩阵另有 fail-fast 门 |
5. 安装与编排
# 安装:清单 v2 JSON 走 --body;按清单 distribution 分发(tenant 私有域/platform 平台公共面)
traffic-worker plugin install --body @manifest.json --admin http://127.0.0.1:7901
# 目录确认(catalog 出现即发现成功)
traffic-worker plugin catalog --admin http://127.0.0.1:7901
(包体上传/远端仓库/签名信任的完整流程见包仓库与信任。)
编进路由链——图节点用 step+mode 双字段标识插件来源:
{ "id": "n1", "step": "token-check", "mode": "plugin:acme/1.0.0",
"canvas": { "x": 120, "y": 80 } }
插件变更走 draft→publish——热切换不停机。
下一步
- 上下文全部成员与六面服务 → SDK 参考
- 槽位的类型与载体边界 → 槽位协作
- 后台任务(非管线托管单元)→ SDK 参考 · 后台任务