工具集插件

外部代码可以使用插件的方式集成到Micro工具集中。需要注意的是,这与go-micro的工具集是完全分离的。

当使用插件后,就可以在工具集中增加flag、命令行、http处理器。

插件是如何工作的

micro/plugin包含了插件,其下有一个全局插件管理器可以跨全工具集使用。

插件通过调用plugin.Register方法注册。每个组件(api, web, proxy, cli, bot)都各有一个用于注册插件的管理器,该管理器只能作为其所属组件的一部分加到组件中。可以通过调用api.Registerweb.Register等等使用它们。

下面是插件接口

  1. // Plugin is the interface for plugins to micro. It differs from go-micro in that it's for
  2. // the micro API, Web, Proxy, CLI. It's a method of building middleware for the HTTP side.
  3. type Plugin interface {
  4. // Global Flags
  5. Flags() []cli.Flag
  6. // Sub-commands
  7. Commands() []cli.Command
  8. // Handle is the middleware handler for HTTP requests. We pass in
  9. // the existing handler so it can be wrapped to create a call chain.
  10. Handler() Handler
  11. // Init called when command line args are parsed.
  12. // The initialised cli.Context is passed in.
  13. Init(*cli.Context) error
  14. // Name of the plugin
  15. String() string
  16. }
  17. // Manager is the plugin manager which stores plugins and allows them to be retrieved.
  18. // This is used by all the components of micro.
  19. type Manager interface {
  20. Plugins() map[string]Plugin
  21. Register(name string, plugin Plugin) error
  22. }
  23. // Handler is the plugin middleware handler which wraps an existing http.Handler passed in.
  24. // Its the responsibility of the Handler to call the next http.Handler in the chain.
  25. type Handler func(http.Handler) http.Handler

如何使用

下面我们展示一个简单的插件,它负责接收flag参数,并打印该参数值。

插件

Create a plugin.go file in the top level dir

在顶级目录下增加plugin.go文件

  1. package main
  2. import (
  3. "log"
  4. "github.com/micro/cli"
  5. "github.com/micro/micro/plugin"
  6. )
  7. func init() {
  8. plugin.Register(plugin.NewPlugin(
  9. plugin.WithName("example"),
  10. plugin.WithFlag(cli.StringFlag{
  11. Name: "example_flag",
  12. Usage: "This is an example plugin flag",
  13. EnvVar: "EXAMPLE_FLAG",
  14. Value: "avalue",
  15. }),
  16. plugin.WithInit(func(ctx *cli.Context) error {
  17. log.Println("Got value for example_flag", ctx.String("example_flag"))
  18. return nil
  19. }),
  20. ))
  21. }

编译文件

指定plugin文件编译micro应用

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

仓库

micro工具集可以在github.com/micro/go-plugins/micro查看。