Skip to main content

后端插件

插件为 Backstage 后端提供了实际的基本功能。 每个插件的运行都完全独立于其他所有插件,它们之间仅通过网络调用进行通信。 这意味着插件之间有很强的隔离性,每个插件都可以被视为一个独立的微服务。 虽然默认的 Backstage 项目将所有插件都安装在一个后端中,但也可以将此设置拆分为多个后端,每个后端容纳一个或多个插件。

定义插件

使用createBackendPlugin函数,通常应从插件包中导出。 所有插件都必须有一个 ID 和一个register方法,其中 ID 与软件包名称中的插件 ID 相匹配,而不使用-backend参见专门部分正确的命名模式。

// plugins/example-backend/src/plugin.ts
import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';

export const examplePlugin = createBackendPlugin({
pluginId: 'example',
register(env) {
env.registerInit({
deps: {
logger: coreServices.logger,
},
async init({ logger }) {
logger.info('Hello from example plugin');
},
});
},
});

env对象传递给register回调包含声明插件外部表面的不同方法。env.registerInit方法用于注册初始化函数,该函数在后端启动时运行。deps参数用于声明服务依赖关系,而init回调将传递一个包含已解决的依赖关系的对象。 在本例中,我们声明了对日志记录器服务的依赖,该服务是所有 backstage 后端插件都可使用的核心服务之一。 有关核心服务的完整列表以及每项服务的文档,请参阅核心服务科当然,插件也可以依赖其他库输出的服务。

createBackendPlugin返回值导出为examplePlugin是一个工厂函数,用于创建实际的插件实例。 例如,要在后端实例中安装插件,您需要执行以下操作:

import { examplePlugin } from 'backstage-plugin-example-backend';

backend.add(examplePlugin());

按照惯例,每个插件包都应导出其插件实例作为该包的默认导出:

// plugins/example-backend/src/index.ts
export { examplePlugin as default } from './plugin.ts';

这样,只需引用软件包,就可以在后端实例中安装插件:

backend.add(import('backstage-plugin-example-backend'));

要定制插件,一般应首选使用静态配置按照惯例,插件应将其配置放在与插件 ID 相匹配的顶级配置键下。 例如,我们的示例插件可能配置如下:

example:
message: Welcome to the example plugin

在静态配置限制太多的情况下,您可以为插件注册扩展点。 扩展点在下一节.

插件规则

在更广泛的 Backstage 插件生态系统中,以下规则适用于 Backstage 插件的生产设置。 任何维护在@backstage包命名空间应遵循这些规则,建议所有广泛分发的插件也遵循这些规则。

开发或测试设置是这些规则的例外情况,在这些情况下,可以采取捷径来简化开发和保持简单。

可扩展

插件的设计必须始终保持横向可扩展性。 这意味着不应在内存中保留任何状态,或确保在多个实例中复制这些状态不成问题。 插件应是无状态的,或将其状态存储在外部服务(如数据库)中。

隔离

插件之间绝不能通过代码直接通信,它们只能通过网络通信。 如果插件希望公开一个外部接口供其他插件和模块使用,建议通过一个节点库库应导出一个 API 客户端服务,以调用您的插件,或类似的结构。