You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
router/cmd/microrouterd/main.go

179 lines
4.4 KiB
Go

package main
import (
"log"
"net/http"
ginlogrus "github.com/toorop/gin-logrus"
"github.com/urfave/cli/v2"
"go-micro.dev/v4"
"go-micro.dev/v4/logger"
"github.com/gin-gonic/gin"
httpServer "github.com/go-micro/plugins/v4/server/http"
"jochum.dev/jo-micro/auth2"
jwtClient "jochum.dev/jo-micro/auth2/plugins/client/jwt"
jwtRouter "jochum.dev/jo-micro/auth2/plugins/router/jwt"
"jochum.dev/jo-micro/components"
"jochum.dev/jo-micro/logruscomponent"
"jochum.dev/jo-micro/router"
"jochum.dev/jo-micro/router/cmd/microrouterd/config"
"jochum.dev/jo-micro/router/cmd/microrouterd/handler"
"jochum.dev/jo-micro/router/internal/util"
)
func internalService(cReg *components.Registry, r *gin.Engine) {
routerHandler := handler.New()
auth2ClientReg := auth2.ClientAuthMustReg(cReg)
opts := []micro.Option{
micro.Name(config.Name + "-internal"),
micro.Version(config.Version),
micro.WrapHandler(auth2ClientReg.WrapHandler()),
micro.Action(func(c *cli.Context) error {
// Start the components
if err := cReg.Init(c); err != nil {
log.Fatal(err)
return err
}
// Initalize the Handler
if err := routerHandler.Init(cReg, r, c.Int("router_refresh"), c.String("router_ratelimiter_store_url")); err != nil {
logger.Fatal(err)
return err
}
return nil
}),
}
cReg.Service().Init(opts...)
// Run server
if err := cReg.Service().Run(); err != nil {
logger.Fatal(err)
return
}
// Stop the handler
if err := routerHandler.Stop(); err != nil {
logger.Fatal(err)
return
}
// Stop the client/service auth plugin
if err := cReg.Stop(); err != nil {
logger.Fatal(err)
return
}
}
func main() {
service := micro.NewService(
micro.Server(httpServer.NewServer()),
)
cReg := components.New(service, "router", logruscomponent.New(), auth2.RouterAuthComponent())
auth2RouterReg := auth2.RouterAuthMustReg(cReg)
auth2RouterReg.Register(jwtRouter.New())
iService := micro.NewService()
iCReg := components.New(iService, "router", logruscomponent.New(), auth2.RouterAuthComponent(), auth2.ClientAuthComponent(), router.New())
iAuth2RouterReg := auth2.RouterAuthMustReg(iCReg)
iAuth2RouterReg.Register(jwtRouter.New())
iAuth2ClientReg := auth2.ClientAuthMustReg(iCReg)
iAuth2ClientReg.Register(jwtClient.New())
var r *gin.Engine
flags := components.FilterDuplicateFlags(iCReg.AppendFlags(cReg.AppendFlags([]cli.Flag{
// General
&cli.BoolFlag{
Name: "router_debugmode",
Usage: "Run gin in debugmode?",
EnvVars: []string{"MICRO_ROUTER_DEBUGMODE"},
Value: false,
},
&cli.StringFlag{
Name: "router_basepath",
Usage: "Router basepath",
EnvVars: []string{"MICRO_ROUTER_BASEPATH"},
Value: "router",
},
&cli.IntFlag{
Name: "router_refresh",
Usage: "Router refresh routes every x seconds",
EnvVars: []string{"MICRO_ROUTER_REFRESH"},
Value: 10,
},
&cli.StringFlag{
Name: "router_listen",
Usage: "Router listen on",
EnvVars: []string{"MICRO_ROUTER_LISTEN"},
Value: ":8080",
},
&cli.StringFlag{
Name: "router_ratelimiter_store_url",
Usage: "Ratelimiter store URL, for example redis://localhost:6379/0",
EnvVars: []string{"MICRO_ROUTER_RATELIMITER_STORE_URL"},
Value: "memory://",
},
})))
opts := []micro.Option{
micro.Name(config.Name),
micro.Version(config.Version),
micro.Address(util.GetEnvDefault("MICRO_ROUTER_LISTEN", ":8080")),
micro.Flags(flags...),
micro.Action(func(c *cli.Context) error {
// Start the components
if err := cReg.Init(c); err != nil {
log.Fatal(err)
return err
}
// Initialize GIN
if c.Bool("router_debugmode") {
gin.SetMode(gin.DebugMode)
} else {
gin.SetMode(gin.ReleaseMode)
}
r = gin.New()
r.ForwardedByClientIP = true
// Add middlewares to gin
r.Use(ginlogrus.Logger(logruscomponent.MustReg(cReg).Logger()), gin.Recovery())
r.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{"errors": []gin.H{{"id": "NOT_FOUND", "message": "page not found"}}})
})
// Register gin with micro
if err := micro.RegisterHandler(service.Server(), r); err != nil {
logger.Fatal(err)
return err
}
return nil
}),
}
service.Init(opts...)
go internalService(iCReg, r)
// Run server
if err := service.Run(); err != nil {
logger.Fatal(err)
return
}
// Stop the plugin in RouterAuthRegistry
if err := cReg.Stop(); err != nil {
logger.Fatal(err)
return
}
}