Go plugins is a place for community maintained plugins.
Micro tooling is built on a powerful pluggable architecture. Plugins can be swapped out with zero code changes. This repository contains plugins for all micro related tools. Read on for further info.
Contents of this repository:
Directory | Description |
---|---|
Broker | PubSub messaging; NATS, NSQ, RabbitMQ, Kafka |
Client | RPC Clients; gRPC, HTTP |
Codec | Message Encoding; BSON, Mercury |
Micro | Micro Toolkit Plugins |
Registry | Service Discovery; Etcd, Gossip, NATS |
Selector | Load balancing; Label, Cache, Static |
Server | RPC Servers; gRPC, HTTP |
Transport | Bidirectional Streaming; NATS, RabbitMQ |
Wrapper | Middleware; Circuit Breakers, Rate Limiting, Tracing, Monitoring |
Plugins can be added to go-micro in the following ways. By doing so they'll be available to set via command line args or environment variables.
Import the plugins in a plugins.go
file
package main
import (
_ "github.com/go-micro/plugins/v5/broker/rabbitmq"
_ "github.com/go-micro/plugins/v5/registry/kubernetes"
_ "github.com/go-micro/plugins/v5/transport/nats"
)
Create your service and ensure you call service.Init
package main
import (
"go-micro.dev/v5"
)
func main() {
service := micro.NewService(
// Set service name
micro.Name("my.service"),
)
// Parse CLI flags
service.Init()
}
Build your service
go build -o service ./main.go ./plugins.go
Use environment variables to set the
MICRO_BROKER=rabbitmq \
MICRO_REGISTRY=kubernetes \
MICRO_TRANSPORT=nats \
./service
Or use command line flags to enable them
./service --broker=rabbitmq --registry=kubernetes --transport=nats
Import and set as options when creating a new service
import (
"go-micro.dev/v5"
"github.com/go-micro/plugins/v5/registry/kubernetes"
)
func main() {
registry := kubernetes.NewRegistry() //a default to using env vars for master API
service := micro.NewService(
// Set service name
micro.Name("my.service"),
// Set service registry
micro.Registry(registry),
)
}
An anti-pattern is modifying the main.go
file to include plugins. Best practice recommendation is to include
plugins in a separate file and rebuild with it included. This allows for automation of building plugins and
clean separation of concerns.
Create file plugins.go
package main
import (
_ "github.com/go-micro/plugins/v5/broker/rabbitmq"
_ "github.com/go-micro/plugins/v5/registry/kubernetes"
_ "github.com/go-micro/plugins/v5/transport/nats"
)
Build with plugins.go
go build -o service main.go plugins.go
Run with plugins
MICRO_BROKER=rabbitmq \
MICRO_REGISTRY=kubernetes \
MICRO_TRANSPORT=nats \
service