【RPC】 gRPC、pb基本使用--经验与总结

使用 gRPC 和 Protocol Buffers 的 Go 示例:

1. 定义 .proto 文件

首先定义一个简单的 Greeter 服务,提供一个 SayHello 方法,接收 HelloRequest 和返回 HelloResponse:

go 复制代码
syntax = "proto3";

package greeting;

// 定义请求消息类型
message HelloRequest {
    string name = 1;
}

// 定义响应消息类型
message HelloResponse {
    string message = 1;
}

// 定义服务
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloResponse);
}

2. 生成 Go 代码

.proto 文件保存为 greeting.proto,使用 protoc 命令生成 Go 代码:

bash 复制代码
protoc --go_out=. --go-grpc_out=. greeting.proto

这将生成两个文件:

greeting.pb.go:包含消息类型。

greeting_grpc.pb.go:包含服务定义和客户端、服务器代码。

3. 实现 gRPC 服务器

使用生成的 Go 代码实现 gRPC 服务器端,处理请求。

go 复制代码
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"log"
	"net"

	"path/greeting" // 导入生成的 Go 包
)

type server struct {
	greeting.UnimplementedGreeterServer
}

// 实现 SayHello 方法
func (s *server) SayHello(ctx context.Context, req *greeting.HelloRequest) (*greeting.HelloResponse, error) {
	return &greeting.HelloResponse{
		Message: "Hello, " + req.Name + "!",
	}, nil
}

func main() {
	// 创建 gRPC 服务器
	grpcServer := grpc.NewServer()

	// 注册 Greeter 服务
	greeting.RegisterGreeterServer(grpcServer, &server{})

	// 启动监听
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	// 启动服务器
	fmt.Println("Server listening on port 50051...")
	if err := grpcServer.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

4. 实现 gRPC 客户端

客户端使用 gRPC 向服务器发起请求。

go 复制代码
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"log"

	"path/greeting" // 导入生成的 Go 包
)

func main() {
	// 创建 gRPC 客户端连接
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()

	// 创建 Greeter 客户端存根
	client := greeting.NewGreeterClient(conn)

	// 发送请求
	req := &greeting.HelloRequest{Name: "Alice"}
	res, err := client.SayHello(context.Background(), req)
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}

	// 输出响应
	fmt.Println("Greeter response:", res.GetMessage())
}

5. 运行示例

启动服务器:

bash 复制代码
go run server.go

服务器将监听 50051 端口。

启动客户端:

bash 复制代码
go run client.go

客户端向服务器发送请求,服务器返回问候信息。

输出示例:

bash 复制代码
Server listening on port 50051...
Greeter response: Hello, Alice!

总结

使用 Protocol Buffers 定义消息类型和服务接口。

通过 protoc 编译器生成 Go 代码。

通过 gRPC 框架实现服务器和客户端,并进行通信。

这样,Go 的 gRPC 服务就可以通过 Protocol Buffers 实现高效的远程过程调用。

相关推荐
GO兔19 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
代码讲故事1 天前
多种方法实现golang中实现对http的响应内容生成图片
开发语言·chrome·http·golang·图片·快照·截图
weixin_437398211 天前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang
Code季风1 天前
深入比较 Gin 与 Beego:Go Web 框架的两大选择
开发语言·golang·go·gin·beego
Code季风1 天前
Gin 中间件详解与实践
学习·中间件·golang·go·gin
九班长1 天前
Golang服务端处理Unity 3D游戏地图与碰撞的详细实现
3d·unity·golang
cui_win2 天前
【基础】Golang语言开发环境搭建(Linux主机)
linux·golang·运维开发
叹一曲当时只道是寻常2 天前
Softhub软件下载站实战开发(十):实现图片视频上传下载接口
golang·go·音视频
qq_168278952 天前
Protobuf在游戏开发中的应用:TypeScript + Golang 实践
服务器·golang·游戏引擎
大模型铲屎官12 天前
【Go语言-Day 7】循环控制全解析:从 for 基础到 for-range 遍历与高级控制
开发语言·人工智能·后端·golang·大模型·go语言·循环控制