Add versioning, serve routes over an internal service

master
René Jochum 2 years ago
parent f922b55ad1
commit d75308b1fe

@ -4,7 +4,7 @@ vars:
GIT_TAG: GIT_TAG:
sh: git tag --points-at HEAD sh: git tag --points-at HEAD
GIT_COMMIT: GIT_COMMIT:
sh: git rev-parse HEAD sh: git rev-parse --short HEAD
GIT_DIRTY: GIT_DIRTY:
sh: git status -s sh: git status -s
VERSION: VERSION:
@ -54,12 +54,15 @@ tasks:
- task: builder - task: builder
vars: vars:
CLI_ARGS: /bin/sh -c 'cd ./proto/routerclientpb; protoc --proto_path=/go/bin:. --micro_out=paths=source_relative:. --go_out=paths=source_relative:. routerclientpb.proto' CLI_ARGS: /bin/sh -c 'cd ./proto/routerclientpb; protoc --proto_path=/go/bin:. --micro_out=paths=source_relative:. --go_out=paths=source_relative:. routerclientpb.proto'
- task: builder
vars:
CLI_ARGS: /bin/sh -c 'cd ./proto/routerserverpb; protoc --proto_path=/go/bin:. --micro_out=paths=source_relative:. --go_out=paths=source_relative:. routerserverpb.proto'
build:podman: build:podman:
deps: deps:
- protoc - protoc
cmds: cmds:
- podman build -v "$PWD:/code:rw" -v "{{.VOLUME_PATH}}:/go:rw" --build-arg CACHEBUST={{.DATE}} --build-arg=VERSION={{.VERSION}} -t docker.io/pcdummy/go-micro-router:latest -f ./docker/go-micro-router/Dockerfile . - podman build -v "$PWD:/code:rw" -v "{{.VOLUME_PATH}}:/go:rw" --build-arg CACHEBUST={{.DATE}} --build-arg VERSION={{.VERSION}} -t docker.io/pcdummy/go-micro-router:latest -f ./docker/go-micro-router/Dockerfile .
vars: vars:
DATE: DATE:
sh: date +%s sh: date +%s

