1
0
mirror of https://github.com/go-micro/go-micro.git synced 2024-11-30 08:06:40 +02:00
go-micro/network/network.go

109 lines
2.4 KiB
Go
Raw Normal View History

2019-06-18 12:56:11 +02:00
// Package network is a package for defining a network overlay
2019-06-17 17:57:53 +02:00
package network
import (
"github.com/micro/go-micro/config/options"
2019-07-01 12:55:15 +02:00
"github.com/micro/go-micro/network/proxy"
"github.com/micro/go-micro/network/proxy/mucp"
"github.com/micro/go-micro/network/resolver"
"github.com/micro/go-micro/network/resolver/registry"
"github.com/micro/go-micro/network/router"
2019-06-17 17:57:53 +02:00
)
2019-07-01 23:41:27 +02:00
// Network defines a network interface. The network is a single
// shared network between all nodes connected to it. The network
// is responsible for routing messages to the correct services.
2019-06-17 17:57:53 +02:00
type Network interface {
options.Options
2019-07-01 23:41:27 +02:00
// Id of the network
2019-06-22 17:51:20 +02:00
Id() string
// Connect to the network
Connect() (Node, error)
// Peer with a neighboring network
Peer(Network) (Link, error)
2019-06-17 17:57:53 +02:00
}
2019-06-22 17:51:20 +02:00
// Node represents a single node on a network
2019-06-17 17:57:53 +02:00
type Node interface {
2019-07-01 12:55:15 +02:00
// Id of the node
Id() string
2019-06-22 20:02:57 +02:00
// Address of the node
Address() string
2019-07-01 12:55:15 +02:00
// The network of the node
2019-07-01 23:41:27 +02:00
Network() string
2019-06-22 20:02:57 +02:00
// Close the network connection
Close() error
// Accept messages on the network
Accept() (*Message, error)
// Send a message to the network
Send(*Message) error
2019-06-17 17:57:53 +02:00
}
2019-06-22 17:51:20 +02:00
// Link is a connection between one network and another
2019-06-18 12:56:11 +02:00
type Link interface {
2019-07-01 23:54:26 +02:00
// remote node the link is peered with
2019-06-18 12:56:11 +02:00
Node
2019-07-01 12:55:15 +02:00
// length defines the speed or distance of the link
2019-06-18 12:56:11 +02:00
Length() int
2019-07-01 12:55:15 +02:00
// weight defines the saturation or usage of the link
2019-06-18 12:56:11 +02:00
Weight() int
2019-06-17 17:57:53 +02:00
}
2019-06-17 19:25:42 +02:00
2019-06-18 12:56:11 +02:00
// Message is the base type for opaque data
2019-06-22 17:51:20 +02:00
type Message struct {
// Headers which provide local/remote info
Header map[string]string
// The opaque data being sent
2019-07-01 12:55:15 +02:00
Body []byte
2019-06-22 17:51:20 +02:00
}
2019-06-18 12:56:11 +02:00
2019-06-17 19:25:42 +02:00
var (
// The default network ID is local
2019-07-01 12:55:15 +02:00
DefaultId = "local"
// just the standard network element
DefaultNetwork = NewNetwork()
2019-06-17 19:25:42 +02:00
)
2019-07-01 12:55:15 +02:00
// NewNetwork returns a new network interface
func NewNetwork(opts ...options.Option) Network {
options := options.NewOptions(opts...)
2019-07-01 12:55:15 +02:00
// new network instance
net := &network{
id: DefaultId,
}
// get network id
id, ok := options.Values().Get("network.id")
if ok {
net.id = id.(string)
}
// get router
2019-07-01 12:55:15 +02:00
r, ok := options.Values().Get("network.router")
if ok {
net.router = r.(router.Router)
} else {
net.router = router.DefaultRouter
}
// get proxy
2019-07-01 12:55:15 +02:00
p, ok := options.Values().Get("network.proxy")
if ok {
net.proxy = p.(proxy.Proxy)
} else {
net.proxy = new(mucp.Proxy)
}
2019-07-01 12:55:15 +02:00
// get resolver
res, ok := options.Values().Get("network.resolver")
if ok {
net.resolver = res.(resolver.Resolver)
} else {
net.resolver = new(registry.Resolver)
}
2019-07-01 12:55:15 +02:00
return net
}