feat: first

This commit is contained in:
2025-08-13 19:36:09 +02:00
parent fd2ba2e999
commit 5fc4d1d997
17 changed files with 2622 additions and 111 deletions

View File

@@ -3,82 +3,45 @@ package main
import (
"context"
"log"
"net"
"net/http"
"sync"
"os"
"os/signal"
"syscall"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
helloworldpb "go-grpc-gateway-template/proto/helloworld"
"go-grpc-gateway-template/internal/config"
"go-grpc-gateway-template/internal/server"
)
type server struct {
helloworldpb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, req *helloworldpb.HelloRequest) (*helloworldpb.HelloReply, error) {
return &helloworldpb.HelloReply{
Message: "Hello " + req.GetName(),
}, nil
}
func main() {
// Create a listener on TCP port
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalln("Failed to listen:", err)
// Load configuration
cfg := config.Load()
if err := cfg.Validate(); err != nil {
log.Fatalf("Invalid configuration: %v", err)
}
// Create a gRPC server object
s := grpc.NewServer()
// Attach the Greeter service to the server
helloworldpb.RegisterGreeterServer(s, &server{})
// Create server
srv := server.New(cfg)
var wg sync.WaitGroup
wg.Add(2)
// Setup graceful shutdown
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Handle signals
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
// Serve gRPC server
log.Println("Serving gRPC on 0.0.0.0:8080")
go func() {
defer wg.Done()
if err := s.Serve(lis); err != nil {
log.Fatalln("Failed to serve:", err)
}
<-sigChan
log.Println("Received shutdown signal")
cancel()
}()
// Create a client connection to the gRPC server we just started
// This is where the gRPC-Gateway proxies the requests
conn, err := grpc.DialContext(
context.Background(),
"0.0.0.0:8080",
grpc.WithBlock(),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalln("Failed to dial server:", err)
// Start server
if err := srv.Start(ctx); err != nil {
log.Printf("Server error: %v", err)
}
gwmux := runtime.NewServeMux()
// Register Greeter
err = helloworldpb.RegisterGreeterHandler(context.Background(), gwmux, conn)
if err != nil {
log.Fatalln("Failed to register gateway:", err)
// Shutdown server
if err := srv.Shutdown(context.Background()); err != nil {
log.Printf("Shutdown error: %v", err)
}
gwServer := &http.Server{
Addr: ":8090",
Handler: gwmux,
}
log.Println("Serving gRPC-Gateway on http://0.0.0.0:8090")
go func() {
defer wg.Done()
if err := gwServer.ListenAndServe(); err != nil {
log.Fatalln("Failed to serve gRPC-Gateway:", err)
}
}()
wg.Wait()
}