Browse Source

grpc整理

shao 1 tuần trước cách đây
mục cha
commit
ee084608fe

+ 34 - 39
api/v1/config.go

@@ -1,9 +1,5 @@
 package v1
 
-import (
-	"log"
-)
-
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cast"
@@ -11,24 +7,23 @@ import (
 
 import (
 	"auth-server/common"
-	"auth-server/models"
 	"auth-server/service"
 )
 
-func GetConfigs(c *gin.Context) {
-	res, err := service.GetConfigList()
-	if err != nil {
-		common.HttpErr(c, err)
-		return
-	}
-	common.HttpSuccess(c, res)
-}
+//func GetConfigs(c *gin.Context) {
+//	res, err := service.GetConfigList()
+//	if err != nil {
+//		common.HttpErr(c, err)
+//		return
+//	}
+//	common.HttpSuccess(c, res)
+//}
 
 func GetConfigOptions(c *gin.Context) {
 	flag := c.Query("flag")
 	enable := cast.ToBool(c.Query("enable"))
 
-	res, err := service.GetConfigOptionList(common.GC2GM(c), flag, enable)
+	res, err := service.ResourceService.GetConfigOptionList(common.GC2GM(c), flag, enable)
 	if err != nil {
 		common.HttpErr(c, err)
 		return
@@ -42,29 +37,29 @@ func UpdateConfigItems(c *gin.Context) {
 		common.HttpErr(c, err)
 		return
 	}
-	for key, value := range items {
-		log.Printf("Key: %s, Value: %v", key, value)
-		var configItem models.ConfigItem
-		if err := models.DB.Model(&models.ConfigItem{}).First(&configItem, "uri = ?", key).Error; err != nil {
-			//todo 回滚
-			common.HttpErr(c, err)
-			return
-		} else {
-			//todo 校验 回滚
-			switch configItem.ValueType {
-			case "string":
-				configItem.Value = cast.ToString(value)
-			case "int":
-				configItem.Value = cast.ToString(cast.ToInt(value))
-			case "bool":
-				configItem.Value = cast.ToString(cast.ToBool(value))
-			}
-			err := models.DB.Save(&configItem).Error
-			if err != nil {
-				common.HttpErr(c, err)
-				return
-			}
-		}
-	}
-	common.HttpSuccess(c)
+	//for key, value := range items {
+	//	log.Printf("Key: %s, Value: %v", key, value)
+	//	var configItem models.ConfigItem
+	//	if err := models.DB.Model(&models.ConfigItem{}).First(&configItem, "uri = ?", key).Error; err != nil {
+	//		//todo 回滚
+	//		common.HttpErr(c, err)
+	//		return
+	//	} else {
+	//		//todo 校验 回滚
+	//		switch configItem.ValueType {
+	//		case "string":
+	//			configItem.Value = cast.ToString(value)
+	//		case "int":
+	//			configItem.Value = cast.ToString(cast.ToInt(value))
+	//		case "bool":
+	//			configItem.Value = cast.ToString(cast.ToBool(value))
+	//		}
+	//		err := models.DB.Save(&configItem).Error
+	//		if err != nil {
+	//			common.HttpErr(c, err)
+	//			return
+	//		}
+	//	}
+	//}
+	//common.HttpSuccess(c)
 }

+ 6 - 1
api/v1/public.go

@@ -14,7 +14,7 @@ func Ping(c *gin.Context) {
 }
 
 func SoftwareInfo(c *gin.Context) {
-	si := service.GetSoftwareInfo()
+	si := service.ResourceService.GetSoftwareInfo()
 	common.HttpSuccess(c, map[string]interface{}{
 		"server": map[string]interface{}{
 			"auth-server": map[string]interface{}{
@@ -27,6 +27,11 @@ func SoftwareInfo(c *gin.Context) {
 				"build":   si.GetBuild(),
 				"version": si.GetVersion(),
 			},
+			"study-server": map[string]interface{}{
+				"desc":    si.GetDesc(),
+				"build":   si.GetBuild(),
+				"version": si.GetVersion(),
+			},
 		},
 		"language": common.MetadataConfig.GetLanguages(),
 	})

+ 9 - 9
cmd/httpserver/server.go

@@ -1,6 +1,7 @@
 package httpserver
 
 import (
+	"auth-server/service"
 	"context"
 	"fmt"
 	"log/slog"
@@ -14,7 +15,6 @@ import (
 import (
 	"github.com/gin-gonic/gin"
 	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
 )
 
 import (
@@ -27,7 +27,7 @@ import (
 
 var (
 	configFolder string
-	port         int
+	addr         string
 	mode         string
 	StartCmd     = &cobra.Command{
 		Use:          "run",
@@ -45,10 +45,8 @@ var (
 
 func init() {
 	StartCmd.Flags().StringVarP(&configFolder, "config", "c", "config/", "Start server with provided configuration folder")
-	StartCmd.Flags().IntVarP(&port, "port", "p", 8000, "Tcp port server listening on")
+	StartCmd.Flags().StringVarP(&addr, "addr", "a", "0.0.0.0:6001", "Tcp server listening on")
 	StartCmd.Flags().StringVarP(&mode, "mode", "m", "debug", "server mode ; eg:debug,test,release")
-	viper.BindPFlag("port", StartCmd.Flags().Lookup("port"))
-	viper.BindPFlag("mode", StartCmd.Flags().Lookup("mode"))
 }
 
 func setup() {
@@ -60,23 +58,25 @@ func setup() {
 	}
 	configToml := configFolder + "/config.toml"
 	//1. 读取配置
-	common.SetupConfig(configToml)
+	common.SetupConfig(configToml, addr, mode)
 	//2. 设置日志
 	logger.SetupLogger(true)
 	//3. 初始化gorm
 	models.SetupGorm(true)
 	//4. 初始化i18n
 	common.SetupTrans()
+	//5. 初始化service
+	service.ResourceService.Setup()
 
 	slog.Info(`starting api server`, "pid", os.Getpid())
 }
 
 func run() error {
-	gin.SetMode(common.ApplicationConfig.Mode)
+	gin.SetMode(common.BasicConfig.Mode)
 	r := router.InitRouter()
 
 	srv := &http.Server{
-		Addr:    common.ApplicationConfig.Addr(),
+		Addr:    common.ServerConfig.Auth,
 		Handler: r,
 	}
 
@@ -93,7 +93,7 @@ func run() error {
 	slog.Info("version: " + common.Version)
 	slog.Info("build: " + common.Build)
 	slog.Info(fmt.Sprintf("Server run at: %s", common.Now()))
-	slog.Info(fmt.Sprintf("-  Network: http://%s:%d/ \n", common.ApplicationConfig.Host, common.ApplicationConfig.Port))
+	slog.Info(fmt.Sprintf("-  Network: http://%s/ \n", common.ServerConfig.Auth))
 	slog.Info("Enter Control + C Shutdown Server \n")
 
 	// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)

+ 31 - 25
common/config.go

@@ -12,27 +12,23 @@ import (
 //配置文件
 
 var (
-	ApplicationConfig = new(application)
-	BasicConfig       = new(basic)
-	LoggerConfig      = new(logger)
-	RobotConfig       = new(robot)
-	PostgresConfig    = new(postgres)
-	MetadataConfig    = new(metadata)
+	BasicConfig    = new(basic)
+	ServerConfig   = new(server)
+	LoggerConfig   = new(logger)
+	RobotConfig    = new(robot)
+	PostgresConfig = new(postgres)
+	MetadataConfig = new(metadata)
 )
 
 // 应用配置
-type application struct {
-	Host string
-	Port int
-	Mode string
-}
-
-func (p *application) Addr() string {
-	return fmt.Sprintf("%s:%d", p.Host, p.Port)
+type server struct {
+	Auth     string
+	Resource string
 }
 
 type basic struct {
-	Jwt string
+	Jwt  string
+	Mode string
 }
 
 // 日志配置
@@ -75,6 +71,7 @@ func (p *postgres) setup() {
 
 // metadata配置
 type metadata struct {
+	Locales   []string
 	Languages []Lang
 	Product   Product
 	Sources   []Source
@@ -110,14 +107,6 @@ func (p *metadata) GetSources() []Source {
 	return p.Sources
 }
 
-func InitApplication() *application {
-	return &application{
-		Host: viper.GetString("host"),
-		Port: viper.GetInt("port"),
-		Mode: viper.GetString("mode"),
-	}
-}
-
 func InitBasic(cfg *viper.Viper) *basic {
 	var basic basic
 	err := cfg.Unmarshal(&basic)
@@ -127,6 +116,15 @@ func InitBasic(cfg *viper.Viper) *basic {
 	return &basic
 }
 
+func InitServer(cfg *viper.Viper) *server {
+	var server server
+	err := cfg.Unmarshal(&server)
+	if err != nil {
+		panic("InitServer err")
+	}
+	return &server
+}
+
 func InitLog(cfg *viper.Viper) *logger {
 	var logger logger
 	err := cfg.Unmarshal(&logger)
@@ -168,12 +166,11 @@ func InitMetadata(cfg *viper.Viper) *metadata {
 }
 
 // 载入配置文件
-func SetupConfig(path string) {
+func SetupConfig(path string, addr string, mode string) {
 	viper.SetConfigFile(path)
 	if err := viper.ReadInConfig(); err != nil {
 		panic(err)
 	}
-	ApplicationConfig = InitApplication()
 
 	cfgBasic := viper.Sub("basic")
 	if cfgBasic == nil {
@@ -181,6 +178,15 @@ func SetupConfig(path string) {
 	}
 	BasicConfig = InitBasic(cfgBasic)
 
+	cfgServer := viper.Sub("server")
+	if cfgServer == nil {
+		panic("No found server in the configuration")
+	}
+	ServerConfig = InitServer(cfgServer)
+
+	BasicConfig.Mode = mode
+	ServerConfig.Auth = addr
+
 	cfgLog := viper.Sub("logger")
 	if cfgLog == nil {
 		panic("No found logger in the configuration")

+ 6 - 7
common/translator.go

@@ -16,13 +16,12 @@ func SetupTrans() {
 	slog.Info("setup trans")
 	bundle = i18n.NewBundle(language.English)
 	bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
-	_, err := bundle.LoadMessageFile("static/locale/common.en.toml")
-	if err != nil {
-		panic(err)
-	}
-	_, err = bundle.LoadMessageFile("static/locale/common.zh.toml")
-	if err != nil {
-		panic(err)
+	for _, filename := range MetadataConfig.Locales {
+		slog.Info("loading locale", "filename", filename)
+		_, err := bundle.LoadMessageFile(filename)
+		if err != nil {
+			panic(err)
+		}
 	}
 	slog.Info("setup trans ok")
 }

+ 10 - 5
config/config.toml.template

@@ -1,12 +1,13 @@
-host = "0.0.0.0"
-port = 6001
-mode = "debug" # 模式 debug | test | release
-
 [basic]
 jwt = "BOLQ3HoltjaQqAgWXAG6UXnq2OWGefzqYGwyiYJjAVmuDNyJAOZaFqK8cgQsUrhDA5WDVFuk0mqDRHAK"
+mode = "debug" # 模式 debug | test | release
+
+[server]
+auth = "0.0.0.0:6001"
+resource = "localhost:6102"
 
 [logger]
-logDir = "./logs/dr.log" # 日志存储目录
+logDir = "./logs/" # 日志存储目录
 logLevel = "debug" # 日志等级:debug; info; warn; error; fatal;
 maxSize = 10 # 在进行切割之前,日志文件的最大大小(以MB为单位)
 maxBackups = 100 # 最多保留文件个数
@@ -28,6 +29,10 @@ password = "24a4e49b95adb006fbadd7c5a74dbb2ee4d67d61abab"
 name = "mytestdatabase"
 
 [metadata]
+locales = [
+    "../locale/common.en.toml",
+    "../locale/common.zh.toml"
+]
 # 支持的语言,可选项:"en","zh"
 languages = ["en", "zh"]
 # 支持的产品,可选项:"droc","vetdroc"

+ 7 - 2
logger/logger.go

@@ -4,6 +4,7 @@ import (
 	"io"
 	"log/slog"
 	"os"
+	"strings"
 )
 
 import (
@@ -37,8 +38,12 @@ func SetupLogger(persisted bool) {
 		AddSource: true,
 	}
 
+	filename := common.LoggerConfig.LogDir + "/auth.log"
+	if strings.HasSuffix(common.LoggerConfig.LogDir, "/") {
+		filename = common.LoggerConfig.LogDir + "auth.log"
+	}
 	lumberJackLogger = &lumberjack.Logger{
-		Filename:   common.LoggerConfig.LogDir,     //日志文件的位置
+		Filename:   filename,                       //日志文件的位置
 		MaxSize:    common.LoggerConfig.MaxSize,    //在进行切割之前,日志文件的最大大小(以MB为单位)
 		MaxBackups: common.LoggerConfig.MaxBackups, //最多保留文件个数
 		MaxAge:     common.LoggerConfig.MaxAge,     //保留旧文件的最大天数
@@ -60,7 +65,7 @@ func SetupLogger(persisted bool) {
 
 	slog.Info("setup logger ok",
 		"level", level.String(),
-		"filename", common.LoggerConfig.LogDir,
+		"filename", filename,
 		"max size", common.LoggerConfig.MaxSize,
 		"max backups", common.LoggerConfig.MaxBackups,
 		"max age", common.LoggerConfig.MaxAge,

+ 0 - 53
models/initdata.go

@@ -1,53 +0,0 @@
-package models
-
-import (
-	"bufio"
-	"fmt"
-	"io/fs"
-	"log/slog"
-	"strings"
-)
-
-import (
-	"gorm.io/gorm"
-)
-
-import (
-	"auth-server/static"
-)
-
-func initConfigItem() error {
-	sqlFilePath := "config_items_202505221522.sql"
-	file, err := static.GetSqlFile(sqlFilePath)
-	if err != nil {
-		return fmt.Errorf("error opening SQL file: %w", err)
-	}
-	defer func(file fs.File) {
-		err := file.Close()
-		if err != nil {
-			slog.Error("error closing SQL file:", err)
-		}
-	}(file)
-
-	scanner := bufio.NewScanner(file)
-	err = DB.Transaction(func(tx *gorm.DB) error {
-		for scanner.Scan() {
-			line := strings.TrimSpace(scanner.Text())
-			result := tx.Exec(line)
-			if result.Error != nil {
-				return fmt.Errorf("error executing INSERT statement: %s\tError: %w", line, result.Error)
-			}
-		}
-
-		if err := scanner.Err(); err != nil {
-			return fmt.Errorf("error reading SQL file: %w", err)
-		}
-		return nil
-	})
-	if err != nil {
-		return err
-	}
-
-	slog.Info("Processed SQL file: %s.\n", sqlFilePath)
-	return nil
-}

+ 0 - 14
models/model.go

@@ -36,17 +36,3 @@ func (u *User) CompareHashAndPassword(password []byte) bool {
 	}
 	return true
 }
-
-type ConfigItem struct {
-	gorm.Model
-	Group        string `gorm:"index"`
-	Key          string
-	Value        string
-	OptionKey    string
-	ValueType    string
-	Description  string
-	Order        int
-	IsEnabled    bool
-	Uri          string `gorm:"uniqueIndex"`
-	DefaultValue string
-}

+ 0 - 7
models/setup.go

@@ -36,13 +36,6 @@ func migrate() {
 		newAdmin.GenerateFromPassword([]byte("123456"))
 		DB.Create(&newAdmin)
 	}
-
-	panicHelper(DB.AutoMigrate(&ConfigItem{}))
-	var count int64
-	DB.Model(&ConfigItem{}).Count(&count)
-	if count == 0 {
-		panicHelper(initConfigItem())
-	}
 }
 
 func SetupGorm(m bool) {

+ 2 - 2
router/router.go

@@ -1,8 +1,8 @@
 package router
 
 import (
-	"github.com/gin-gonic/gin"
 	apiv1 "auth-server/api/v1"
+	"github.com/gin-gonic/gin"
 )
 
 func InitRouter() *gin.Engine {
@@ -26,7 +26,7 @@ func InitRouter() *gin.Engine {
 	{
 		configV1 := authV1.Group("/configs")
 		{
-			configV1.GET("items", apiv1.GetConfigs)
+			//configV1.GET("items", apiv1.GetConfigs)
 			configV1.GET("options", apiv1.GetConfigOptions)
 			configV1.POST("items", apiv1.UpdateConfigItems)
 		}

+ 0 - 29
service/config.go

@@ -1,29 +0,0 @@
-package service
-
-import (
-	"auth-server/dto"
-	"auth-server/models"
-)
-
-func GetConfigList() ([]*dto.ConfigResp, error) {
-	res := []*dto.ConfigResp{}
-	var items []*models.ConfigItem
-	query := models.DB.Model(&models.ConfigItem{})
-	err := query.Order("id").Find(&items).Error
-	if err != nil {
-		return res, err
-	}
-	for _, c := range items {
-		res = append(res, &dto.ConfigResp{
-			Key:         c.Key,
-			Value:       c.Value,
-			OptionKey:   c.OptionKey,
-			ValueType:   c.ValueType,
-			Description: c.Description,
-			Order:       c.Order,
-			IsEnabled:   c.IsEnabled,
-			Uri:         c.Uri,
-		})
-	}
-	return res, nil
-}

+ 24 - 19
service/pb_resource.go

@@ -1,40 +1,45 @@
 package service
 
 import (
-	pb "auth-server/rpc_idl/dr_resource_pb"
 	"context"
+	"log/slog"
+)
+import (
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
-	healthpb "google.golang.org/grpc/health/grpc_health_v1"
-	"log/slog"
 )
 
-var basicClient pb.BasicClient
-var configClient pb.ConfigClient
+import (
+	"auth-server/common"
+	pb "auth-server/rpc_idl/dr_resource_pb"
+)
+
+var ResourceService *Resource
 
 func init() {
-	addr := "localhost:6102"
+	ResourceService = new(Resource)
+}
 
-	conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
+type Resource struct {
+	basicClient  pb.BasicClient
+	configClient pb.ConfigClient
+}
+
+func (s *Resource) Setup() {
+	conn, err := grpc.NewClient(common.ServerConfig.Resource, grpc.WithTransportCredentials(insecure.NewCredentials()))
 	if err != nil {
 		slog.Error("NewClient failed:", err)
 		panic(err)
 	}
 	slog.Info("resource conn success", "conn", conn.GetState())
 
-	basicClient = pb.NewBasicClient(conn)
-	configClient = pb.NewConfigClient(conn)
-	resp, err := healthpb.NewHealthClient(conn).Check(context.Background(), &healthpb.HealthCheckRequest{Service: ""})
-	if err != nil {
-		slog.Error("Check failed:", err)
-		return
-	}
-	slog.Info("Check success", "resp", resp.GetStatus())
+	s.basicClient = pb.NewBasicClient(conn)
+	s.configClient = pb.NewConfigClient(conn)
 }
 
-func GetSoftwareInfo() *pb.SoftwareInfoReply {
+func (s *Resource) GetSoftwareInfo() *pb.SoftwareInfoReply {
 	slog.Info("[rpc]SoftwareInfo...")
-	r, err := basicClient.SoftwareInfo(context.Background(), &pb.EmptyRequest{})
+	r, err := s.basicClient.SoftwareInfo(context.Background(), &pb.EmptyRequest{})
 	if err != nil {
 		slog.Error("[rpc]SoftwareInfo failed:", err)
 		return &pb.SoftwareInfoReply{
@@ -47,9 +52,9 @@ func GetSoftwareInfo() *pb.SoftwareInfoReply {
 	return r
 }
 
-func GetConfigOptionList(ctx context.Context, flag string, enable bool) ([]*pb.ConfigOption, error) {
+func (s *Resource) GetConfigOptionList(ctx context.Context, flag string, enable bool) ([]*pb.ConfigOption, error) {
 	slog.Info("[rpc]GetConfigOptionList...")
-	r, err := configClient.ConfigOptionList(ctx, &pb.ConfigOptionListRequest{
+	r, err := s.configClient.ConfigOptionList(ctx, &pb.ConfigOptionListRequest{
 		Flag:      flag,
 		IsEnabled: enable,
 	})