Expand description
Flare 能力插件的宿主接入库:把插件向 capability 声明自己这件事做成三行。
§它解决什么
插件接入 capability 有两条路:
- 被发现:插件注册到 Consul/etcd,capability 按配置里的
plugin_discovery_endpoints找到它。这条路走得通,但发现来的端点 没有清单信息 —— capability 只能把它标成unverified, 于是「声明即边界」对它无从强制。 - 主动声明(本库):插件启动后调用
RegisterPluginEndpoint, 带上版本、清单摘要与自己声明能处理的 operation 全集。 这样它才是 verified 的,声明之外的调用会被 capability 拒绝。
两条路不冲突:服务目录负责「进程在哪」,声明负责「它能做什么」。
本库只做后者 —— 前者各插件已经在用 flare_server_core::discovery,
没必要再包一层。
§为什么要有这个库,而不是每个插件自己调
「自己调」的问题不在于代码量,在于容易少调:漏了 declared_operations 就退化成 unverified,而这不会报错、只会让边界强制失效。把它做成一个 必须填满字段的结构体,漏填在编译期就暴露。
use flare_plugin_host::{PluginDeclaration, PluginHost};
let declaration = PluginDeclaration {
tenant_id: "0".into(),
plugin_id: "flare-moments".into(),
capability_id: "social.moments.feed".into(),
grpc_authority: "127.0.0.1:50204".into(),
plugin_version: "1.0.0".into(),
api_version: "1".into(),
manifest_sha256: "….".into(),
declared_operations: vec!["social.moments.feed".into()],
labels: Default::default(),
seat_model: flare_plugin_host::SeatModel::Tenant,
};
PluginHost::connect("http://127.0.0.1:50051")
.await?
.announce(&declaration)
.await?;Structs§
- Plugin
Declaration - 插件对 capability 的完整声明。
- Plugin
Host - 与 capability 控制面的连接。