Skip to main content

Crate flare_plugin_host

Crate flare_plugin_host 

Source
Expand description

Flare 能力插件的宿主接入库:把插件向 capability 声明自己这件事做成三行。

§它解决什么

插件接入 capability 有两条路:

  1. 被发现:插件注册到 Consul/etcd,capability 按配置里的 plugin_discovery_endpoints 找到它。这条路走得通,但发现来的端点 没有清单信息 —— capability 只能把它标成 unverified, 于是「声明即边界」对它无从强制。
  2. 主动声明(本库):插件启动后调用 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§

PluginDeclaration
插件对 capability 的完整声明。
PluginHost
与 capability 控制面的连接。

Enums§

HostError
SeatModel
计费/授权单位。