# Go Micro [![GoDoc](https://godoc.org/github.com/micro/go-micro?status.svg)](https://godoc.org/github.com/micro/go-micro) [![Travis CI](https://travis-ci.org/micro/go-micro.svg?branch=master)](https://travis-ci.org/micro/go-micro) Go Micro is a pluggable RPC based microservice library which provides the fundamental building blocks for writing distributed applications. It is part of the [Micro](https://github.com/micro/micro) toolchain. It supports Proto-RPC and JSON-RPC as the request/response protocol out of the box and defaults to Consul for discovery. Every aspect of go-micro is pluggable. An example server can be found in examples/server. - [Mailing List](https://groups.google.com/forum/#!forum/micro-services) - [Slack](https://micro-services.slack.com) : [auto-invite](http://micro-invites.herokuapp.com/) ## Features Feature | Package | Built-in Plugin | Description ------- | ------- | --------- | ----------- Discovery | [Registry](https://godoc.org/github.com/micro/go-micro/registry) | consul | A way of locating services to communicate with Client | [Client](https://godoc.org/github.com/micro/go-micro/client) | rpc | Used to make RPC requests to a service Codec | [Codec](https://godoc.org/github.com/micro/go-micro/codec) | proto,json | Encoding/Decoding handler for requests Balancer | [Selector](https://godoc.org/github.com/micro/go-micro/selector) | random | Service node filter and pool Server | [Server](https://godoc.org/github.com/micro/go-micro/server) | rpc | Listens and serves RPC requests Pub/Sub | [Broker](https://godoc.org/github.com/micro/go-micro/broker) | http | Publish and Subscribe to events Transport | [Transport](https://godoc.org/github.com/micro/go-micro/transport) | http | Communication mechanism between services ## Go Plugins By default go-micro only provides a single implementation of each interface. Plugins can be found at [github.com/micro/go-plugins](https://github.com/micro/go-plugins). Contributions welcome! ## Prerequisites Consul is the default discovery mechanism provided in go-micro. Discovery is however pluggable. ### Install Consul [https://www.consul.io/intro/getting-started/install.html](https://www.consul.io/intro/getting-started/install.html) ## Getting Started ### Run Consul ``` $ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul ``` ### Run Service ``` $ go run examples/server/main.go --logtostderr I1108 11:08:19.926071 11358 server.go:96] Starting server go.micro.srv.example id go.micro.srv.example-04de4cf0-8609-11e5-bf3a-68a86d0d36b6 I1108 11:08:19.926407 11358 rpc_server.go:233] Listening on [::]:54080 I1108 11:08:19.926500 11358 http_broker.go:80] Broker Listening on [::]:54081 I1108 11:08:19.926632 11358 rpc_server.go:158] Registering node: go.micro.srv.example-04de4cf0-8609-11e5-bf3a-68a86d0d36b6 ``` ### Test Service ``` $ go run examples/client/main.go go.micro.srv.example-59b6e0ab-0300-11e5-b696-68a86d0d36b6: Hello John ``` ## Writing a service ### Create request/response proto `go-micro/examples/server/proto/example/example.proto`: ``` syntax = "proto3"; message Request { string name = 1; } message Response { string msg = 1; } ``` Compile proto `protoc -I$GOPATH/src --go_out=$GOPATH/src $GOPATH/src/github.com/micro/go-micro/examples/server/proto/example/example.proto` ### Create request handler `go-micro/examples/server/handler/example.go`: ```go package handler import ( log "github.com/golang/glog" c "github.com/micro/go-micro/context" example "github.com/micro/go-micro/examples/server/proto/example" "github.com/micro/go-micro/server" "golang.org/x/net/context" ) type Example struct{} func (e *Example) Call(ctx context.Context, req *example.Request, rsp *example.Response) error { md, _ := c.GetMetadata(ctx) log.Infof("Received Example.Call request with metadata: %v", md) rsp.Msg = server.Options().Id + ": Hello " + req.Name return nil } ``` ### Init server `go-micro/examples/server/main.go`: ```go package main import ( log "github.com/golang/glog" "github.com/micro/go-micro/cmd" "github.com/micro/go-micro/examples/server/handler" "github.com/micro/go-micro/server" ) func main() { // optionally setup command line usage cmd.Init() // Initialise Server server.Init( server.Name("go.micro.srv.example"), ) // Register Handlers server.Handle( server.NewHandler( new(handler.Example), ), ) // Run server if err := server.Run(); err != nil { log.Fatal(err) } } ``` ### Run service ``` $ go run examples/server/main.go --logtostderr I1108 11:08:19.926071 11358 server.go:96] Starting server go.micro.srv.example id go.micro.srv.example-04de4cf0-8609-11e5-bf3a-68a86d0d36b6 I1108 11:08:19.926407 11358 rpc_server.go:233] Listening on [::]:54080 I1108 11:08:19.926500 11358 http_broker.go:80] Broker Listening on [::]:54081 I1108 11:08:19.926632 11358 rpc_server.go:158] Registering node: go.micro.srv.example-04de4cf0-8609-11e5-bf3a-68a86d0d36b6 ```