xxxxxxxxxx
// 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
}
xxxxxxxxxx
// 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
}