1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-08-10 21:52:01 +02:00

Merge pull request #722 from milosgajdos83/net-handler

[WIP] Network handler
This commit is contained in:
Asim Aslam
2019-09-02 17:15:38 +01:00
committed by GitHub
6 changed files with 350 additions and 52 deletions

View File

@@ -33,12 +33,41 @@ type node struct {
id string id string
// address is node address // address is node address
address string address string
// neighbours are node neightbours // neighbours maps the node neighbourhood
neighbours map[string]*node neighbours map[string]*node
// network returns network node is in
network Network
}
// Id is node ide
func (n *node) Id() string {
return n.id
}
// Address returns node address
func (n *node) Address() string {
return n.address
}
// Network returns node network
func (n *node) Network() Network {
return n.network
}
// Neighbourhood returns node neighbourhood
func (n *node) Neighbourhood() []Node {
var nodes []Node
for _, node := range n.neighbours {
nodes = append(nodes, node)
}
return nodes
} }
// network implements Network interface // network implements Network interface
type network struct { type network struct {
// node is network node
*node
// options configure the network // options configure the network
options Options options Options
// rtr is network router // rtr is network router
@@ -52,7 +81,7 @@ type network struct {
// client is network client // client is network client
client client.Client client client.Client
// tunClient is a mao of tunnel clients keyed over channel names // tunClient is a map of tunnel clients keyed over tunnel channel names
tunClient map[string]transport.Client tunClient map[string]transport.Client
sync.RWMutex sync.RWMutex
@@ -60,8 +89,6 @@ type network struct {
connected bool connected bool
// closed closes the network // closed closes the network
closed chan bool closed chan bool
// neighbours maps the node neighbourhood
neighbours map[string]*node
} }
// newNetwork returns a new network node // newNetwork returns a new network node
@@ -106,16 +133,33 @@ func newNetwork(opts ...Option) Network {
), ),
) )
return &network{ network := &network{
options: options, node: &node{
Router: options.Router, id: options.Id,
Proxy: options.Proxy, address: options.Address,
Tunnel: options.Tunnel, neighbours: make(map[string]*node),
server: server, },
client: client, options: options,
tunClient: make(map[string]transport.Client), Router: options.Router,
neighbours: make(map[string]*node), Proxy: options.Proxy,
Tunnel: options.Tunnel,
server: server,
client: client,
tunClient: make(map[string]transport.Client),
} }
network.node.network = network
return network
}
// Options returns network options
func (n *network) Options() Options {
n.Lock()
options := n.options
n.Unlock()
return options
} }
// Name returns network name // Name returns network name
@@ -686,6 +730,46 @@ func (n *network) Connect() error {
return nil return nil
} }
// Nodes returns a list of all network nodes
// NOTE: this is a naive i.e. inefficient BFS implementation
func (n *network) Nodes() []Node {
// map to track visited nodes
visited := make(map[string]*node)
// queue of the nodes to visit
queue := make([]*node, 1)
queue[0] = n.node
// add the root node to the map of the visited nodes
visited[n.node.id] = n.node
for {
// pop a node from the queue
qnode := queue[0]
// pop is done by reslicing of the queue
// https://github.com/golang/go/wiki/SliceTricks
queue = queue[1:]
// iterate through all of its neighbours
// mark the visited nodes; enqueue the non-visted
for id, node := range qnode.neighbours {
if _, ok := visited[id]; !ok {
visited[id] = node
queue = append(queue, node)
}
}
// if no nodes are in the queue break
if len(queue) == 0 {
break
}
}
nodes := make([]Node, 0)
// collecte all the nodes into slice
for _, node := range visited {
nodes = append(nodes, node)
}
return nodes
}
func (n *network) close() error { func (n *network) close() error {
// stop the server // stop the server
if err := n.server.Stop(); err != nil { if err := n.server.Stop(); err != nil {

103
network/handler/handler.go Normal file
View File

@@ -0,0 +1,103 @@
package handler
import (
"context"
"sort"
"github.com/micro/go-micro/errors"
"github.com/micro/go-micro/network"
pbNet "github.com/micro/go-micro/network/proto"
pbRtr "github.com/micro/go-micro/router/proto"
)
// Network implements network handler
type Network struct {
Network network.Network
}
// ListRoutes returns a list of routing table routes
func (n *Network) ListRoutes(ctx context.Context, req *pbRtr.Request, resp *pbRtr.ListResponse) error {
routes, err := n.Network.Options().Router.Table().List()
if err != nil {
return errors.InternalServerError("go.micro.network", "failed to list routes: %s", err)
}
var respRoutes []*pbRtr.Route
for _, route := range routes {
respRoute := &pbRtr.Route{
Service: route.Service,
Address: route.Address,
Gateway: route.Gateway,
Network: route.Network,
Router: route.Router,
Link: route.Link,
Metric: int64(route.Metric),
}
respRoutes = append(respRoutes, respRoute)
}
resp.Routes = respRoutes
return nil
}
// ListNodes returns a list of all accessible nodes in the network
func (n *Network) ListNodes(ctx context.Context, req *pbNet.ListRequest, resp *pbNet.ListResponse) error {
nodes := n.Network.Nodes()
var respNodes []*pbNet.Node
for _, node := range nodes {
respNode := &pbNet.Node{
Id: node.Id(),
Address: node.Address(),
}
respNodes = append(respNodes, respNode)
}
resp.Nodes = respNodes
return nil
}
// Neighbourhood returns a list of immediate neighbours
func (n *Network) Neighbourhood(ctx context.Context, req *pbNet.NeighbourhoodRequest, resp *pbNet.NeighbourhoodResponse) error {
// extract the id of the node to query
id := req.Id
// if no id is passed, we assume local node
if id == "" {
id = n.Network.Id()
}
// get all the nodes in the network
nodes := n.Network.Nodes()
var neighbours []*pbNet.Neighbour
// find a node with a given id
i := sort.Search(len(nodes), func(i int) bool { return nodes[i].Id() == id })
// collect all the nodes in the neighbourhood of the found node
if i < len(nodes) && nodes[i].Id() == id {
for _, neighbour := range nodes[i].Neighbourhood() {
var nodeNeighbours []*pbNet.Node
for _, nodeNeighbour := range neighbour.Neighbourhood() {
nn := &pbNet.Node{
Id: nodeNeighbour.Id(),
Address: nodeNeighbour.Address(),
}
nodeNeighbours = append(nodeNeighbours, nn)
}
// node is present at node[i]
neighbour := &pbNet.Neighbour{
Node: &pbNet.Node{
Id: neighbour.Id(),
Address: neighbour.Address(),
},
Neighbours: nodeNeighbours,
}
neighbours = append(neighbours, neighbour)
}
}
resp.Neighbours = neighbours
return nil
}

View File

@@ -19,14 +19,30 @@ var (
AnnounceTime = 30 * time.Second AnnounceTime = 30 * time.Second
) )
// Node is network node
type Node interface {
// Id is node id
Id() string
// Address is node bind address
Address() string
// Neighbourhood is node neighbourhood
Neighbourhood() []Node
// Network is the network node is in
Network() Network
}
// Network is micro network // Network is micro network
type Network interface { type Network interface {
// Node is network node
Node
// Options returns the network options
Options() Options
// Name of the network // Name of the network
Name() string Name() string
// Address returns network bind address
Address() string
// Connect starts the resolver and tunnel server // Connect starts the resolver and tunnel server
Connect() error Connect() error
// Nodes returns list of network nodes
Nodes() []Node
// Close stops the tunnel and resolving // Close stops the tunnel and resolving
Close() error Close() error
// Client is micro client // Client is micro client

View File

@@ -37,7 +37,7 @@ var _ server.Option
type NetworkService interface { type NetworkService interface {
ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error) ListRoutes(ctx context.Context, in *proto1.Request, opts ...client.CallOption) (*proto1.ListResponse, error)
ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) ListNodes(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error)
ListNeighbours(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, opts ...client.CallOption) (*NeighbourhoodResponse, error)
} }
type networkService struct { type networkService struct {
@@ -78,9 +78,9 @@ func (c *networkService) ListNodes(ctx context.Context, in *ListRequest, opts ..
return out, nil return out, nil
} }
func (c *networkService) ListNeighbours(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) { func (c *networkService) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, opts ...client.CallOption) (*NeighbourhoodResponse, error) {
req := c.c.NewRequest(c.name, "Network.ListNeighbours", in) req := c.c.NewRequest(c.name, "Network.Neighbourhood", in)
out := new(ListResponse) out := new(NeighbourhoodResponse)
err := c.c.Call(ctx, req, out, opts...) err := c.c.Call(ctx, req, out, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -93,14 +93,14 @@ func (c *networkService) ListNeighbours(ctx context.Context, in *ListRequest, op
type NetworkHandler interface { type NetworkHandler interface {
ListRoutes(context.Context, *proto1.Request, *proto1.ListResponse) error ListRoutes(context.Context, *proto1.Request, *proto1.ListResponse) error
ListNodes(context.Context, *ListRequest, *ListResponse) error ListNodes(context.Context, *ListRequest, *ListResponse) error
ListNeighbours(context.Context, *ListRequest, *ListResponse) error Neighbourhood(context.Context, *NeighbourhoodRequest, *NeighbourhoodResponse) error
} }
func RegisterNetworkHandler(s server.Server, hdlr NetworkHandler, opts ...server.HandlerOption) error { func RegisterNetworkHandler(s server.Server, hdlr NetworkHandler, opts ...server.HandlerOption) error {
type network interface { type network interface {
ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error ListRoutes(ctx context.Context, in *proto1.Request, out *proto1.ListResponse) error
ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error ListNodes(ctx context.Context, in *ListRequest, out *ListResponse) error
ListNeighbours(ctx context.Context, in *ListRequest, out *ListResponse) error Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error
} }
type Network struct { type Network struct {
network network
@@ -121,6 +121,6 @@ func (h *networkHandler) ListNodes(ctx context.Context, in *ListRequest, out *Li
return h.NetworkHandler.ListNodes(ctx, in, out) return h.NetworkHandler.ListNodes(ctx, in, out)
} }
func (h *networkHandler) ListNeighbours(ctx context.Context, in *ListRequest, out *ListResponse) error { func (h *networkHandler) Neighbourhood(ctx context.Context, in *NeighbourhoodRequest, out *NeighbourhoodResponse) error {
return h.NetworkHandler.ListNeighbours(ctx, in, out) return h.NetworkHandler.Neighbourhood(ctx, in, out)
} }

View File

@@ -93,6 +93,86 @@ func (m *ListResponse) GetNodes() []*Node {
return nil return nil
} }
// NeighbourhoodRequest is sent to query node neighbourhood
type NeighbourhoodRequest struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NeighbourhoodRequest) Reset() { *m = NeighbourhoodRequest{} }
func (m *NeighbourhoodRequest) String() string { return proto.CompactTextString(m) }
func (*NeighbourhoodRequest) ProtoMessage() {}
func (*NeighbourhoodRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{2}
}
func (m *NeighbourhoodRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NeighbourhoodRequest.Unmarshal(m, b)
}
func (m *NeighbourhoodRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NeighbourhoodRequest.Marshal(b, m, deterministic)
}
func (m *NeighbourhoodRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_NeighbourhoodRequest.Merge(m, src)
}
func (m *NeighbourhoodRequest) XXX_Size() int {
return xxx_messageInfo_NeighbourhoodRequest.Size(m)
}
func (m *NeighbourhoodRequest) XXX_DiscardUnknown() {
xxx_messageInfo_NeighbourhoodRequest.DiscardUnknown(m)
}
var xxx_messageInfo_NeighbourhoodRequest proto.InternalMessageInfo
func (m *NeighbourhoodRequest) GetId() string {
if m != nil {
return m.Id
}
return ""
}
// NeighbourhoodResponse contains node neighbourhood hierarchy
type NeighbourhoodResponse struct {
Neighbours []*Neighbour `protobuf:"bytes,1,rep,name=neighbours,proto3" json:"neighbours,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NeighbourhoodResponse) Reset() { *m = NeighbourhoodResponse{} }
func (m *NeighbourhoodResponse) String() string { return proto.CompactTextString(m) }
func (*NeighbourhoodResponse) ProtoMessage() {}
func (*NeighbourhoodResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{3}
}
func (m *NeighbourhoodResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NeighbourhoodResponse.Unmarshal(m, b)
}
func (m *NeighbourhoodResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NeighbourhoodResponse.Marshal(b, m, deterministic)
}
func (m *NeighbourhoodResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_NeighbourhoodResponse.Merge(m, src)
}
func (m *NeighbourhoodResponse) XXX_Size() int {
return xxx_messageInfo_NeighbourhoodResponse.Size(m)
}
func (m *NeighbourhoodResponse) XXX_DiscardUnknown() {
xxx_messageInfo_NeighbourhoodResponse.DiscardUnknown(m)
}
var xxx_messageInfo_NeighbourhoodResponse proto.InternalMessageInfo
func (m *NeighbourhoodResponse) GetNeighbours() []*Neighbour {
if m != nil {
return m.Neighbours
}
return nil
}
// Node is network node // Node is network node
type Node struct { type Node struct {
// node ide // node ide
@@ -108,7 +188,7 @@ func (m *Node) Reset() { *m = Node{} }
func (m *Node) String() string { return proto.CompactTextString(m) } func (m *Node) String() string { return proto.CompactTextString(m) }
func (*Node) ProtoMessage() {} func (*Node) ProtoMessage() {}
func (*Node) Descriptor() ([]byte, []int) { func (*Node) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{2} return fileDescriptor_8571034d60397816, []int{4}
} }
func (m *Node) XXX_Unmarshal(b []byte) error { func (m *Node) XXX_Unmarshal(b []byte) error {
@@ -156,7 +236,7 @@ func (m *Connect) Reset() { *m = Connect{} }
func (m *Connect) String() string { return proto.CompactTextString(m) } func (m *Connect) String() string { return proto.CompactTextString(m) }
func (*Connect) ProtoMessage() {} func (*Connect) ProtoMessage() {}
func (*Connect) Descriptor() ([]byte, []int) { func (*Connect) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{3} return fileDescriptor_8571034d60397816, []int{5}
} }
func (m *Connect) XXX_Unmarshal(b []byte) error { func (m *Connect) XXX_Unmarshal(b []byte) error {
@@ -186,7 +266,7 @@ func (m *Connect) GetNode() *Node {
// Close is sent when the node disconnects from the network // Close is sent when the node disconnects from the network
type Close struct { type Close struct {
// network mode // network node
Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@@ -197,7 +277,7 @@ func (m *Close) Reset() { *m = Close{} }
func (m *Close) String() string { return proto.CompactTextString(m) } func (m *Close) String() string { return proto.CompactTextString(m) }
func (*Close) ProtoMessage() {} func (*Close) ProtoMessage() {}
func (*Close) Descriptor() ([]byte, []int) { func (*Close) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{4} return fileDescriptor_8571034d60397816, []int{6}
} }
func (m *Close) XXX_Unmarshal(b []byte) error { func (m *Close) XXX_Unmarshal(b []byte) error {
@@ -227,7 +307,7 @@ func (m *Close) GetNode() *Node {
// Neighbour is used to nnounce node neighbourhood // Neighbour is used to nnounce node neighbourhood
type Neighbour struct { type Neighbour struct {
// network mode // network node
Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
// neighbours // neighbours
Neighbours []*Node `protobuf:"bytes,3,rep,name=neighbours,proto3" json:"neighbours,omitempty"` Neighbours []*Node `protobuf:"bytes,3,rep,name=neighbours,proto3" json:"neighbours,omitempty"`
@@ -240,7 +320,7 @@ func (m *Neighbour) Reset() { *m = Neighbour{} }
func (m *Neighbour) String() string { return proto.CompactTextString(m) } func (m *Neighbour) String() string { return proto.CompactTextString(m) }
func (*Neighbour) ProtoMessage() {} func (*Neighbour) ProtoMessage() {}
func (*Neighbour) Descriptor() ([]byte, []int) { func (*Neighbour) Descriptor() ([]byte, []int) {
return fileDescriptor_8571034d60397816, []int{5} return fileDescriptor_8571034d60397816, []int{7}
} }
func (m *Neighbour) XXX_Unmarshal(b []byte) error { func (m *Neighbour) XXX_Unmarshal(b []byte) error {
@@ -278,6 +358,8 @@ func (m *Neighbour) GetNeighbours() []*Node {
func init() { func init() {
proto.RegisterType((*ListRequest)(nil), "go.micro.network.ListRequest") proto.RegisterType((*ListRequest)(nil), "go.micro.network.ListRequest")
proto.RegisterType((*ListResponse)(nil), "go.micro.network.ListResponse") proto.RegisterType((*ListResponse)(nil), "go.micro.network.ListResponse")
proto.RegisterType((*NeighbourhoodRequest)(nil), "go.micro.network.NeighbourhoodRequest")
proto.RegisterType((*NeighbourhoodResponse)(nil), "go.micro.network.NeighbourhoodResponse")
proto.RegisterType((*Node)(nil), "go.micro.network.Node") proto.RegisterType((*Node)(nil), "go.micro.network.Node")
proto.RegisterType((*Connect)(nil), "go.micro.network.Connect") proto.RegisterType((*Connect)(nil), "go.micro.network.Connect")
proto.RegisterType((*Close)(nil), "go.micro.network.Close") proto.RegisterType((*Close)(nil), "go.micro.network.Close")
@@ -287,24 +369,27 @@ func init() {
func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) } func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) }
var fileDescriptor_8571034d60397816 = []byte{ var fileDescriptor_8571034d60397816 = []byte{
// 302 bytes of a gzipped FileDescriptorProto // 344 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x52, 0x5d, 0x4b, 0xc3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x41, 0x4f, 0xf2, 0x40,
0x14, 0xb5, 0xfb, 0x70, 0xec, 0xce, 0x0d, 0xc9, 0x83, 0x84, 0xc2, 0x64, 0xe4, 0x69, 0x88, 0xa6, 0x10, 0xfd, 0x28, 0xf0, 0x11, 0x06, 0x31, 0x66, 0xa3, 0xa6, 0xa9, 0xc1, 0x90, 0x3d, 0x20, 0x31,
0xb2, 0xa2, 0x4f, 0xbe, 0xed, 0xc1, 0x97, 0x51, 0xb0, 0xff, 0xc0, 0x36, 0xa1, 0x0b, 0xba, 0xdc, 0x5a, 0x0c, 0x44, 0x2f, 0x7a, 0xe3, 0xe0, 0x85, 0x70, 0x68, 0xfc, 0x03, 0x96, 0xdd, 0x94, 0x8d,
0x99, 0xa4, 0xf8, 0xc3, 0xfd, 0x03, 0xd2, 0xb4, 0x9b, 0xc5, 0x31, 0x61, 0xf8, 0x96, 0x73, 0xcf, 0xb2, 0x83, 0xbb, 0xdb, 0xf8, 0x07, 0xfc, 0xe1, 0xa6, 0xdb, 0x2d, 0x16, 0x10, 0x0c, 0xb7, 0xce,
0x3d, 0xe7, 0x5e, 0xee, 0x09, 0x8c, 0xb5, 0x74, 0x9f, 0x68, 0xde, 0xf8, 0xd6, 0xa0, 0x43, 0x72, 0xcc, 0x7b, 0xf3, 0x66, 0xfb, 0x1e, 0xb4, 0x25, 0x37, 0x9f, 0xa8, 0xde, 0xc2, 0xa5, 0x42, 0x83,
0x59, 0x20, 0xdf, 0xa8, 0xdc, 0x20, 0x6f, 0xea, 0x61, 0x5c, 0x28, 0xb7, 0x2e, 0x33, 0x9e, 0xe3, 0xe4, 0x24, 0xc1, 0x70, 0x21, 0x66, 0x0a, 0x43, 0xd7, 0x0f, 0x46, 0x89, 0x30, 0xf3, 0x34, 0x0e,
0x26, 0xf2, 0x4c, 0x54, 0xe0, 0x5d, 0xfd, 0x30, 0x58, 0x3a, 0x69, 0x22, 0xaf, 0x6c, 0x40, 0x6d, 0x67, 0xb8, 0x18, 0xd8, 0xc9, 0x20, 0xc1, 0xdb, 0xfc, 0x43, 0x61, 0x6a, 0xb8, 0x1a, 0x58, 0xa6,
0xc3, 0xc6, 0x30, 0x5a, 0x29, 0xeb, 0x52, 0xf9, 0x51, 0x4a, 0xeb, 0xd8, 0x13, 0x5c, 0xd4, 0xd0, 0x2b, 0xf2, 0x35, 0xb4, 0x0d, 0xad, 0x89, 0xd0, 0x26, 0xe2, 0x1f, 0x29, 0xd7, 0x86, 0x3e, 0xc1,
0x6e, 0x51, 0x5b, 0x49, 0x6e, 0xa1, 0xaf, 0x51, 0x48, 0x4b, 0x83, 0x59, 0x77, 0x3e, 0x5a, 0x5c, 0x51, 0x5e, 0xea, 0x25, 0x4a, 0xcd, 0xc9, 0x0d, 0xd4, 0x25, 0x32, 0xae, 0xfd, 0x4a, 0xb7, 0xda,
0xf1, 0xdf, 0x53, 0x79, 0x82, 0x42, 0xa6, 0x75, 0x13, 0xbb, 0x87, 0x5e, 0x05, 0xc9, 0x04, 0x3a, 0x6f, 0x0d, 0xcf, 0xc3, 0x4d, 0xd5, 0x70, 0x8a, 0x8c, 0x47, 0x39, 0x88, 0xf6, 0xe0, 0x74, 0xca,
0x4a, 0xd0, 0x60, 0x16, 0xcc, 0x87, 0x69, 0x47, 0x09, 0x42, 0x61, 0xf0, 0x2a, 0x84, 0x91, 0xd6, 0x45, 0x32, 0x8f, 0x31, 0x55, 0x73, 0x44, 0xe6, 0xb6, 0x92, 0x63, 0xf0, 0x04, 0xf3, 0x2b, 0xdd,
0xd2, 0x8e, 0x2f, 0xee, 0x20, 0x7b, 0x80, 0xc1, 0x12, 0xb5, 0x96, 0xb9, 0x23, 0x37, 0xd0, 0xab, 0x4a, 0xbf, 0x19, 0x79, 0x82, 0xd1, 0x17, 0x38, 0xdb, 0xc0, 0x39, 0xb9, 0x47, 0x00, 0x59, 0x0c,
0x5c, 0xbc, 0xec, 0xf8, 0x24, 0xdf, 0xc3, 0x62, 0xe8, 0x2f, 0xdf, 0xd1, 0xca, 0x93, 0x44, 0x08, 0x0a, 0xcd, 0x8b, 0x5f, 0x34, 0x0b, 0x4c, 0x54, 0x82, 0xd3, 0x3b, 0xa8, 0x65, 0xc7, 0x6c, 0xaa,
0xc3, 0x44, 0xaa, 0x62, 0x9d, 0x61, 0x69, 0x4e, 0x11, 0x92, 0x47, 0x00, 0xbd, 0x13, 0x5a, 0xda, 0x11, 0x1f, 0x1a, 0xaf, 0x8c, 0x29, 0xae, 0xb5, 0xef, 0xd9, 0x66, 0x51, 0xd2, 0x7b, 0x68, 0x8c,
0xfd, 0xf3, 0x12, 0xad, 0xce, 0xc5, 0x57, 0x00, 0x83, 0xa4, 0x26, 0xc9, 0x33, 0x80, 0x3f, 0x6c, 0x51, 0x4a, 0x3e, 0x33, 0xe4, 0x1a, 0x6a, 0xd9, 0x1b, 0x2c, 0x6d, 0xf7, 0x3b, 0x2d, 0x86, 0x8e,
0x75, 0x7b, 0x4b, 0xe8, 0x8f, 0xba, 0x49, 0xa3, 0x09, 0x20, 0x9c, 0x1e, 0x30, 0xed, 0x3c, 0xd8, 0xa0, 0x3e, 0x7e, 0x47, 0xcd, 0x0f, 0x22, 0x21, 0x34, 0x57, 0x67, 0x1f, 0x42, 0x24, 0x0f, 0x6b,
0x19, 0x59, 0xc1, 0xb0, 0xaa, 0x54, 0xc3, 0x2c, 0x99, 0x1e, 0x6e, 0xd1, 0x4a, 0x33, 0xbc, 0x3e, 0xff, 0xa4, 0xba, 0xd7, 0x87, 0x12, 0x72, 0xf8, 0xe5, 0x41, 0x63, 0x9a, 0x0f, 0xc9, 0x33, 0x80,
0x46, 0xef, 0xdd, 0x5e, 0x60, 0xe2, 0xdd, 0xf6, 0x4b, 0xff, 0xdb, 0x32, 0x3b, 0xf7, 0x1f, 0x2b, 0xb5, 0x35, 0x73, 0x5e, 0x13, 0xff, 0x87, 0xed, 0xb2, 0xe0, 0x8c, 0x0a, 0x3a, 0x5b, 0x93, 0x72,
0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6e, 0xfe, 0x91, 0xb0, 0x02, 0x00, 0x00, 0x1a, 0xe8, 0x3f, 0x32, 0x81, 0x66, 0xd6, 0xc9, 0xc4, 0x34, 0xe9, 0x6c, 0x5f, 0x51, 0xca, 0x52,
0x70, 0xb9, 0x6b, 0xbc, 0xda, 0x16, 0x43, 0x7b, 0x2d, 0x07, 0xa4, 0xb7, 0xc7, 0xeb, 0x52, 0xa0,
0x82, 0xab, 0x3f, 0x71, 0x85, 0x46, 0xfc, 0xdf, 0xe6, 0x7c, 0xf4, 0x1d, 0x00, 0x00, 0xff, 0xff,
0x11, 0x41, 0xd2, 0x02, 0x3f, 0x03, 0x00, 0x00,
} }

View File

@@ -8,7 +8,7 @@ import "github.com/micro/go-micro/router/proto/router.proto";
service Network { service Network {
rpc ListRoutes(go.micro.router.Request) returns (go.micro.router.ListResponse) {}; rpc ListRoutes(go.micro.router.Request) returns (go.micro.router.ListResponse) {};
rpc ListNodes(ListRequest) returns (ListResponse) {}; rpc ListNodes(ListRequest) returns (ListResponse) {};
rpc ListNeighbours(ListRequest) returns (ListResponse) {}; rpc Neighbourhood(NeighbourhoodRequest) returns (NeighbourhoodResponse) {};
} }
// Empty request // Empty request
@@ -19,6 +19,16 @@ message ListResponse {
repeated Node nodes = 1; repeated Node nodes = 1;
} }
// NeighbourhoodRequest is sent to query node neighbourhood
message NeighbourhoodRequest {
string id = 1;
}
// NeighbourhoodResponse contains node neighbourhood hierarchy
message NeighbourhoodResponse {
repeated Neighbour neighbours = 1;
}
// Node is network node // Node is network node
message Node { message Node {
// node ide // node ide
@@ -35,13 +45,13 @@ message Connect {
// Close is sent when the node disconnects from the network // Close is sent when the node disconnects from the network
message Close { message Close {
// network mode // network node
Node node = 1; Node node = 1;
} }
// Neighbour is used to nnounce node neighbourhood // Neighbour is used to nnounce node neighbourhood
message Neighbour { message Neighbour {
// network mode // network node
Node node = 1; Node node = 1;
// neighbours // neighbours
repeated Node neighbours = 3; repeated Node neighbours = 3;