Explorar el Código

完成初步gateway的demo

yjp hace 1 año
padre
commit
94aafc897d

+ 77 - 0
project/gateway/api/api.go

@@ -0,0 +1,77 @@
+package api
+
+import (
+	"baize-demo/project/gateway/api/root"
+	"baize-demo/project/gateway/api/v1"
+	"baize-demo/project/gateway/config"
+	"git.sxidc.com/go-framework/baize"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"git.sxidc.com/go-framework/baize/framework/gateway"
+	"net/http"
+)
+
+var appInstance *application.App
+var gatewayInstance *gateway.Gateway
+
+func NewGateway() {
+	if appInstance != nil {
+		return
+	}
+
+	appInstance = baize.NewApplication(config.GetConfig().ApplicationConfig)
+
+	// 注册Router
+	appInstance.Api().PrefixRouter().RegisterVersionedRouter("v1")
+
+	// 创建gateway
+	gatewayInstance = gateway.NewGateway(appInstance.Api())
+}
+
+func DestroyGateway() {
+	if appInstance == nil {
+		return
+	}
+
+	gateway.DestroyGateway(gatewayInstance)
+	gatewayInstance = nil
+
+	baize.DestroyApplication(appInstance)
+	appInstance = nil
+}
+
+func Start() error {
+	// 初始化路由
+	for _, router := range RegisteredRouters {
+		router.Init(gatewayInstance)
+	}
+
+	err := appInstance.Start()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func Finish() error {
+	err := appInstance.Finish()
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func ServerHttpForTest(w http.ResponseWriter, req *http.Request) {
+	appInstance.Api().RootRouter().(*api.RootRouter).ServerHttp(w, req)
+}
+
+type Router interface {
+	Init(gw *gateway.Gateway)
+}
+
+var RegisteredRouters = []Router{
+	&root.Router{},
+	&v1.Router{},
+}

+ 11 - 0
project/gateway/api/root/demo_server/demo_server.go

@@ -0,0 +1,11 @@
+package demo_server
+
+import "git.sxidc.com/go-framework/baize/framework/gateway"
+
+const (
+	baseUrl = "http://localhost:31000/example/api"
+)
+
+func InitRouter(builder *gateway.Builder) {
+	version(builder)
+}

+ 22 - 0
project/gateway/api/root/demo_server/version.go

@@ -0,0 +1,22 @@
+package demo_server
+
+import (
+	"fmt"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/gateway"
+	"net/http"
+)
+
+const (
+	versionBaseUrl = baseUrl + "/version"
+)
+
+func version(builder *gateway.Builder) {
+	builder.
+		Url(http.MethodGet, "version").
+		Build(func(c *api.Context) {
+			fmt.Println("Before!!!!!")
+			c.Next()
+			fmt.Println("After!!!!")
+		})
+}

+ 14 - 0
project/gateway/api/root/root.go

@@ -0,0 +1,14 @@
+package root
+
+import (
+	"baize-demo/project/gateway/api/root/demo_server"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/gateway"
+)
+
+type Router struct{}
+
+func (router *Router) Init(gw *gateway.Gateway) {
+	builder := gw.NewBuilder(api.RouterPrefix, "")
+	demo_server.InitRouter(builder)
+}

+ 7 - 0
project/gateway/api/v1/demo_server/demo_server.go

@@ -0,0 +1,7 @@
+package demo_server
+
+import "git.sxidc.com/go-framework/baize/framework/gateway"
+
+func InitRouter(builder *gateway.Builder) {
+
+}

+ 14 - 0
project/gateway/api/v1/v1.go

@@ -0,0 +1,14 @@
+package v1
+
+import (
+	"baize-demo/project/gateway/api/v1/demo_server"
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/gateway"
+)
+
+type Router struct{}
+
+func (router *Router) Init(gw *gateway.Gateway) {
+	builder := gw.NewBuilder(api.RouterPrefix, "")
+	demo_server.InitRouter(builder)
+}

+ 71 - 0
project/gateway/config/config.go

@@ -0,0 +1,71 @@
+package config
+
+import (
+	"fmt"
+	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"git.sxidc.com/go-tools/utils/strutils"
+	"git.sxidc.com/service-supports/fslog"
+	"git.sxidc.com/service-supports/scm-sdk"
+	"os"
+)
+
+type Config struct {
+	ApplicationConfig application.Config
+}
+
+var conf Config
+
+func init() {
+	useSCMEnv := os.Getenv("USE_SCM")
+	if useSCMEnv == "true" {
+		initConfigFromSCM()
+	} else {
+		initConfigFromConfigFile()
+	}
+}
+
+func GetConfig() Config {
+	return conf
+}
+
+func initConfigFromSCM() {
+	scmBaseUrl := loadEnvOrPanic("SCM_BASE_URL")
+	scmNamespace := loadEnvOrPanic("SCM_NAMESPACE")
+	scmName := loadEnvOrPanic("SCM_NAME")
+
+	info, err := scm_sdk.GetCurrentConfiguration(scmBaseUrl, scmNamespace, scmName)
+	if err != nil {
+		fslog.Error(err)
+		panic(err)
+	}
+
+	applicationConfig, err := application.LoadFromYaml(info.Content)
+	if err != nil {
+		panic(err)
+	}
+
+	conf.ApplicationConfig = applicationConfig
+
+	fslog.Info("Load config from scm finish")
+}
+
+func initConfigFromConfigFile() {
+	configFilePath := os.Getenv("CONFIG_FILE_PATH")
+	applicationConfig, err := application.LoadFromYamlFile(configFilePath)
+	if err != nil {
+		panic(err)
+	}
+
+	conf.ApplicationConfig = applicationConfig
+
+	fmt.Println("Load config file finish")
+}
+
+func loadEnvOrPanic(envName string) string {
+	envValue := os.Getenv(envName)
+	if strutils.IsStringEmpty(envValue) {
+		panic("请配置" + envName)
+	}
+
+	return envValue
+}

+ 3 - 0
project/gateway/deployment/config/config.yaml

@@ -0,0 +1,3 @@
+api:
+  url_prefix: /gateway/api
+  port: 32000

+ 8 - 48
project/gateway/main.go

@@ -1,66 +1,26 @@
 package main
 
 import (
-	"encoding/json"
-	"git.sxidc.com/go-framework/baize"
-	"git.sxidc.com/go-framework/baize/convenient/gateway"
-	"git.sxidc.com/go-framework/baize/framework/binding"
-	"git.sxidc.com/go-framework/baize/framework/core/api"
-	"git.sxidc.com/go-framework/baize/framework/core/application"
+	"baize-demo/project/gateway/api"
 	DEATH "github.com/vrecan/death"
-	"net/http"
 	"syscall"
 )
 
-func main() {
-	app := baize.NewApplication(application.Config{
-		ApiConfig: application.ApiConfig{
-			UrlPrefix: "/gateway/api",
-			Port:      "11000",
-		},
-	})
-
-	app.Api().
-		PrefixRouter().
-		RegisterVersionedRouter("v1")
-
-	gw := gateway.NewGateway()
-	defer gateway.DestroyGateway(gw)
-
-	v1Binder := binding.NewBinder(app.ChooseRouter(api.RouterPrefix, "v1"), app.Infrastructure())
-
-	gw.BodyMapping(v1Binder, &gateway.BodyMapping{
-		HttpMethod:   http.MethodPost,
-		RelativePath: "/class/create",
-		ToUrl:        "http://localhost:31000/example/api/v1/class/create",
-		BodyMappingFunc: func(body []byte) ([]byte, error) {
-			origin := make(map[string]any)
+// Version
+// curl -X GET "http://localhost:32000/gateway/api/version"
 
-			err := json.Unmarshal(body, &origin)
-			if err != nil {
-				return nil, err
-			}
-
-			origin["studentNum"] = origin["studentNum1"]
-			delete(origin, "studentNum1")
-
-			newBody, err := json.Marshal(origin)
-			if err != nil {
-				return nil, err
-			}
-
-			return newBody, nil
-		},
-	})
+func main() {
+	api.NewGateway()
+	defer api.DestroyGateway()
 
 	go func() {
-		if err := app.Start(); err != nil {
+		if err := api.Start(); err != nil {
 			panic(err)
 		}
 	}()
 
 	defer func() {
-		if err := app.Finish(); err != nil {
+		if err := api.Finish(); err != nil {
 			panic(err)
 		}
 	}()