Skip to content

Commit

Permalink
Make command internal
Browse files Browse the repository at this point in the history
  • Loading branch information
Asim committed Jan 2, 2016
1 parent 59a6671 commit 1f1bc27
Show file tree
Hide file tree
Showing 8 changed files with 322 additions and 124 deletions.
147 changes: 92 additions & 55 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ By default go-micro only provides a single implementation of each interface. Plu

## Prerequisites

Consul is the default discovery mechanism provided in go-micro. Discovery is however pluggable.
Consul is the default discovery mechanism provided in go-micro. Discovery is however pluggable so you can used etcd, kubernetes, zookeeper, etc.

### Install Consul
[https://www.consul.io/intro/getting-started/install.html](https://www.consul.io/intro/getting-started/install.html)
Expand All @@ -41,104 +41,141 @@ $ 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
$ go run examples/service/main.go --logtostderr
I0102 00:22:26.413467 12018 rpc_server.go:297] Listening on [::]:62492
I0102 00:22:26.413803 12018 http_broker.go:115] Broker Listening on [::]:62493
I0102 00:22:26.414009 12018 rpc_server.go:212] Registering node: greeter-e6b2fc6f-b0e6-11e5-a42f-68a86d0d36b6
```

### Test Service
```
$ go run examples/client/main.go
go.micro.srv.example-59b6e0ab-0300-11e5-b696-68a86d0d36b6: Hello John
$ go run examples/service/main.go --client
Hello John
```

## Writing a service

### Create request/response proto
`go-micro/examples/server/proto/example/example.proto`:
`go-micro/examples/service/proto/greeter.proto`:

```
syntax = "proto3";
message Request {
string name = 1;
service Greeter {
rpc Hello(HelloRequest) returns (HelloResponse) {}
}
message Response {
string msg = 1;
message HelloRequest {
string name = 1;
}
message HelloResponse {
string greeting = 2;
}
```

### Install protobuf for code generation

We use a protobuf plugin for code generation. This is completely optional. Look at [examples/server](https://github.com/micro/go-micro/blob/master/examples/server/main.go)
and [examples/client](https://github.com/micro/go-micro/blob/master/examples/client/main.go) for examples without code generation.

```shell
go get github.com/micro/protobuf
```

Compile proto `protoc -I$GOPATH/src --go_out=$GOPATH/src $GOPATH/src/github.com/micro/go-micro/examples/server/proto/example/example.proto`
Compile proto `protoc -I$GOPATH/src --go_out=plugins=micro:$GOPATH/src $GOPATH/src/github.com/micro/go-micro/examples/service/proto/greeter.proto`

### Create request handler
`go-micro/examples/server/handler/example.go`:
### Define the service
`go-micro/examples/service/main.go`:

```go
package handler
package main

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"
"fmt"

micro "github.com/micro/go-micro"
proto "github.com/micro/go-micro/examples/service/proto"
"golang.org/x/net/context"
)

type Example struct{}
type Greeter 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
func (g *Greeter) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
rsp.Greeting = "Hello " + req.Name
return nil
}

func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(
micro.Name("greeter"),
micro.Version("latest"),
micro.Metadata(map[string]string{
"type": "helloworld",
}),
)

// Init will parse the command line flags. Any flags set will
// override the above settings. Options defined here will
// override anything set on the command line.
service.Init()

// Register handler
proto.RegisterGreeterHandler(service.Server(), new(Greeter))

// Run the server
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
```

### Init server
`go-micro/examples/server/main.go`:
### Run service
```
go run examples/service/main.go --logtostderr
I0102 00:22:26.413467 12018 rpc_server.go:297] Listening on [::]:62492
I0102 00:22:26.413803 12018 http_broker.go:115] Broker Listening on [::]:62493
I0102 00:22:26.414009 12018 rpc_server.go:212] Registering node: greeter-e6b2fc6f-b0e6-11e5-a42f-68a86d0d36b6
```

### Define a client

`client.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"
"fmt"

micro "github.com/micro/go-micro"
proto "github.com/micro/go-micro/examples/service/proto"
"golang.org/x/net/context"
)