@ -1,17 +1,67 @@
package main package main
import ( import (
"net/http"
"github.com/urfave/cli/v2" "github.com/urfave/cli/v2"
"go-micro.dev/v4" "go-micro.dev/v4"
"go-micro.dev/v4/logger" "go-micro.dev/v4/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
httpServer "github.com/go-micro/plugins/v4/server/http" httpServer "github.com/go-micro/plugins/v4/server/http"
"github.com/go-micro/router"
"github.com/go-micro/router/config" "github.com/go-micro/router/config"
"github.com/go-micro/router/handler" "github.com/go-micro/router/handler"
"github.com/go-micro/router/proto/routerclientpb"
"github.com/go-micro/router/proto/routerserverpb"
) )
func internalService(engine *gin.Engine) {
srv := micro.NewService()
routerHandler, err := handler.NewHandler(srv, engine)
if err != nil {
logger.Fatal(err)
}
opts := []micro.Option{
micro.Name(config.Name + "-internal"),
micro.Version(config.Version),
micro.Action(func(c *cli.Context) error {
if err := routerHandler.Start(); err != nil {
logger.Fatal(err)
}
routerserverpb.RegisterRouterServerServiceHandler(srv.Server(), routerHandler)
routerHandler := router.NewHandler(
config.GetServerConfig().RouterURI,
router.NewRoute(
router.RouteMethod(http.MethodGet),
router.RoutePath("/routes"),
router.RouteEndpoint(routerserverpb.RouterServerService.Routes),
),
)
routerclientpb.RegisterRouterClientServiceHandler(srv.Server(), routerHandler)
return nil
}),
}
srv.Init(opts...)
// Run server
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
if err := routerHandler.Stop(); err != nil {
logger.Fatal(err)
}
}
func main() { func main() {
srv := micro.NewService( srv := micro.NewService(
micro.Server(httpServer.NewServer()), micro.Server(httpServer.NewServer()),
@ -25,24 +75,15 @@ func main() {
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
} }
router := gin.New() r := gin.New()
routerHandler, err := handler.NewHandler(srv, router)
if err != nil {
logger.Fatal(err)
}
opts := []micro.Option{ opts := []micro.Option{
micro.Name(config.Name), micro.Name(config.Name),
micro.Version(config.Version), micro.Version(config.Version),
micro.Address(config.GetServerConfig().Address), micro.Address(config.GetServerConfig().Address),
micro.Action(func(c *cli.Context) error { micro.Action(func(c *cli.Context) error {
router.Use(gin.Logger(), gin.Recovery()) r.Use(gin.Logger(), gin.Recovery())
if err := micro.RegisterHandler(srv.Server(), router); err != nil {
logger.Fatal(err)
}
if err := routerHandler.Start(); err != nil { if err := micro.RegisterHandler(srv.Server(), r); err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
@ -51,12 +92,10 @@ func main() {
} }
srv.Init(opts...) srv.Init(opts...)
go internalService(r)
// Run server // Run server
if err := srv.Run(); err != nil { if err := srv.Run(); err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
if err := routerHandler.Stop(); err != nil {
logger.Fatal(err)
}
} }

@ -1,10 +1,12 @@
package config package config
var (
Version = "0.0.1-dev0"
)
const ( const (
Name = "go.micro.router" Name = "go.micro.router"
Version = "0.0.1-dev0" PkgPath = "github.com/go-micro/router"
RouterURI = "router"
PkgPath = "github.com/go-micro/router"
) )
const ( const (
@ -19,6 +21,7 @@ type Config struct {
type ServerConfig struct { type ServerConfig struct {
Env string Env string
Address string Address string
RouterURI string
RefreshSeconds int RefreshSeconds int
} }

@ -21,6 +21,7 @@ var _cfg *Config = &Config{
Server: ServerConfig{ Server: ServerConfig{
Env: EnvProd, Env: EnvProd,
Address: ":8080", Address: ":8080",
RouterURI: "router",
RefreshSeconds: 10, RefreshSeconds: 10,
}, },
} }

@ -12,8 +12,8 @@ WORKDIR /code
ENV GOPATH="/go" ENV GOPATH="/go"
ARG CACHEBUST=1 ARG CACHEBUST=1
ARG VERSION=0.0.1-dev0 ARG VERSION
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -installsuffix cgo -ldflags='-w -s -X "github.com/go-micro/router/config.Version='$VERSION'"' -o /usr/local/bin/microrouterd github.com/go-micro/router/cmd/microrouterd RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -installsuffix cgo -ldflags="-w -s -X 'github.com/go-micro/router/config.Version=$VERSION'" -o /usr/local/bin/microrouterd github.com/go-micro/router/cmd/microrouterd
# STEP 2 build a small image # STEP 2 build a small image
# start from busybox # start from busybox

@ -12,6 +12,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/go-micro/router/config" "github.com/go-micro/router/config"
"github.com/go-micro/router/proto/routerclientpb" "github.com/go-micro/router/proto/routerclientpb"
"github.com/go-micro/router/proto/routerserverpb"
"github.com/go-micro/router/util" "github.com/go-micro/router/util"
"go-micro.dev/v4" "go-micro.dev/v4"
"go-micro.dev/v4/client" "go-micro.dev/v4/client"
@ -42,20 +43,20 @@ func NewHandler(service micro.Service, engine *gin.Engine) (*Handler, error) {
func (h *Handler) Start() error { func (h *Handler) Start() error {
globalGroup := h.engine.Group("") globalGroup := h.engine.Group("")
globalGroup.Handle("GET", fmt.Sprintf("/%s/routes", config.RouterURI), h.ginRoutes)
// Refresh routes for the proxy every 10 seconds // Refresh routes for the proxy every 10 seconds
go func() { go func() {
ctx := context.Background() ctx := context.Background()
for { for {
services, err := util.FindByEndpoint(h.service, "RouterClient.Routes") services, err := util.FindByEndpoint(h.service, "RouterClientService.Routes")
if err != nil { if err != nil {
logger.Error(err) logger.Error(err)
continue continue
} }
for _, s := range services { for _, s := range services {
logger.Debug("Found service ", s.Name)
client := routerclientpb.NewRouterClientService(s.Name, h.service.Client()) client := routerclientpb.NewRouterClientService(s.Name, h.service.Client())
resp, err := client.Routes(ctx, &emptypb.Empty{}) resp, err := client.Routes(ctx, &emptypb.Empty{})
if err != nil { if err != nil {
@ -67,6 +68,7 @@ func (h *Handler) Start() error {
serviceGroup := globalGroup.Group(fmt.Sprintf("/%s", resp.GetRouterURI())) serviceGroup := globalGroup.Group(fmt.Sprintf("/%s", resp.GetRouterURI()))
for _, route := range resp.Routes { for _, route := range resp.Routes {
logger.Debug("Found endpoint ", route.Endpoint)
var g *gin.RouterGroup = nil var g *gin.RouterGroup = nil
if route.IsGlobal { if route.IsGlobal {
@ -189,16 +191,15 @@ func (h *Handler) proxy(serviceName string, route *routerclientpb.RoutesReply_Ro
} }
} }
func (h *Handler) ginRoutes(c *gin.Context) { func (h *Handler) Routes(ctx context.Context, in *emptypb.Empty, out *routerserverpb.RoutesReply) error {
ginRoutes := h.engine.Routes() ginRoutes := h.engine.Routes()
rRoutes := []JSONRoute{}
for _, route := range ginRoutes { for _, route := range ginRoutes {
rRoutes = append(rRoutes, JSONRoute{Method: route.Method, Path: route.Path}) out.Routes = append(out.Routes, &routerserverpb.RoutesReply_Route{
Method: route.Method,
Path: route.Path,
})
} }
c.JSON(http.StatusOK, gin.H{ return nil
"status": 200,
"message": "Dumping the routes",
"data": rRoutes,
})
} }

@ -6,7 +6,7 @@ option go_package = "github.com/go-micro/router/proto/routerclientpb;routerclien
import "google/protobuf/empty.proto"; import "google/protobuf/empty.proto";
service RouterClient { service RouterClientService {
rpc Routes (google.protobuf.Empty) returns (RoutesReply) {} rpc Routes (google.protobuf.Empty) returns (RoutesReply) {}
} }

@ -0,0 +1,20 @@
syntax = "proto3";
package routerserverpb;
option go_package = "github.com/go-micro/router/proto/routerserverpb;routerserverpb";
import "google/protobuf/empty.proto";
service RouterServerService {
rpc Routes (google.protobuf.Empty) returns (RoutesReply) {}
}
message RoutesReply {
message Route {
string method = 1;
string path = 2;
}
repeated Route routes = 1;
}
Loading…
Cancel
Save