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

相关推荐
microrain6 小时前
读数是 1008,用电量是 8:SagooIoT 计算服务的增量口径与七种计算策略
物联网·golang·计算服务·sagooiot
看浪的路人8 小时前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
灯澜忆梦11 小时前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
不是万能的豆学长13 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
tachibana213 小时前
Go 语言 Map 的底层实现原理
开发语言·后端·golang·make
tachibana215 小时前
Go语言里slice是怎么扩容的?
后端·golang·go·切片
西瓜很甜哟15 小时前
golang实现大文件分片上传
后端·golang·html
tachibana21 天前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
王中阳Go1 天前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
for_ever_love__2 天前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索