@@ -10,7 +10,9 @@ import (
1010 _ "github.com/lib/pq"
1111 "github.com/opencars/schema/client"
1212 "github.com/opencars/seedwork/logger"
13+ "golang.org/x/sync/errgroup"
1314
15+ "github.com/opencars/koatuu/pkg/api/grpc"
1416 "github.com/opencars/koatuu/pkg/api/http"
1517 "github.com/opencars/koatuu/pkg/config"
1618 "github.com/opencars/koatuu/pkg/domain/service"
@@ -19,7 +21,8 @@ import (
1921
2022func main () {
2123 cfg := flag .String ("config" , "config/config.yaml" , "Path to the configuration file" )
22- port := flag .Int ("port" , 8080 , "Port of the server" )
24+ httpPort := flag .Int ("http-port" , 8080 , "Port for HTTP server" )
25+ grpcPort := flag .Int ("grpc-port" , 3000 , "Port for gRPC server" )
2326
2427 flag .Parse ()
2528
@@ -30,6 +33,13 @@ func main() {
3033
3134 logger .NewLogger (logger .LogLevel (conf .Log .Level ), conf .Log .Mode == "dev" )
3235
36+ // Initialize store
37+ store , err := sqlstore .New (& conf .DB )
38+ if err != nil {
39+ logger .Fatalf ("store: %v" , err )
40+ }
41+
42+ // Initialize NATS client
3343 c , err := client .New (conf .NATS .Address ())
3444 if err != nil {
3545 logger .Fatalf ("nats: %v" , err )
@@ -40,20 +50,36 @@ func main() {
4050 logger .Fatalf ("producer: %v" , err )
4151 }
4252
43- store , err := sqlstore .New (& conf .DB )
44- if err != nil {
45- logger .Fatalf ("store: %v" , err )
46- }
47-
48- svc := service .NewCustomerService (store , producer )
49-
50- addr := ":" + strconv .Itoa (* port )
53+ // Create services
54+ customerSvc := service .NewCustomerService (store , producer )
55+ internalSvc := service .NewInternalService (store )
5156
57+ // Create context with cancellation
5258 ctx , stop := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
5359 defer stop ()
5460
55- logger .Infof ("Listening on %s..." , addr )
56- if err := http .Start (ctx , addr , & conf .Server , svc ); err != nil {
57- logger .Fatalf ("http server failed: %v" , err )
61+ // Create errgroup with cancellation
62+ g , ctx := errgroup .WithContext (ctx )
63+
64+ // Start HTTP server
65+ g .Go (func () error {
66+ addr := ":" + strconv .Itoa (* httpPort )
67+ logger .Infof ("Starting HTTP server on %s..." , addr )
68+ return http .Start (ctx , addr , & conf .Server , customerSvc )
69+ })
70+
71+ // Start gRPC server
72+ g .Go (func () error {
73+ addr := ":" + strconv .Itoa (* grpcPort )
74+ logger .Infof ("Starting gRPC server on %s..." , addr )
75+ api := grpc .New (addr , internalSvc )
76+ return api .Run (ctx )
77+ })
78+
79+ // Wait for interrupt signal or error from servers
80+ logger .Infof ("Servers started successfully. Press Ctrl+C to stop..." )
81+ if err := g .Wait (); err != nil {
82+ logger .Fatalf ("Server error: %v" , err )
5883 }
84+ logger .Infof ("Servers stopped gracefully" )
5985}
0 commit comments