【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 实现高效的远程过程调用。

相关推荐
李燚21 分钟前
Eino 的 ReAct 循环是怎么跑起来的:图、节点、分支
golang·agent·react·ai-agent
Hiter_John4 小时前
Golang的运算符
开发语言·后端·golang
Hiter_John5 小时前
Golang的变量常量初始化
开发语言·后端·golang
必胜刻8 小时前
一个异步生成游戏功能的落地复盘:Redis Stream + WebSocket + 状态补偿
redis·websocket·golang·gin·状态补偿
绛洞花主敏明11 小时前
Go操作xorm中间表多对多关联实战
开发语言·后端·golang
pursue.dreams11 小时前
Windows系统Golang超详细安装配置教程(2026最新、零基础)
开发语言·windows·golang
小小龙学IT11 小时前
Go 后端并发实战:从 goroutine 到流水线架构
开发语言·架构·golang
Hiter_John13 小时前
Golang的循环语句
开发语言·算法·golang
绍磊leo14 小时前
Go 实现类似 FastAPI 的后端服务:从入门到实战
开发语言·golang
Hiter_John14 小时前
Golang的条件判断
服务器·开发语言·golang