1. 运行时

插件是将外部代码集成到 micro 工具包中的一种方式. 这与 go-micro 插件完全分离. 使用插件可以在此处添加其他标志, 命令和 HTTP 处理程序到工具包.

1.1. 工作原理

在 micro/plugin 下有一个全局插件管理器, 它由将在整个工具包中使用的插件组成. 插件可以通过调用进行注册. 每个组件 (api, web, proxy, cli, bot) 都有一个单独的插件管理器, 用于注册插件, 该插件应仅作为该组件的一部分添加. 它们可以通过调用 plugin.Register, api.Register, web.Register 等方式使用.

下面是接口

// Plugin is the interface for plugins to micro. It differs from go-micro in that it's for
// the micro API, Web, Proxy, CLI. It's a method of building middleware for the HTTP side.
type Plugin interface {
    // Global Flags
    Flags() []cli.Flag
    // Sub-commands
    Commands() []cli.Command
    // Handle is the middleware handler for HTTP requests. We pass in
    // the existing handler so it can be wrapped to create a call chain.
    Handler() Handler
    // Init called when command line args are parsed.
    // The initialised cli.Context is passed in.
    Init(*cli.Context) error
    // Name of the plugin
    String() string
}

// Manager is the plugin manager which stores plugins and allows them to be retrieved.
// This is used by all the components of micro.
type Manager interface {
        Plugins() map[string]Plugin
        Register(name string, plugin Plugin) error
}

// Handler is the plugin middleware handler which wraps an existing http.Handler passed in.
// Its the responsibility of the Handler to call the next http.Handler in the chain.
type Handler func(http.Handler) http.Handler

1.2. 如何使用

下面是一个简单的插件示例, 该插件添加一个标志, 然后打印值

1.2.1. 插件

在顶层目录中创建 plugins.go 文件

package main

import (
    "log"
    "github.com/micro/cli"
    "github.com/micro/micro/plugin"
)

func init() {
    plugin.Register(plugin.NewPlugin(
        plugin.WithName("example"),
        plugin.WithFlag(cli.StringFlag{
            Name:   "example_flag",
            Usage:  "This is an example plugin flag",
            EnvVar: "EXAMPLE_FLAG",
            Value: "avalue",
        }),
        plugin.WithInit(func(ctx *cli.Context) error {
            log.Println("Got value for example_flag", ctx.String("example_flag"))
            return nil
        }),
    ))
}

1.2.2. 构建代码

只需使用插件构建 micro

go build -o micro ./main.go ./plugin.go

1.3. 仓库

工具包的插件可以在此仓库 github.com/micro/go-plugins/micro 中找到.

results matching ""

    No results matching ""