1. 插件
前言: Go Micro 是一个可插拔的框架
2. 概述
Go Micro 构建于 Go 接口之上. 因此这些接口的实现是可插拔的.
默认情况下, go-micro 只提供核心上每个接口的几个实现, 但它是完全可插拔的. 已经有几十个插件, 在这里 github.com/micro/go-plugins 欢迎贡献! 插件可确保 Go Micro 服务在技术发展后长期保持生存。
2.1.1. 添加插件
如果要集成插件, 只需将它们链接到单独的文件中并重新生成
创建 plugins.go 文件并导入所需的插件:
package main
import (
// consul registry
_ "github.com/micro/go-plugins/registry/consul"
// rabbitmq transport
_ "github.com/micro/go-plugins/transport/rabbitmq"
// kafka broker
_ "github.com/micro/go-plugins/broker/kafka"
)
通过包含插件文件来构建应用程序:
# assuming files main.go and plugins.go are in the top level dir
# For local use
go build -o service *.go
插件的标志用法:
service --registry=etcdv3 --transport=nats --broker=kafka
或者首选的是使用环境变量来处理 12 因素的应用程序
MICRO_REGISTRY=consul
MICRO_TRANSPORT=rabbitmq
MICRO_BROKER=kafka
service
2.1.2. 插件选项
或者您可以将插件设置为直接在代码中服务的选项
package main
import (
"github.com/micro/go-micro/v2"
// consul registry
"github.com/micro/go-plugins/registry/consul"
// rabbitmq transport
"github.com/micro/go-plugins/transport/rabbitmq"
// kafka broker
"github.com/micro/go-plugins/broker/kafka"
)
func main() {
registry := consul.NewRegistry()
broker := kafka.NewBroker()
transport := rabbitmq.NewTransport()
service := micro.NewService(
micro.Name("greeter"),
micro.Registry(registry),
micro.Broker(broker),
micro.Transport(transport),
)
service.Init()
service.Run()
}
2.1.3. 编写插件
插件是一个建立在 Go 接口上的概念. 每个包都维护一个高级接口抽象. 只需实现接口并将其作为服务选项传递给它即可.
服务发现接口称为 Registry. 实现此接口的任何内容都可以用作注册表. 这同样适用于其他包.
type Registry interface {
Register(*Service, ...RegisterOption) error
Deregister(*Service) error
GetService(string) ([]*Service, error)
ListServices() ([]*Service, error)
Watch() (Watcher, error)
String() string
}
参阅 go-plugins 更好地了解实现细节.