使用
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/ginproto 文件
- protoc (需要单独下载,并指定环境变量: https://github.com/protocolbuffers/protobuf/releases)
- protoc-gen-go (需要单独下载,并指定环境变量)
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()
}