// CLIENT RPC // FULL SOURCE: https://github.com/restuwahyu13/go-grpc-gateway package main import ( "context" "encoding/json" "log" "net/http" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" "github.com/restuwahyu13/grpc-gateway-example/schemas/users" ) type clientUserService struct { client users.UsersClient } func main() { HttpClient() } /** ================================================================ = HTTP CLIENT TERITORY ================================================================ */ func HttpClient() { var ( server users.UnimplementedUsersServer = users.UnimplementedUsersServer{} client users.UsersClient = GRPCClient() mux *runtime.ServeMux = runtime.NewServeMux() ) err := users.RegisterUsersHandlerServer(context.Background(), mux, &server) if err != nil { log.Fatal(err) return } err = users.RegisterUsersHandlerClient(context.Background(), mux, client) if err != nil { log.Fatal(err) return } mux.HandlePath(http.MethodPost, "/login", func(w http.ResponseWriter, r *http.Request, _ map[string]string) { var ( req users.LoginDTO res users.ApiResponse ) w.Header().Set("Content-Type", "application/json") if err := json.NewDecoder(r.Body).Decode(&req); err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } rpc, err := client.AuthLogin(r.Context()) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } if err := rpc.SendMsg(&req); err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } if err := rpc.RecvMsg(&res); err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } json.NewEncoder(w).Encode(&res) }) http.ListenAndServe(":3000", mux) } /** ================================================================ = RPC CLIENT TERITORY ================================================================ */ func GRPCClient() users.UsersClient { ls, err := grpc.Dial(":30000", grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatal(err) return nil } client := users.NewUsersClient(ls) return &clientUserService{client: client} } func (h *clientUserService) AuthLogin(ctx context.Context, opts ...grpc.CallOption) (users.Users_AuthLoginClient, error) { login, err := h.client.AuthLogin(ctx) if err != nil { return nil, err } return login, nil }// SERVER RPC // FULL SOURCE: https://github.com/restuwahyu13/go-grpc-gateway package main import ( "fmt" "log" "net" "net/http" "google.golang.org/grpc" "github.com/restuwahyu13/grpc-gateway-example/schemas/users" ) const ( TCP = "tcp" UDPConn = "udp" UNIXConn = "unix" UNIXPACKET = "unixpacket" ) type serverUserService struct { users.UnimplementedUsersServer } func main() { GRPCServer() } /** ================================================================ = SERVER TERITORY ================================================================ */ func GRPCServer() { ls, err := net.Listen(TCP, ":30000") if err != nil { log.Fatal(err) return } server := grpc.NewServer() users.RegisterUsersServer(server, &serverUserService{}) server.Serve(ls) } func (h *serverUserService) AuthLogin(stream users.Users_AuthLoginServer) error { var ( req users.LoginDTO res users.ApiResponse ) if err := stream.RecvMsg(&req); err != nil { defer log.Fatal(err) return err } log.Println("REQUEST FROM CLIENT: ", req.Email) res.StatCode = http.StatusOK res.StatMessage = "Success" if err := stream.Send(&res); err != nil { defer log.Fatal(err) return err } return nil }