Change initialisation and add metadata
This commit is contained in:
55
server/options.go
Normal file
55
server/options.go
Normal 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
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 := ®istry.Node{
|
||||
Id: Id,
|
||||
Address: host,
|
||||
Port: port,
|
||||
Id: config.Id(),
|
||||
Address: host,
|
||||
Port: port,
|
||||
Metadata: config.Metadata(),
|
||||
}
|
||||
|
||||
service := ®istry.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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user