Solution 3: Working with gRPC
Let’s solve the challenge set in the previous lesson.
We'll cover the following...
Solution
Here is a RESTful service that uses gRPC for data exchange. To execute the RESTful service:
Open a new terminal window and execute the
rServer.gocode using the following commands:
export GOROOT=/usr/local/go; export GOPATH=$HOME/go; export PATH=$GOPATH/bin:$GOROOT/bin:$PATH; cd usercode;go run rServer.go
Then, open another terminal window and execute the following
curlcommands:
# curl http://localhost:8081/datetime# curl http://localhost:8081/randompassword# curl http://localhost:8081/randominteger
package main
import (
"context"
"github.com/gin-gonic/gin"
"google.golang.org/grpc"
"log"
"net/http"
"os"
"github.com/Educative-Content/protoapi"
)
var grpcServerAddress = "localhost:8082"
func main() {
router := gin.Default()
// Initialize a gRPC connection to the server
conn, err := grpc.Dial(grpcServerAddress, grpc.WithInsecure())
if err != nil {
log.Fatalf("Failed to connect to gRPC server: %v", err)
}
defer conn.Close()
client := protoapi.NewRandomClient(conn)
// Define RESTful API endpoints
router.GET("/datetime", func(c *gin.Context) {
ctx := context.Background()
response, err := client.GetDate(ctx, &protoapi.RequestDateTime{})
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"datetime": response.Value})
})
router.GET("/randompassword", func(c *gin.Context) {
ctx := context.Background()
response, err := client.GetRandomPass(ctx, &protoapi.RequestPass{Seed: 100, Length: 8})
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"password": response.Password})
})
router.GET("/randominteger", func(c *gin.Context) {
ctx := context.Background()
response, err := client.GetRandom(ctx, &protoapi.RandomParams{Seed: 100, Place: 1})
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"integer": response.Value})
})
port := getPort()
router.Run(":" + port)
}
func getPort() string {
if len(os.Args) > 1 {
return os.Args[1]
}
return "8081" // Default port
}
gServer.go and rServer,go
Code
... Ask