func main() {
// optionally setup command line usage
cmd.Init()

// Initialise Server
server.Init(
server.Name("go.micro.srv.example"),
)
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(micro.Name("greeter.client"))

// Register Handlers
server.Handle(
server.NewHandler(
new(handler.Example),
),
)
// Create new greeter client
greeter := proto.NewGreeterClient("greeter", service.Client())

// Run server
if err := server.Run(); err != nil {
log.Fatal(err)
// Call the greeter
rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
if err != nil {
fmt.Println(err)
}

// Print response
fmt.Println(rsp.Greeting)
}
```

### 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
### Run the client

```shell
go run client.go
Hello John
```
111 changes: 89 additions & 22 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ var (
cli.StringFlag{
Name: "server_address",
EnvVar: "MICRO_SERVER_ADDRESS",
Value: ":0",
Usage: "Bind address for the server. 127.0.0.1:8080",
},
cli.StringFlag{
Expand All @@ -74,7 +73,6 @@ var (
cli.StringFlag{
Name: "broker",
EnvVar: "MICRO_BROKER",
Value: "http",
Usage: "Broker for pub/sub. http, nats, rabbitmq",
},
cli.StringFlag{
Expand All @@ -85,7 +83,6 @@ var (
cli.StringFlag{
Name: "registry",
EnvVar: "MICRO_REGISTRY",
Value: "consul",
Usage: "Registry for discovery. memory, consul, etcd, kubernetes",
},
cli.StringFlag{
Expand All @@ -96,13 +93,11 @@ var (
cli.StringFlag{
Name: "selector",
EnvVar: "MICRO_SELECTOR",
Value: "selector",
Usage: "Selector used to pick nodes for querying. random, roundrobin, blacklist",
},
cli.StringFlag{
Name: "transport",
EnvVar: "MICRO_TRANSPORT",
Value: "http",
Usage: "Transport mechanism used; http, rabbitmq, nats",
},
cli.StringFlag{
Expand Down Expand Up @@ -170,6 +165,13 @@ func init() {

func newCmd(opts ...Option) Cmd {
options := Options{
Broker: &broker.DefaultBroker,
Client: &client.DefaultClient,
Registry: &registry.DefaultRegistry,
Server: &server.DefaultServer,
Selector: &selector.DefaultSelector,
Transport: &transport.DefaultTransport,

Brokers: DefaultBrokers,
Registries: DefaultRegistries,
Selectors: DefaultSelectors,
Expand Down Expand Up @@ -221,22 +223,63 @@ func (c *cmd) Before(ctx *cli.Context) error {
flag.Set("v", ctx.String("v"))
flag.Parse()

if b, ok := c.opts.Brokers[ctx.String("broker")]; ok {
broker.DefaultBroker = b(strings.Split(ctx.String("broker_address"), ","))
// If flags are set then use them otherwise do nothing
var serverOpts []server.Option
var clientOpts []client.Option

// Set the broker
if len(ctx.String("broker")) > 0 {
if b, ok := c.opts.Brokers[ctx.String("broker")]; ok {
n := b(strings.Split(ctx.String("broker_address"), ","))
c.opts.Broker = &n
} else {
return fmt.Errorf("Broker %s not found", ctx.String("broker"))
}

serverOpts = append(serverOpts, server.Broker(*c.opts.Broker))
clientOpts = append(clientOpts, client.Broker(*c.opts.Broker))
}

if r, ok := c.opts.Registries[ctx.String("registry")]; ok {
registry.DefaultRegistry = r(strings.Split(ctx.String("registry_address"), ","))
// Set the registry
if len(ctx.String("registry")) > 0 {
if r, ok := c.opts.Registries[ctx.String("registry")]; ok {
n := r(strings.Split(ctx.String("registry_address"), ","))
c.opts.Registry = &n
} else {
return fmt.Errorf("Registry %s not found", ctx.String("registry"))
}

serverOpts = append(serverOpts, server.Registry(*c.opts.Registry))
clientOpts = append(clientOpts, client.Registry(*c.opts.Registry))
}

if s, ok := c.opts.Selectors[ctx.String("selector")]; ok {
selector.DefaultSelector = s(selector.Registry(registry.DefaultRegistry))
// Set the selector
if len(ctx.String("selector")) > 0 {
if s, ok := c.opts.Selectors[ctx.String("selector")]; ok {
n := s(selector.Registry(*c.opts.Registry))
c.opts.Selector = &n
} else {
return fmt.Errorf("Selector %s not found", ctx.String("selector"))
}

// No server option here. Should there be?
clientOpts = append(clientOpts, client.Selector(*c.opts.Selector))
}

if t, ok := c.opts.Transports[ctx.String("transport")]; ok {
transport.DefaultTransport = t(strings.Split(ctx.String("transport_address"), ","))
// Set the transport
if len(ctx.String("transport")) > 0 {
if t, ok := c.opts.Transports[ctx.String("transport")]; ok {
n := t(strings.Split(ctx.String("transport_address"), ","))
c.opts.Transport = &n
} else {
return fmt.Errorf("Transport %s not found", ctx.String("transport"))
}

serverOpts = append(serverOpts, server.Transport(*c.opts.Transport))
clientOpts = append(clientOpts, client.Transport(*c.opts.Transport))
}

// Parse the server options
metadata := make(map[string]string)
for _, d := range ctx.StringSlice("server_metadata") {
var key, val string
Expand All @@ -248,16 +291,40 @@ func (c *cmd) Before(ctx *cli.Context) error {
metadata[key] = val
}

server.DefaultServer = server.NewServer(
server.Name(ctx.String("server_name")),
server.Version(ctx.String("server_version")),
server.Id(ctx.String("server_id")),
server.Address(ctx.String("server_address")),
server.Advertise(ctx.String("server_advertise")),
server.Metadata(metadata),
)
if len(metadata) > 0 {
serverOpts = append(serverOpts, server.Metadata(metadata))
}

if len(ctx.String("server_name")) > 0 {
serverOpts = append(serverOpts, server.Name(ctx.String("server_name")))
}

client.DefaultClient = client.NewClient()
if len(ctx.String("server_version")) > 0 {
serverOpts = append(serverOpts, server.Version(ctx.String("server_version")))
}

if len(ctx.String("server_id")) > 0 {
serverOpts = append(serverOpts, server.Id(ctx.String("server_id")))
}

if len(ctx.String("server_address")) > 0 {
serverOpts = append(serverOpts, server.Address(ctx.String("server_address")))
}

if len(ctx.String("server_advertise")) > 0 {
serverOpts = append(serverOpts, server.Advertise(ctx.String("server_advertise")))
}

// We have some command line opts for the server.
// Lets set it up
if len(serverOpts) > 0 {
(*c.opts.Server).Init(serverOpts...)
}

// Use an init option?
if len(clientOpts) > 0 {
*c.opts.Client = client.NewClient(clientOpts...)
}

return nil
}
Expand Down
Loading

0 comments on commit 1f1bc27

Please sign in to comment.