mirror of
https://github.com/singchia/frontier.git
synced 2025-10-20 23:09:30 +08:00
prototype for frontier
This commit is contained in:
@@ -1,7 +1,63 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/jumboframes/armorigo/sigaction"
|
||||||
|
"github.com/singchia/frontier/pkg/config"
|
||||||
|
"github.com/singchia/frontier/pkg/edgebound"
|
||||||
|
"github.com/singchia/frontier/pkg/exchange"
|
||||||
|
"github.com/singchia/frontier/pkg/mq"
|
||||||
|
"github.com/singchia/frontier/pkg/repo/dao"
|
||||||
|
"github.com/singchia/frontier/pkg/servicebound"
|
||||||
|
"github.com/singchia/go-timer/v2"
|
||||||
|
"k8s.io/klog/v2"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println("vim-go")
|
conf, err := config.Parse()
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("parse flags err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// dao
|
||||||
|
dao, err := dao.NewDao(conf)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("new dao err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// mqm
|
||||||
|
mqm, err := mq.NewMQM(conf)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("new mq manager err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// exchange
|
||||||
|
exchange, err := exchange.NewExchange(conf)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("new exchange err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
tmr := timer.NewTimer()
|
||||||
|
// servicebound
|
||||||
|
servicebound, err := servicebound.NewServicebound(conf, dao, nil, exchange, mqm, tmr)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("new servicebound err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
servicebound.Serve()
|
||||||
|
|
||||||
|
// edgebound
|
||||||
|
edgebound, err := edgebound.NewEdgebound(conf, dao, nil, exchange, tmr)
|
||||||
|
if err != nil {
|
||||||
|
klog.Errorf("new edgebound err: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
edgebound.Serve()
|
||||||
|
|
||||||
|
sig := sigaction.NewSignal()
|
||||||
|
sig.Wait(context.TODO())
|
||||||
|
edgebound.Close()
|
||||||
|
servicebound.Close()
|
||||||
}
|
}
|
||||||
|
@@ -10,11 +10,16 @@ type Exchange interface {
|
|||||||
// rpc, message and raw io to edge
|
// rpc, message and raw io to edge
|
||||||
ForwardToEdge(*Meta, geminio.End)
|
ForwardToEdge(*Meta, geminio.End)
|
||||||
// stream to edge
|
// stream to edge
|
||||||
StreamToEdge(geminio.Stream)
|
// TODO StreamToEdge(geminio.Stream)
|
||||||
// rpc, message and raw io to service
|
// rpc, message and raw io to service
|
||||||
ForwardToService(geminio.End)
|
ForwardToService(geminio.End)
|
||||||
// stream to service
|
// stream to service
|
||||||
StreamToService(geminio.Stream)
|
// TODO StreamToService(geminio.Stream)
|
||||||
|
|
||||||
|
// for exchange
|
||||||
|
AddEdgebound(Edgebound)
|
||||||
|
AddServicebound(Servicebound)
|
||||||
|
AddMQM(MQM)
|
||||||
}
|
}
|
||||||
|
|
||||||
// edge related
|
// edge related
|
||||||
@@ -23,6 +28,9 @@ type Edgebound interface {
|
|||||||
// for management
|
// for management
|
||||||
GetEdgeByID(edgeID uint64) geminio.End
|
GetEdgeByID(edgeID uint64) geminio.End
|
||||||
DelEdgeByID(edgeID uint64) error
|
DelEdgeByID(edgeID uint64) error
|
||||||
|
|
||||||
|
Serve()
|
||||||
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type EdgeInformer interface {
|
type EdgeInformer interface {
|
||||||
@@ -35,10 +43,13 @@ type EdgeInformer interface {
|
|||||||
type Servicebound interface {
|
type Servicebound interface {
|
||||||
ListService() []geminio.End
|
ListService() []geminio.End
|
||||||
// for management
|
// for management
|
||||||
GetServiceByName(service string) geminio.End
|
// TODO GetServiceByName(service string) geminio.End
|
||||||
GetServiceByRPC(rpc string) (geminio.End, error)
|
GetServiceByRPC(rpc string) (geminio.End, error)
|
||||||
GetServiceByTopic(topic string) (geminio.End, error)
|
GetServiceByTopic(topic string) (geminio.End, error)
|
||||||
DelSerivces(service string) error
|
DelSerivces(service string) error
|
||||||
|
|
||||||
|
Serve()
|
||||||
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServiceInformer interface {
|
type ServiceInformer interface {
|
||||||
|
@@ -99,7 +99,7 @@ type Configuration struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configuration accepts config file and command-line, and command-line is more privileged.
|
// Configuration accepts config file and command-line, and command-line is more privileged.
|
||||||
func ParseFlags() (*Configuration, error) {
|
func Parse() (*Configuration, error) {
|
||||||
var (
|
var (
|
||||||
argConfigFile = pflag.String("config", "", "config file, default not configured")
|
argConfigFile = pflag.String("config", "", "config file, default not configured")
|
||||||
argDaemonRLimitNofile = pflag.Int("daemon-rlimit-nofile", -1, "SetRLimit for number of file of this daemon, default: -1 means ignore")
|
argDaemonRLimitNofile = pflag.Int("daemon-rlimit-nofile", -1, "SetRLimit for number of file of this daemon, default: -1 means ignore")
|
||||||
|
@@ -28,7 +28,7 @@ func TestParseFlags(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
got, err := ParseFlags()
|
got, err := Parse()
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("ParseFlags() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("ParseFlags() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
@@ -15,7 +15,7 @@ func (em *edgeManager) acceptStream(stream geminio.Stream) {
|
|||||||
em.streams.MSet(edgeID, streamID, stream)
|
em.streams.MSet(edgeID, streamID, stream)
|
||||||
// exchange to service
|
// exchange to service
|
||||||
if em.exchange != nil {
|
if em.exchange != nil {
|
||||||
em.exchange.StreamToService(stream)
|
// TODO em.exchange.StreamToService(stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -25,12 +25,18 @@ import (
|
|||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NewEdgebound(conf *config.Configuration, dao *dao.Dao, informer api.EdgeInformer,
|
||||||
|
exchange api.Exchange, tmr timer.Timer) (api.Edgebound, error) {
|
||||||
|
return newEdgeManager(conf, dao, informer, exchange, tmr)
|
||||||
|
}
|
||||||
|
|
||||||
type edgeManager struct {
|
type edgeManager struct {
|
||||||
*delegate.UnimplementedDelegate
|
*delegate.UnimplementedDelegate
|
||||||
|
conf *config.Configuration
|
||||||
|
|
||||||
informer api.EdgeInformer
|
informer api.EdgeInformer
|
||||||
exchange api.Exchange
|
exchange api.Exchange
|
||||||
conf *config.Configuration
|
|
||||||
// edgeID allocator
|
// edgeID allocator
|
||||||
idFactory id.IDFactory
|
idFactory id.IDFactory
|
||||||
shub *synchub.SyncHub
|
shub *synchub.SyncHub
|
||||||
@@ -75,6 +81,7 @@ func newEdgeManager(conf *config.Configuration, dao *dao.Dao, informer api.EdgeI
|
|||||||
// a simple unix timestamp incemental id factory
|
// a simple unix timestamp incemental id factory
|
||||||
idFactory: id.DefaultIncIDCounter,
|
idFactory: id.DefaultIncIDCounter,
|
||||||
informer: informer,
|
informer: informer,
|
||||||
|
exchange: exchange,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !listen.TLS.Enable {
|
if !listen.TLS.Enable {
|
||||||
@@ -292,6 +299,10 @@ func (em *edgeManager) ListStreams(edgeID uint64) []geminio.Stream {
|
|||||||
return utils.Slice2streams(all)
|
return utils.Slice2streams(all)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (em *edgeManager) DelEdgeByID(edgeID uint64) error {
|
||||||
|
panic("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
// Close all edges and manager
|
// Close all edges and manager
|
||||||
func (em *edgeManager) Close() error {
|
func (em *edgeManager) Close() error {
|
||||||
bypass := &em.conf.Edgebound.Bypass
|
bypass := &em.conf.Edgebound.Bypass
|
||||||
|
@@ -2,10 +2,36 @@ package exchange
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/singchia/frontier/pkg/api"
|
"github.com/singchia/frontier/pkg/api"
|
||||||
|
"github.com/singchia/frontier/pkg/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type exchange struct {
|
type exchange struct {
|
||||||
|
conf *config.Configuration
|
||||||
|
|
||||||
Edgebound api.Edgebound
|
Edgebound api.Edgebound
|
||||||
Servicebound api.Servicebound
|
Servicebound api.Servicebound
|
||||||
MQM api.MQM
|
MQM api.MQM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewExchange(conf *config.Configuration) (api.Exchange, error) {
|
||||||
|
return newExchange(conf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newExchange(conf *config.Configuration) (*exchange, error) {
|
||||||
|
exchange := &exchange{
|
||||||
|
conf: conf,
|
||||||
|
}
|
||||||
|
return exchange, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ex *exchange) AddEdgebound(edgebound api.Edgebound) {
|
||||||
|
ex.Edgebound = edgebound
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ex *exchange) AddServicebound(servicebound api.Servicebound) {
|
||||||
|
ex.Servicebound = servicebound
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ex *exchange) AddMQM(mqm api.MQM) {
|
||||||
|
ex.MQM = mqm
|
||||||
|
}
|
||||||
|
@@ -103,6 +103,15 @@ func (ex *exchange) forwardMessageToEdge(end geminio.End) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ex *exchange) ForwardToService(end geminio.End) {
|
||||||
|
// raw
|
||||||
|
ex.forwardRawToService(end)
|
||||||
|
// message
|
||||||
|
ex.forwardMessageToService(end)
|
||||||
|
// rpc
|
||||||
|
ex.forwardRPCToService(end)
|
||||||
|
}
|
||||||
|
|
||||||
// raw io from edge, and forward to service
|
// raw io from edge, and forward to service
|
||||||
func (ex *exchange) forwardRawToService(end geminio.End) {
|
func (ex *exchange) forwardRawToService(end geminio.End) {
|
||||||
//drop the io, actually we won't be here
|
//drop the io, actually we won't be here
|
||||||
|
@@ -18,7 +18,11 @@ type mqManager struct {
|
|||||||
mqindex map[string]*uint64 // for round robin
|
mqindex map[string]*uint64 // for round robin
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMQManager(conf *config.Configuration) (api.MQM, error) {
|
func NewMQM(conf *config.Configuration) (api.MQM, error) {
|
||||||
|
return newMQManager(conf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMQManager(conf *config.Configuration) (*mqManager, error) {
|
||||||
mqm := &mqManager{
|
mqm := &mqManager{
|
||||||
mqs: make(map[string][]api.MQ),
|
mqs: make(map[string][]api.MQ),
|
||||||
conf: conf,
|
conf: conf,
|
||||||
|
@@ -16,7 +16,7 @@ func (sm *serviceManager) acceptStream(stream geminio.Stream) {
|
|||||||
sm.streams.MSet(serviceID, streamID, stream)
|
sm.streams.MSet(serviceID, streamID, stream)
|
||||||
// exchange to edge
|
// exchange to edge
|
||||||
if sm.exchange != nil {
|
if sm.exchange != nil {
|
||||||
sm.exchange.StreamToEdge(stream)
|
// TODO sm.exchange.StreamToEdge(stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,6 +24,11 @@ import (
|
|||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NewServicebound(conf *config.Configuration, dao *dao.Dao, informer api.ServiceInformer,
|
||||||
|
exchange api.Exchange, mqm api.MQM, tmr timer.Timer) (api.Servicebound, error) {
|
||||||
|
return newServiceManager(conf, dao, informer, exchange, mqm, tmr)
|
||||||
|
}
|
||||||
|
|
||||||
type serviceManager struct {
|
type serviceManager struct {
|
||||||
*delegate.UnimplementedDelegate
|
*delegate.UnimplementedDelegate
|
||||||
conf *config.Configuration
|
conf *config.Configuration
|
||||||
@@ -52,7 +57,7 @@ type serviceManager struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func newServiceManager(conf *config.Configuration, dao *dao.Dao, informer api.ServiceInformer,
|
func newServiceManager(conf *config.Configuration, dao *dao.Dao, informer api.ServiceInformer,
|
||||||
exchange api.Exchange, tmr timer.Timer) (*serviceManager, error) {
|
exchange api.Exchange, mqm api.MQM, tmr timer.Timer) (*serviceManager, error) {
|
||||||
listen := &conf.Servicebound.Listen
|
listen := &conf.Servicebound.Listen
|
||||||
var (
|
var (
|
||||||
ln net.Listener
|
ln net.Listener
|
||||||
@@ -73,6 +78,7 @@ func newServiceManager(conf *config.Configuration, dao *dao.Dao, informer api.Se
|
|||||||
idFactory: id.DefaultIncIDCounter,
|
idFactory: id.DefaultIncIDCounter,
|
||||||
informer: informer,
|
informer: informer,
|
||||||
}
|
}
|
||||||
|
exchange.AddServicebound(sm)
|
||||||
|
|
||||||
if !listen.TLS.Enable {
|
if !listen.TLS.Enable {
|
||||||
if ln, err = net.Listen(network, addr); err != nil {
|
if ln, err = net.Listen(network, addr); err != nil {
|
||||||
@@ -166,7 +172,9 @@ func (sm *serviceManager) handleConn(conn net.Conn) error {
|
|||||||
// register topics claim of end
|
// register topics claim of end
|
||||||
sm.remoteReceiveClaim(end.ClientID(), meta.Topics)
|
sm.remoteReceiveClaim(end.ClientID(), meta.Topics)
|
||||||
// add the end to MQM
|
// add the end to MQM
|
||||||
sm.mqm.AddMQByEnd(meta.Topics, end)
|
if sm.mqm != nil {
|
||||||
|
sm.mqm.AddMQByEnd(meta.Topics, end)
|
||||||
|
}
|
||||||
|
|
||||||
// handle online event for end
|
// handle online event for end
|
||||||
if err = sm.online(end, meta); err != nil {
|
if err = sm.online(end, meta); err != nil {
|
||||||
@@ -246,6 +254,10 @@ func (sm *serviceManager) CountServices() int {
|
|||||||
return len(sm.services)
|
return len(sm.services)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sm *serviceManager) DelSerivces(service string) error {
|
||||||
|
panic("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
func (sm *serviceManager) ListStreams(serviceID uint64) []geminio.Stream {
|
func (sm *serviceManager) ListStreams(serviceID uint64) []geminio.Stream {
|
||||||
all := sm.streams.MGetAll(serviceID)
|
all := sm.streams.MGetAll(serviceID)
|
||||||
return utils.Slice2streams(all)
|
return utils.Slice2streams(all)
|
||||||
|
@@ -33,7 +33,7 @@ func TestServiceManager(t *testing.T) {
|
|||||||
}
|
}
|
||||||
inf.wg.Add(2)
|
inf.wg.Add(2)
|
||||||
// service manager
|
// service manager
|
||||||
sm, err := newServiceManager(conf, dao, inf, nil, timer.NewTimer())
|
sm, err := newServiceManager(conf, dao, inf, nil, nil, timer.NewTimer())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user