Change initialisation and add metadata

This commit is contained in:
Asim
2015-05-26 22:39:48 +01:00
parent 7aa2c82ced
commit 36b5ca46fe
16 changed files with 182 additions and 93 deletions

55
server/options.go Normal file
View File

@@ -0,0 +1,55 @@
package server
import (
"github.com/myodc/go-micro/transport"
)
type options struct {
transport transport.Transport
metadata map[string]string
name string
address string
id string
}
func newOptions(opt ...Option) options {
var opts options
for _, o := range opt {
o(&opts)
}
if opts.transport == nil {
opts.transport = transport.DefaultTransport
}
if len(opts.address) == 0 {
opts.address = DefaultAddress
}
if len(opts.name) == 0 {
opts.name = DefaultName
}
if len(opts.id) == 0 {
opts.id = DefaultId
}
return opts
}
func (o options) Name() string {
return o.name
}
func (o options) Id() string {
return o.name + "-" + o.id
}
func (o options) Address() string {
return o.address
}
func (o options) Metadata() map[string]string {
return o.metadata
}

View File

@@ -2,7 +2,6 @@ package server
import (
"bytes"
"sync"
c "github.com/myodc/go-micro/context"
"github.com/myodc/go-micro/transport"
@@ -16,29 +15,16 @@ import (
)
type rpcServer struct {
mtx sync.RWMutex
address string
opts options
rpc *rpc.Server
exit chan chan error
opts options
rpc *rpc.Server
exit chan chan error
}
func newRpcServer(address string, opt ...Option) Server {
var opts options
for _, o := range opt {
o(&opts)
}
if opts.transport == nil {
opts.transport = transport.DefaultTransport
}
func newRpcServer(opts ...Option) Server {
return &rpcServer{
opts: opts,
address: address,
rpc: rpc.NewServer(),
exit: make(chan chan error),
opts: newOptions(opts...),
rpc: rpc.NewServer(),
exit: make(chan chan error),
}
}
@@ -72,7 +58,7 @@ func (s *rpcServer) accept(sock transport.Socket) {
ct := msg.Header["Content-Type"]
delete(msg.Header, "Content-Type")
ctx := c.WithMetaData(context.Background(), msg.Header)
ctx := c.WithMetadata(context.Background(), msg.Header)
if err := s.rpc.ServeRequestWithContext(ctx, cc); err != nil {
return
@@ -86,15 +72,17 @@ func (s *rpcServer) accept(sock transport.Socket) {
})
}
func (s *rpcServer) Address() string {
s.mtx.RLock()
address := s.address
s.mtx.RUnlock()
return address
func (s *rpcServer) Config() options {
return s.opts
}
func (s *rpcServer) Init() error {
return nil
func (s *rpcServer) Init(opts ...Option) {
for _, opt := range opts {
opt(&s.opts)
}
if len(s.opts.id) == 0 {
s.opts.id = s.opts.name + "-" + DefaultId
}
}
func (s *rpcServer) NewReceiver(handler interface{}) Receiver {
@@ -118,16 +106,14 @@ func (s *rpcServer) Register(r Receiver) error {
func (s *rpcServer) Start() error {
registerHealthChecker(s)
ts, err := s.opts.transport.Listen(s.address)
ts, err := s.opts.transport.Listen(s.opts.address)
if err != nil {
return err
}
log.Infof("Listening on %s", ts.Addr())
s.mtx.RLock()
s.address = ts.Addr()
s.mtx.RUnlock()
s.opts.address = ts.Addr()
go ts.Accept(s.accept)

View File

@@ -14,8 +14,8 @@ import (
)
type Server interface {
Address() string
Init() error
Config() options
Init(...Option)
NewReceiver(interface{}) Receiver
NewNamedReceiver(string, interface{}) Receiver
Register(Receiver) error
@@ -23,45 +23,58 @@ type Server interface {
Stop() error
}
type options struct {
transport transport.Transport
}
type Option func(*options)
var (
Address string
Name string
Id string
DefaultServer Server
DefaultAddress = ":0"
DefaultName = "go-server"
DefaultId = uuid.NewUUID().String()
DefaultServer Server = newRpcServer()
)
func Name(n string) Option {
return func(o *options) {
o.name = n
}
}
func Id(id string) Option {
return func(o *options) {
o.id = id
}
}
func Address(a string) Option {
return func(o *options) {
o.address = a
}
}
func Transport(t transport.Transport) Option {
return func(o *options) {
o.transport = t
}
}
func Init() error {
defer log.Flush()
if len(Name) == 0 {
Name = "go-server"
func Metadata(md map[string]string) Option {
return func(o *options) {
o.metadata = md
}
if len(Id) == 0 {
Id = Name + "-" + uuid.NewUUID().String()
}
if DefaultServer == nil {
DefaultServer = newRpcServer(Address)
}
return DefaultServer.Init()
}
func NewServer(address string, opt ...Option) Server {
return newRpcServer(address, opt...)
func Config() options {
return DefaultServer.Config()
}
func Init(opt ...Option) {
if DefaultServer == nil {
DefaultServer = newRpcServer(opt...)
}
DefaultServer.Init(opt...)
}
func NewServer(opt ...Option) Server {
return newRpcServer(opt...)
}
func NewReceiver(handler interface{}) Receiver {
@@ -82,9 +95,10 @@ func Run() error {
}
// parse address for host, port
config := DefaultServer.Config()
var host string
var port int
parts := strings.Split(DefaultServer.Address(), ":")
parts := strings.Split(config.Address(), ":")
if len(parts) > 1 {
host = strings.Join(parts[:len(parts)-1], ":")
port, _ = strconv.Atoi(parts[len(parts)-1])
@@ -94,13 +108,14 @@ func Run() error {
// register service
node := &registry.Node{
Id: Id,
Address: host,
Port: port,
Id: config.Id(),
Address: host,
Port: port,
Metadata: config.Metadata(),
}
service := &registry.Service{
Name: Name,
Name: config.Name(),
Nodes: []*registry.Node{node},
}
@@ -122,7 +137,8 @@ func Run() error {
}
func Start() error {
log.Infof("Starting server %s id %s", Name, Id)
config := DefaultServer.Config()
log.Infof("Starting server %s id %s", config.Name(), config.Id())
return DefaultServer.Start()
}