2026-05-09 13:36:41 +08:00

64 lines
1.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package main 是 user-service 的进程入口,只负责配置加载、应用装配和信号退出。
package main
import (
"context"
"flag"
"log"
"os"
"os/signal"
"syscall"
"hyapp/pkg/logx"
"hyapp/services/user-service/internal/app"
"hyapp/services/user-service/internal/config"
)
// main 启动 user-service 进程。
func main() {
// config 参数只决定当前进程读取哪份 YAML具体依赖由 internal/app 统一装配。
configPath := flag.String("config", "services/user-service/configs/config.yaml", "path to user-service config")
flag.Parse()
// 配置加载失败直接终止避免以错误端口、JWT secret 或 MySQL 地址启动。
cfg, err := config.Load(*configPath)
if err != nil {
log.Fatal(err)
}
if err := logx.Init(cfg.Log.WithRuntimeFields(cfg.ServiceName, cfg.Environment, cfg.NodeID)); err != nil {
log.Fatal(err)
}
// App.New 会建立 MySQL repository、创建 auth/user service并注册 gRPC 服务。
application, err := app.New(cfg)
if err != nil {
fatalRuntime("app_new_failed", err)
}
// SIGINT/SIGTERM 是正常下线入口Close 内部会进入 draining 并 GracefulStop。
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()
// Run 阻塞在 gRPC listener运行期失败通过 errCh 回到主 goroutine。
errCh := make(chan error, 1)
go func() {
errCh <- application.Run()
}()
select {
case <-ctx.Done():
// 信号退出不视为错误,交给 App.Close 做资源释放。
application.Close()
case err := <-errCh:
if err != nil {
// listener 异常退出属于进程级失败,必须暴露给 supervisor。
fatalRuntime("service_run_failed", err)
}
}
}
func fatalRuntime(msg string, err error) {
logx.Error(context.Background(), msg, err)
os.Exit(1)
}