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

相关推荐
止语Lab2 小时前
Go vs Java GC:同一场延迟战争的两条路
java·开发语言·golang
MmeD UCIZ4 小时前
GO 快速升级Go版本
开发语言·redis·golang
mOok ONSC5 小时前
对基因列表中批量的基因进行GO和KEGG注释
开发语言·数据库·golang
Achou.Wang7 小时前
go语言中类型别名和定义类型之间的区别
服务器·golang
geovindu8 小时前
go: Composite Pattern
设计模式·golang·组合模式
XMYX-08 小时前
18 - Go 等待协程:WaitGroup 使用与坑
开发语言·golang
XMYX-09 小时前
19 - Go 并发限制:限流与控制并发数
开发语言·golang
geovindu10 小时前
go: Singleton Pattern
单例模式·设计模式·golang
U盘失踪了1 天前
Go 结构体
笔记·golang
贺小涛1 天前
python和golang进程、线程、协程区别
java·python·golang