Merge pull request #1614 from micro/runtime-clients

Runtime Options: Replace client.DefaultClient
This commit is contained in:
ben-toogood 2020-05-11 20:05:00 +01:00 committed by GitHub
commit 6078adb8bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 98 additions and 40 deletions

View File

@ -3,7 +3,6 @@ package vpath
import ( import (
"errors" "errors"
"fmt"
"net/http" "net/http"
"regexp" "regexp"
"strings" "strings"
@ -28,8 +27,6 @@ func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) {
return nil, errors.New("unknown name") return nil, errors.New("unknown name")
} }
fmt.Println(req.URL.Path)
parts := strings.Split(req.URL.Path[1:], "/") parts := strings.Split(req.URL.Path[1:], "/")
if len(parts) == 1 { if len(parts) == 1 {
return &resolver.Endpoint{ return &resolver.Endpoint{

View File

@ -4,6 +4,7 @@ import (
"time" "time"
"github.com/micro/go-micro/v2/auth/provider" "github.com/micro/go-micro/v2/auth/provider"
"github.com/micro/go-micro/v2/client"
"github.com/micro/go-micro/v2/store" "github.com/micro/go-micro/v2/store"
) )
@ -12,10 +13,12 @@ func NewOptions(opts ...Option) Options {
for _, o := range opts { for _, o := range opts {
o(&options) o(&options)
} }
if len(options.Namespace) == 0 { if len(options.Namespace) == 0 {
options.Namespace = DefaultNamespace options.Namespace = DefaultNamespace
} }
if options.Client == nil {
options.Client = client.DefaultClient
}
return options return options
} }
@ -39,6 +42,8 @@ type Options struct {
LoginURL string LoginURL string
// Store to back auth // Store to back auth
Store store.Store Store store.Store
// Client to use for RPC
Client client.Client
} }
type Option func(o *Options) type Option func(o *Options)
@ -100,6 +105,13 @@ func LoginURL(url string) Option {
} }
} }
// WithClient sets the client to use when making requests
func WithClient(c client.Client) Option {
return func(o *Options) {
o.Client = c
}
}
type GenerateOptions struct { type GenerateOptions struct {
// Metadata associated with the account // Metadata associated with the account
Metadata map[string]string Metadata map[string]string

View File

@ -42,9 +42,11 @@ func (s *svc) Init(opts ...auth.Option) {
o(&s.options) o(&s.options)
} }
dc := client.DefaultClient if s.options.Client == nil {
s.auth = pb.NewAuthService("go.micro.auth", dc) s.options.Client = client.DefaultClient
s.rule = pb.NewRulesService("go.micro.auth", dc) }
s.auth = pb.NewAuthService("go.micro.auth", s.options.Client)
s.rule = pb.NewRulesService("go.micro.auth", s.options.Client)
// if we have a JWT public key passed as an option, // if we have a JWT public key passed as an option,
// we can decode tokens with the type "JWT" locally // we can decode tokens with the type "JWT" locally

View File

@ -4,7 +4,6 @@ import (
"context" "context"
"time" "time"
"github.com/micro/go-micro/v2/auth"
"github.com/micro/go-micro/v2/broker" "github.com/micro/go-micro/v2/broker"
"github.com/micro/go-micro/v2/client/selector" "github.com/micro/go-micro/v2/client/selector"
"github.com/micro/go-micro/v2/codec" "github.com/micro/go-micro/v2/codec"
@ -17,7 +16,6 @@ type Options struct {
ContentType string ContentType string
// Plugged interfaces // Plugged interfaces
Auth auth.Auth
Broker broker.Broker Broker broker.Broker
Codecs map[string]codec.NewCodec Codecs map[string]codec.NewCodec
Registry registry.Registry Registry registry.Registry
@ -105,7 +103,6 @@ func NewOptions(options ...Option) Options {
}, },
PoolSize: DefaultPoolSize, PoolSize: DefaultPoolSize,
PoolTTL: DefaultPoolTTL, PoolTTL: DefaultPoolTTL,
Auth: auth.DefaultAuth,
Broker: broker.DefaultBroker, Broker: broker.DefaultBroker,
Selector: selector.DefaultSelector, Selector: selector.DefaultSelector,
Registry: registry.DefaultRegistry, Registry: registry.DefaultRegistry,
@ -126,13 +123,6 @@ func Broker(b broker.Broker) Option {
} }
} }
// Auth to be used when making a request
func Auth(a auth.Auth) Option {
return func(o *Options) {
o.Auth = a
}
}
// Codec to be used to encode/decode requests for a given content type // Codec to be used to encode/decode requests for a given content type
func Codec(contentType string, c codec.NewCodec) Option { func Codec(contentType string, c codec.NewCodec) Option {
return func(o *Options) { return func(o *Options) {

View File

@ -13,6 +13,7 @@ import (
"github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/client"
"github.com/micro/go-micro/v2/client/selector" "github.com/micro/go-micro/v2/client/selector"
"github.com/micro/go-micro/v2/config" "github.com/micro/go-micro/v2/config"
configSrc "github.com/micro/go-micro/v2/config/source"
configSrv "github.com/micro/go-micro/v2/config/source/service" configSrv "github.com/micro/go-micro/v2/config/source/service"
"github.com/micro/go-micro/v2/debug/profile" "github.com/micro/go-micro/v2/debug/profile"
"github.com/micro/go-micro/v2/debug/profile/http" "github.com/micro/go-micro/v2/debug/profile/http"
@ -500,7 +501,6 @@ func (c *cmd) Before(ctx *cli.Context) error {
} }
*c.opts.Auth = a() *c.opts.Auth = a()
clientOpts = append(clientOpts, client.Auth(*c.opts.Auth))
serverOpts = append(serverOpts, server.Auth(*c.opts.Auth)) serverOpts = append(serverOpts, server.Auth(*c.opts.Auth))
} }
@ -716,7 +716,7 @@ func (c *cmd) Before(ctx *cli.Context) error {
(*c.opts.Auth).Init(authOpts...) (*c.opts.Auth).Init(authOpts...)
if ctx.String("config") == "service" { if ctx.String("config") == "service" {
opt := config.WithSource(configSrv.NewSource()) opt := config.WithSource(configSrv.NewSource(configSrc.WithClient(*c.opts.Client)))
if err := (*c.opts.Config).Init(opt); err != nil { if err := (*c.opts.Config).Init(opt); err != nil {
logger.Fatalf("Error configuring config: %v", err) logger.Fatalf("Error configuring config: %v", err)
} }

View File

@ -100,6 +100,12 @@ func Registry(r *registry.Registry) Option {
} }
} }
func Runtime(r *runtime.Runtime) Option {
return func(o *Options) {
o.Runtime = r
}
}
func Transport(t *transport.Transport) Option { func Transport(t *transport.Transport) Option {
return func(o *Options) { return func(o *Options) {
o.Transport = t o.Transport = t

View File

@ -3,6 +3,7 @@ package source
import ( import (
"context" "context"
"github.com/micro/go-micro/v2/client"
"github.com/micro/go-micro/v2/config/encoder" "github.com/micro/go-micro/v2/config/encoder"
"github.com/micro/go-micro/v2/config/encoder/json" "github.com/micro/go-micro/v2/config/encoder/json"
) )
@ -13,6 +14,9 @@ type Options struct {
// for alternative data // for alternative data
Context context.Context Context context.Context
// Client to use for RPC
Client client.Client
} }
type Option func(o *Options) type Option func(o *Options)
@ -21,6 +25,7 @@ func NewOptions(opts ...Option) Options {
options := Options{ options := Options{
Encoder: json.NewEncoder(), Encoder: json.NewEncoder(),
Context: context.Background(), Context: context.Background(),
Client: client.DefaultClient,
} }
for _, o := range opts { for _, o := range opts {
@ -36,3 +41,10 @@ func WithEncoder(e encoder.Encoder) Option {
o.Encoder = e o.Encoder = e
} }
} }
// WithClient sets the source client
func WithClient(c client.Client) Option {
return func(o *Options) {
o.Client = c
}
}

View File

@ -24,7 +24,7 @@ type service struct {
} }
func (m *service) Read() (set *source.ChangeSet, err error) { func (m *service) Read() (set *source.ChangeSet, err error) {
client := proto.NewConfigService(m.serviceName, client.DefaultClient) client := proto.NewConfigService(m.serviceName, m.opts.Client)
req, err := client.Read(context.Background(), &proto.ReadRequest{ req, err := client.Read(context.Background(), &proto.ReadRequest{
Namespace: m.namespace, Namespace: m.namespace,
Path: m.path, Path: m.path,
@ -37,7 +37,7 @@ func (m *service) Read() (set *source.ChangeSet, err error) {
} }
func (m *service) Watch() (w source.Watcher, err error) { func (m *service) Watch() (w source.Watcher, err error) {
client := proto.NewConfigService(m.serviceName, client.DefaultClient) client := proto.NewConfigService(m.serviceName, m.opts.Client)
stream, err := client.Watch(context.Background(), &proto.WatchRequest{ stream, err := client.Watch(context.Background(), &proto.WatchRequest{
Namespace: m.namespace, Namespace: m.namespace,
Path: m.path, Path: m.path,
@ -87,6 +87,10 @@ func NewSource(opts ...source.Option) source.Source {
} }
} }
if options.Client == nil {
options.Client = client.DefaultClient
}
s := &service{ s := &service{
serviceName: addr, serviceName: addr,
opts: options, opts: options,

View File

@ -14,6 +14,7 @@ import (
"github.com/micro/go-micro/v2/debug/profile" "github.com/micro/go-micro/v2/debug/profile"
"github.com/micro/go-micro/v2/debug/trace" "github.com/micro/go-micro/v2/debug/trace"
"github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/registry"
"github.com/micro/go-micro/v2/runtime"
"github.com/micro/go-micro/v2/server" "github.com/micro/go-micro/v2/server"
"github.com/micro/go-micro/v2/store" "github.com/micro/go-micro/v2/store"
"github.com/micro/go-micro/v2/transport" "github.com/micro/go-micro/v2/transport"
@ -29,6 +30,7 @@ type Options struct {
Server server.Server Server server.Server
Store store.Store Store store.Store
Registry registry.Registry Registry registry.Registry
Runtime runtime.Runtime
Transport transport.Transport Transport transport.Transport
Profile profile.Profile Profile profile.Profile
@ -55,6 +57,7 @@ func newOptions(opts ...Option) Options {
Server: server.DefaultServer, Server: server.DefaultServer,
Store: store.DefaultStore, Store: store.DefaultStore,
Registry: registry.DefaultRegistry, Registry: registry.DefaultRegistry,
Runtime: runtime.DefaultRuntime,
Transport: transport.DefaultTransport, Transport: transport.DefaultTransport,
Context: context.Background(), Context: context.Background(),
Signal: true, Signal: true,
@ -152,7 +155,6 @@ func Tracer(t trace.Tracer) Option {
func Auth(a auth.Auth) Option { func Auth(a auth.Auth) Option {
return func(o *Options) { return func(o *Options) {
o.Auth = a o.Auth = a
o.Client.Init(client.Auth(a))
o.Server.Init(server.Auth(a)) o.Server.Init(server.Auth(a))
} }
} }
@ -182,6 +184,13 @@ func Transport(t transport.Transport) Option {
} }
} }
// Runtime sets the runtime
func Runtime(r runtime.Runtime) Option {
return func(o *Options) {
o.Runtime = r
}
}
// Convenience options // Convenience options
// Address sets the address of the server // Address sets the address of the server

View File

@ -3,6 +3,8 @@ package runtime
import ( import (
"context" "context"
"io" "io"
"github.com/micro/go-micro/v2/client"
) )
type Option func(o *Options) type Option func(o *Options)
@ -17,6 +19,8 @@ type Options struct {
Source string Source string
// Base image to use // Base image to use
Image string Image string
// Client to use when making requests
Client client.Client
} }
// WithSource sets the base image / repository // WithSource sets the base image / repository
@ -47,6 +51,13 @@ func WithImage(t string) Option {
} }
} }
// WithClient sets the client to use
func WithClient(c client.Client) Option {
return func(o *Options) {
o.Client = c
}
}
type CreateOption func(o *CreateOptions) type CreateOption func(o *CreateOptions)
type ReadOption func(o *ReadOptions) type ReadOption func(o *ReadOptions)

View File

@ -24,6 +24,9 @@ func (s *svc) Init(opts ...runtime.Option) error {
o(&s.options) o(&s.options)
} }
// reset the runtime as the client could have changed
s.runtime = pb.NewRuntimeService(runtime.DefaultName, s.options.Client)
return nil return nil
} }
@ -278,19 +281,17 @@ func (s *svc) String() string {
// NewRuntime creates new service runtime and returns it // NewRuntime creates new service runtime and returns it
func NewRuntime(opts ...runtime.Option) runtime.Runtime { func NewRuntime(opts ...runtime.Option) runtime.Runtime {
// get default options var options runtime.Options
options := runtime.Options{}
// apply requested options
for _, o := range opts { for _, o := range opts {
o(&options) o(&options)
} }
if options.Client == nil {
// create default client options.Client = client.DefaultClient
cli := client.DefaultClient }
return &svc{ return &svc{
options: options, options: options,
runtime: pb.NewRuntimeService(runtime.DefaultName, cli), runtime: pb.NewRuntimeService(runtime.DefaultName, options.Client),
} }
} }

View File

@ -3,7 +3,7 @@ package micro
import ( import (
"os" "os"
"os/signal" "os/signal"
"runtime" rtime "runtime"
"strings" "strings"
"sync" "sync"
@ -15,6 +15,7 @@ import (
"github.com/micro/go-micro/v2/debug/trace" "github.com/micro/go-micro/v2/debug/trace"
"github.com/micro/go-micro/v2/logger" "github.com/micro/go-micro/v2/logger"
"github.com/micro/go-micro/v2/plugin" "github.com/micro/go-micro/v2/plugin"
"github.com/micro/go-micro/v2/runtime"
"github.com/micro/go-micro/v2/server" "github.com/micro/go-micro/v2/server"
"github.com/micro/go-micro/v2/store" "github.com/micro/go-micro/v2/store"
signalutil "github.com/micro/go-micro/v2/util/signal" signalutil "github.com/micro/go-micro/v2/util/signal"
@ -98,6 +99,7 @@ func (s *service) Init(opts ...Option) {
cmd.Auth(&s.opts.Auth), cmd.Auth(&s.opts.Auth),
cmd.Broker(&s.opts.Broker), cmd.Broker(&s.opts.Broker),
cmd.Registry(&s.opts.Registry), cmd.Registry(&s.opts.Registry),
cmd.Runtime(&s.opts.Runtime),
cmd.Transport(&s.opts.Transport), cmd.Transport(&s.opts.Transport),
cmd.Client(&s.opts.Client), cmd.Client(&s.opts.Client),
cmd.Config(&s.opts.Config), cmd.Config(&s.opts.Config),
@ -112,13 +114,10 @@ func (s *service) Init(opts ...Option) {
name := s.opts.Cmd.App().Name name := s.opts.Cmd.App().Name
s.opts.Store.Init(store.Table(name)) s.opts.Store.Init(store.Table(name))
// TODO: replace Cmd.Init with config.Load // Set the client for the micro clients
// Right now we're just going to load a token s.opts.Auth.Init(auth.WithClient(s.Client()))
// May need to re-read value on change s.opts.Runtime.Init(runtime.WithClient(s.Client()))
// TODO: should be scoped to micro/auth/token s.opts.Store.Init(store.WithClient(s.Client()))
// if tk, _ := config.Get("token"); len(tk) > 0 {
// s.opts.Auth.Init(auth.ServiceToken(tk))
// }
}) })
} }
@ -192,9 +191,9 @@ func (s *service) Run() error {
// start the profiler // start the profiler
if s.opts.Profile != nil { if s.opts.Profile != nil {
// to view mutex contention // to view mutex contention
runtime.SetMutexProfileFraction(5) rtime.SetMutexProfileFraction(5)
// to view blocking profile // to view blocking profile
runtime.SetBlockProfileRate(1) rtime.SetBlockProfileRate(1)
if err := s.opts.Profile.Start(); err != nil { if err := s.opts.Profile.Start(); err != nil {
return err return err

View File

@ -3,6 +3,8 @@ package store
import ( import (
"context" "context"
"time" "time"
"github.com/micro/go-micro/v2/client"
) )
// Options contains configuration for the Store // Options contains configuration for the Store
@ -17,6 +19,8 @@ type Options struct {
Table string Table string
// Context should contain all implementation specific options, using context.WithValue. // Context should contain all implementation specific options, using context.WithValue.
Context context.Context Context context.Context
// Client to use for RPC
Client client.Client
} }
// Option sets values in Options // Option sets values in Options
@ -52,6 +56,13 @@ func WithContext(c context.Context) Option {
} }
} }
// WithClient sets the stores client to use for RPC
func WithClient(c client.Client) Option {
return func(o *Options) {
o.Client = c
}
}
// ReadOptions configures an individual Read operation // ReadOptions configures an individual Read operation
type ReadOptions struct { type ReadOptions struct {
Database, Table string Database, Table string

View File

@ -219,12 +219,16 @@ func NewStore(opts ...store.Option) store.Store {
o(&options) o(&options)
} }
if options.Client == nil {
options.Client = client.DefaultClient
}
service := &serviceStore{ service := &serviceStore{
options: options, options: options,
Database: options.Database, Database: options.Database,
Table: options.Table, Table: options.Table,
Nodes: options.Nodes, Nodes: options.Nodes,
Client: pb.NewStoreService("go.micro.store", client.DefaultClient), Client: pb.NewStoreService("go.micro.store", options.Client),
} }
return service return service