Add the ability to switch out client/server
This commit is contained in:
		| @@ -69,7 +69,7 @@ $ go run examples/service/main.go | |||||||
|  |  | ||||||
| ### Test Service | ### Test Service | ||||||
| ``` | ``` | ||||||
| $ go run examples/service/main.go --client | $ go run examples/service/main.go --run_client | ||||||
| Hello John | Hello John | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								cmd/cmd.go
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								cmd/cmd.go
									
									
									
									
									
								
							| @@ -51,6 +51,11 @@ var ( | |||||||
| 	DefaultCmd = newCmd() | 	DefaultCmd = newCmd() | ||||||
|  |  | ||||||
| 	DefaultFlags = []cli.Flag{ | 	DefaultFlags = []cli.Flag{ | ||||||
|  | 		cli.StringFlag{ | ||||||
|  | 			Name:   "client", | ||||||
|  | 			EnvVar: "MICRO_CLIENT", | ||||||
|  | 			Usage:  "Client for go-micro; rpc", | ||||||
|  | 		}, | ||||||
| 		cli.StringFlag{ | 		cli.StringFlag{ | ||||||
| 			Name:   "client_request_timeout", | 			Name:   "client_request_timeout", | ||||||
| 			EnvVar: "MICRO_CLIENT_REQUEST_TIMEOUT", | 			EnvVar: "MICRO_CLIENT_REQUEST_TIMEOUT", | ||||||
| @@ -127,6 +132,11 @@ var ( | |||||||
| 			EnvVar: "MICRO_SELECTOR", | 			EnvVar: "MICRO_SELECTOR", | ||||||
| 			Usage:  "Selector used to pick nodes for querying", | 			Usage:  "Selector used to pick nodes for querying", | ||||||
| 		}, | 		}, | ||||||
|  | 		cli.StringFlag{ | ||||||
|  | 			Name:   "server", | ||||||
|  | 			EnvVar: "MICRO_SERVER", | ||||||
|  | 			Usage:  "Server for go-micro; rpc", | ||||||
|  | 		}, | ||||||
| 		cli.StringFlag{ | 		cli.StringFlag{ | ||||||
| 			Name:   "transport", | 			Name:   "transport", | ||||||
| 			EnvVar: "MICRO_TRANSPORT", | 			EnvVar: "MICRO_TRANSPORT", | ||||||
| @@ -143,6 +153,10 @@ var ( | |||||||
| 		"http": http.NewBroker, | 		"http": http.NewBroker, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	DefaultClients = map[string]func(...client.Option) client.Client{ | ||||||
|  | 		"rpc": client.NewClient, | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	DefaultRegistries = map[string]func(...registry.Option) registry.Registry{ | 	DefaultRegistries = map[string]func(...registry.Option) registry.Registry{ | ||||||
| 		"consul": consul.NewRegistry, | 		"consul": consul.NewRegistry, | ||||||
| 		"mdns":   mdns.NewRegistry, | 		"mdns":   mdns.NewRegistry, | ||||||
| @@ -153,11 +167,17 @@ var ( | |||||||
| 		"cache":   cache.NewSelector, | 		"cache":   cache.NewSelector, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	DefaultServers = map[string]func(...server.Option) server.Server{ | ||||||
|  | 		"rpc": server.NewServer, | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	DefaultTransports = map[string]func(...transport.Option) transport.Transport{ | 	DefaultTransports = map[string]func(...transport.Option) transport.Transport{ | ||||||
| 		"http": thttp.NewTransport, | 		"http": thttp.NewTransport, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// used for default selection as the fall back | 	// used for default selection as the fall back | ||||||
|  | 	defaultClient    = "rpc" | ||||||
|  | 	defaultServer    = "rpc" | ||||||
| 	defaultBroker    = "http" | 	defaultBroker    = "http" | ||||||
| 	defaultRegistry  = "consul" | 	defaultRegistry  = "consul" | ||||||
| 	defaultSelector  = "default" | 	defaultSelector  = "default" | ||||||
| @@ -183,8 +203,10 @@ func newCmd(opts ...Option) Cmd { | |||||||
| 		Transport: &transport.DefaultTransport, | 		Transport: &transport.DefaultTransport, | ||||||
|  |  | ||||||
| 		Brokers:    DefaultBrokers, | 		Brokers:    DefaultBrokers, | ||||||
|  | 		Clients:    DefaultClients, | ||||||
| 		Registries: DefaultRegistries, | 		Registries: DefaultRegistries, | ||||||
| 		Selectors:  DefaultSelectors, | 		Selectors:  DefaultSelectors, | ||||||
|  | 		Servers:    DefaultServers, | ||||||
| 		Transports: DefaultTransports, | 		Transports: DefaultTransports, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -226,6 +248,20 @@ func (c *cmd) Before(ctx *cli.Context) error { | |||||||
| 	var serverOpts []server.Option | 	var serverOpts []server.Option | ||||||
| 	var clientOpts []client.Option | 	var clientOpts []client.Option | ||||||
|  |  | ||||||
|  | 	// Set the client | ||||||
|  | 	if name := ctx.String("client"); len(name) > 0 { | ||||||
|  | 		if cl, ok := c.opts.Clients[name]; ok { | ||||||
|  | 			*c.opts.Client = cl() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Set the server | ||||||
|  | 	if name := ctx.String("server"); len(name) > 0 { | ||||||
|  | 		if s, ok := c.opts.Servers[name]; ok { | ||||||
|  | 			*c.opts.Server = s() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// Set the broker | 	// Set the broker | ||||||
| 	if name := ctx.String("broker"); len(name) > 0 || len(ctx.String("broker_address")) > 0 { | 	if name := ctx.String("broker"); len(name) > 0 || len(ctx.String("broker_address")) > 0 { | ||||||
| 		if len(name) == 0 { | 		if len(name) == 0 { | ||||||
| @@ -241,7 +277,6 @@ func (c *cmd) Before(ctx *cli.Context) error { | |||||||
|  |  | ||||||
| 		serverOpts = append(serverOpts, server.Broker(*c.opts.Broker)) | 		serverOpts = append(serverOpts, server.Broker(*c.opts.Broker)) | ||||||
| 		clientOpts = append(clientOpts, client.Broker(*c.opts.Broker)) | 		clientOpts = append(clientOpts, client.Broker(*c.opts.Broker)) | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Set the registry | 	// Set the registry | ||||||
|   | |||||||
| @@ -26,8 +26,10 @@ type Options struct { | |||||||
| 	Server    *server.Server | 	Server    *server.Server | ||||||
|  |  | ||||||
| 	Brokers    map[string]func(...broker.Option) broker.Broker | 	Brokers    map[string]func(...broker.Option) broker.Broker | ||||||
|  | 	Clients    map[string]func(...client.Option) client.Client | ||||||
| 	Registries map[string]func(...registry.Option) registry.Registry | 	Registries map[string]func(...registry.Option) registry.Registry | ||||||
| 	Selectors  map[string]func(...selector.Option) selector.Selector | 	Selectors  map[string]func(...selector.Option) selector.Selector | ||||||
|  | 	Servers    map[string]func(...server.Option) server.Server | ||||||
| 	Transports map[string]func(...transport.Option) transport.Transport | 	Transports map[string]func(...transport.Option) transport.Transport | ||||||
|  |  | ||||||
| 	// Other options for implementations of the interface | 	// Other options for implementations of the interface | ||||||
| @@ -99,6 +101,13 @@ func NewBroker(name string, b func(...broker.Option) broker.Broker) Option { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // New client func | ||||||
|  | func NewClient(name string, b func(...client.Option) client.Client) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Clients[name] = b | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // New registry func | // New registry func | ||||||
| func NewRegistry(name string, r func(...registry.Option) registry.Registry) Option { | func NewRegistry(name string, r func(...registry.Option) registry.Registry) Option { | ||||||
| 	return func(o *Options) { | 	return func(o *Options) { | ||||||
| @@ -113,6 +122,13 @@ func NewSelector(name string, s func(...selector.Option) selector.Selector) Opti | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // New server func | ||||||
|  | func NewServer(name string, s func(...server.Option) server.Server) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Servers[name] = s | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // New transport func | // New transport func | ||||||
| func NewTransport(name string, t func(...transport.Option) transport.Transport) Option { | func NewTransport(name string, t func(...transport.Option) transport.Transport) Option { | ||||||
| 	return func(o *Options) { | 	return func(o *Options) { | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ $GOPATH/bin/service | |||||||
| 3. Run the client | 3. Run the client | ||||||
|  |  | ||||||
| ```shell | ```shell | ||||||
| $GOPATH/bin/service --client | $GOPATH/bin/service --run_client | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| And that's all there is to it. | And that's all there is to it. | ||||||
|   | |||||||
| @@ -48,12 +48,12 @@ func main() { | |||||||
| 			"type": "helloworld", | 			"type": "helloworld", | ||||||
| 		}), | 		}), | ||||||
|  |  | ||||||
| 		// Setup some flags. Specify --client to run the client | 		// Setup some flags. Specify --run_client to run the client | ||||||
|  |  | ||||||
| 		// Add runtime flags | 		// Add runtime flags | ||||||
| 		// We could do this below too | 		// We could do this below too | ||||||
| 		micro.Flags(cli.BoolFlag{ | 		micro.Flags(cli.BoolFlag{ | ||||||
| 			Name:  "client", | 			Name:  "run_client", | ||||||
| 			Usage: "Launch the client", | 			Usage: "Launch the client", | ||||||
| 		}), | 		}), | ||||||
| 	) | 	) | ||||||
| @@ -65,7 +65,7 @@ func main() { | |||||||
| 		// Add runtime action | 		// Add runtime action | ||||||
| 		// We could actually do this above | 		// We could actually do this above | ||||||
| 		micro.Action(func(c *cli.Context) { | 		micro.Action(func(c *cli.Context) { | ||||||
| 			if c.Bool("client") { | 			if c.Bool("run_client") { | ||||||
| 				runClient(service) | 				runClient(service) | ||||||
| 				os.Exit(0) | 				os.Exit(0) | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -78,12 +78,12 @@ func main() { | |||||||
| 			"type": "helloworld", | 			"type": "helloworld", | ||||||
| 		}), | 		}), | ||||||
|  |  | ||||||
| 		// Setup some flags. Specify --client to run the client | 		// Setup some flags. Specify --run_client to run the client | ||||||
|  |  | ||||||
| 		// Add runtime flags | 		// Add runtime flags | ||||||
| 		// We could do this below too | 		// We could do this below too | ||||||
| 		micro.Flags(cli.BoolFlag{ | 		micro.Flags(cli.BoolFlag{ | ||||||
| 			Name:  "client", | 			Name:  "run_client", | ||||||
| 			Usage: "Launch the client", | 			Usage: "Launch the client", | ||||||
| 		}), | 		}), | ||||||
| 	) | 	) | ||||||
| @@ -95,7 +95,7 @@ func main() { | |||||||
| 		// Add runtime action | 		// Add runtime action | ||||||
| 		// We could actually do this above | 		// We could actually do this above | ||||||
| 		micro.Action(func(c *cli.Context) { | 		micro.Action(func(c *cli.Context) { | ||||||
| 			if c.Bool("client") { | 			if c.Bool("run_client") { | ||||||
| 				runClient(service) | 				runClient(service) | ||||||
| 				os.Exit(0) | 				os.Exit(0) | ||||||
| 			} | 			} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user