Implement config singleton (#1268)

* Implement config singleton

* Pass token in grpc request headers

* Refactor BearerScheme

* Fix typo
This commit is contained in:
ben-toogood 2020-02-28 12:58:27 +00:00 committed by GitHub
parent e21ed3a183
commit 962567ef42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 42 deletions

View File

@ -18,6 +18,7 @@ import (
"github.com/micro/go-micro/v2/errors"
"github.com/micro/go-micro/v2/metadata"
"github.com/micro/go-micro/v2/registry"
"github.com/micro/go-micro/v2/util/config"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
@ -25,6 +26,10 @@ import (
gmetadata "google.golang.org/grpc/metadata"
)
var (
BearerScheme = "Bearer "
)
type grpcClient struct {
opts client.Options
pool *pool
@ -128,6 +133,10 @@ func (g *grpcClient) call(ctx context.Context, node *registry.Node, req client.R
header["timeout"] = fmt.Sprintf("%d", opts.RequestTimeout)
// set the content type for the request
header["x-content-type"] = req.ContentType()
// set the authorization token if one is saved locally
if token, err := config.Get("token"); err == nil && len(token) > 0 {
header["authorization"] = BearerScheme + token
}
md := gmetadata.New(header)
ctx = gmetadata.NewOutgoingContext(ctx, md)

View File

@ -9,39 +9,20 @@ import (
conf "github.com/micro/go-micro/v2/config"
"github.com/micro/go-micro/v2/config/source/file"
"github.com/micro/go-micro/v2/util/log"
)
// FileName for global micro config
const FileName = ".micro"
// config is a singleton which is required to ensure
// each function call doesn't load the .micro file
// from disk
var config = newConfig()
// Get a value from the .micro file
func Get(key string) (string, error) {
// get the filepath
fp, err := filePath()
if err != nil {
return "", err
}
// create a new config
c, err := conf.NewConfig(
conf.WithSource(
file.NewSource(
file.WithPath(fp),
),
),
)
if err != nil {
return "", err
}
// load the config
if err := c.Load(); err != nil {
return "", err
}
// set a value
tk := c.Get(key).String("")
tk := config.Get(key).String("")
return strings.TrimSpace(tk), nil
}
@ -53,11 +34,36 @@ func Set(key, value string) error {
return err
}
// set the value
config.Set(value, key)
// write to the file
return ioutil.WriteFile(fp, config.Bytes(), 0644)
}
func filePath() (string, error) {
usr, err := user.Current()
if err != nil {
return "", err
}
return filepath.Join(usr.HomeDir, FileName), nil
}
// newConfig returns a loaded config
func newConfig() conf.Config {
// get the filepath
fp, err := filePath()
if err != nil {
log.Error(err)
return conf.DefaultConfig
}
// write the file if it does not exist
if _, err := os.Stat(fp); os.IsNotExist(err) {
ioutil.WriteFile(fp, []byte{}, 0644)
} else if err != nil {
return err
log.Error(err)
return conf.DefaultConfig
}
// create a new config
@ -69,25 +75,16 @@ func Set(key, value string) error {
),
)
if err != nil {
return err
log.Error(err)
return conf.DefaultConfig
}
// load the config
if err := c.Load(); err != nil {
return err
log.Error(err)
return conf.DefaultConfig
}
// set a value
c.Set(value, key)
// write the file
return ioutil.WriteFile(fp, c.Bytes(), 0644)
}
func filePath() (string, error) {
usr, err := user.Current()
if err != nil {
return "", err
}
return filepath.Join(usr.HomeDir, FileName), nil
// return the conf
return c
}