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

相关推荐
参.商.3 小时前
【Day 27】121.买卖股票的最佳时机 122.买卖股票的最佳时机II
leetcode·golang
牛奔3 小时前
如何理解 Go 的调度模型,以及 G / M / P 各自的职责
开发语言·后端·golang
牛奔5 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
清云随笔7 小时前
Golang基础
golang
牛奔10 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
不老刘14 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
Tony Bai21 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
念何架构之路1 天前
Go进阶之panic
开发语言·后端·golang
先跑起来再说1 天前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
Tony Bai1 天前
“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?
开发语言·后端·golang