Skip to content

使用

go mod

sh
cd {your_target_dir}

go mod init demo.grpc

依赖

sh
go get google.golang.org/grpc
go get google.golang.org/protobuf

go get github.com/gin-gonic/gin

proto 文件

proto
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
  • windows 需要将生成 工具添加到环境变量中:
which go

where go

找到bin目录,将bin目录添加到环境变量中

sh
xxx/bin

编写 proto 文件:

proto
syntax = "proto3";

package hello;
option go_package="./;proto";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

需要注意的是: option 选项, 也就是指定生成 go 文件的包名字。

生成:

sh
protoc --go_out=. --go-grpc_out=. --proto_path=proto proto/hello.proto

两个服务

  • grpc 服务
  • gin 服务

gin 服务

go
package server

import (
	"context"
	"log"

	"demo.grpc/proto"
	"github.com/gin-gonic/gin"
	"google.golang.org/grpc"
)

func StartGinServer() {
	router := gin.Default()

	// Connect to gRPC server
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()

	client := proto.NewGreeterClient(conn)

	// Define Gin route
	router.GET("/hello/:name", func(c *gin.Context) {
		name := c.Param("name")
		req := &proto.HelloRequest{Name: name}

		// Call gRPC service
		res, err := client.SayHello(context.Background(), req)
		if err != nil {
			c.JSON(500, gin.H{"error": err.Error()})
			return
		}

		// Return response
		c.JSON(200, gin.H{
			"message": res.Message,
		})
	})

	router.Run(":8080")
}

grpc 服务

go
package server

import (
	"context"
	"fmt"
	"log"
	"net"

	"demo.grpc/proto"
	"google.golang.org/grpc"
)

type GreeterServer struct {
	proto.UnimplementedGreeterServer
}

func (s *GreeterServer) SayHello(ctx context.Context, req *proto.HelloRequest) (*proto.HelloResponse, error) {
	return &proto.HelloResponse{
		Message: fmt.Sprintf("Hello, %s!", req.Name),
	}, nil
}

func StartGRPCServer() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	grpcServer := grpc.NewServer()
	proto.RegisterGreeterServer(grpcServer, &GreeterServer{})
	fmt.Println("gRPC server started on port 50051")
	if err := grpcServer.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

主应用

go
package main

import (
	"demo.grpc/server"
)

func main() {
	// 启动 gRPC 服务器
	go server.StartGRPCServer()

	// 启动 Gin 服务器
	server.StartGinServer()
}