package main import ( "flag" "log/slog" "os" "path/filepath" "kra/internal/conf" "kra/internal/server" "github.com/go-kratos/kratos/contrib/otel/v3/tracing" "github.com/go-kratos/kratos/v3" "github.com/go-kratos/kratos/v3/config" "github.com/go-kratos/kratos/v3/config/file" "github.com/go-kratos/kratos/v3/log" "github.com/go-kratos/kratos/v3/transport/grpc" _ "go.uber.org/automaxprocs" ) // go build -ldflags "-X main.Version=x.y.z" var ( // Name is the name of the compiled software. Name string // Version is the version of the compiled software. Version string // flagconf is the config flag. flagconf string id, _ = os.Hostname() ) func init() { flag.StringVar(&flagconf, "conf", "../../configs", "config path, eg: -conf config.yaml") } func newApp(logger *slog.Logger, gs *grpc.Server, hs *server.GinServer, scheduler *server.TaskScheduler) *kratos.App { return kratos.New( kratos.ID(id), kratos.Name(Name), kratos.Version(Version), kratos.Metadata(map[string]string{}), kratos.Logger(logger), kratos.Server( gs, hs, scheduler, ), ) } func main() { flag.Parse() logger := log.NewLogger( slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ AddSource: true, Level: slog.LevelInfo, }), log.WithExtractor(tracing.TraceAttrs), ).With( slog.String("service.id", id), slog.String("service.name", Name), slog.String("service.version", Version), ) log.SetDefault(logger) c := config.New( config.WithSource( file.NewSource(flagconf), ), ) defer c.Close() if err := c.Load(); err != nil { panic(err) } var bc conf.Bootstrap if err := c.Scan(&bc); err != nil { panic(err) } if bc.Admin != nil { bc.Admin.ConfigPath = flagconf if info, err := os.Stat(flagconf); err == nil && info.IsDir() { bc.Admin.ConfigPath = filepath.Join(flagconf, "config.yaml") } } app, cleanup, err := wireApp(bc.Server, bc.Data, bc.Admin, logger) if err != nil { panic(err) } defer cleanup() // start and wait for stop signal if err := app.Run(); err != nil { panic(err) } }