[Protobuf 篇] Protobuf开发环境安装与开发流程(GRPC)

grpc是一套由谷歌Google公司开发并开源的RPC(远程过程调用)框架,特点是突破了语言限制,任何语言均可无障碍调用,提高了网络应用开发效率。
目前该框架的最新使用版本为 proto3 (protocol buffers)。

1. protobuf 安装

参考网站: gRPC - go

1.1 安装 protoc 编译器

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1

1.2 获取grpc包

go get google.golang.org/grpc

若无 go mod 则会安装到 $GOPATH/src

2. 创建 XXX.proto 文件编译生成 go 代码

2.2 创建目录如下

protobuf开发框架工程目录

2.2 创建 XXX.proto 文件

// /pb/hello_grpc.proto 事例

syntax = "proto3";  // 语法格式 proto3

package hello_grpc;  // 包名

option go_package="./;hello_grpc";  // 指定 "包路径(从mod下开始写);别名"

// 请求包
message Req {
    string message = 1;
}

// 响应包
message Res {
    string message = 1;
}

// 服务函数
service HelloGRPC {
	rpc SayHi(Req) returns (Res);
}

2.3 创建脚本编译 XXX.proto 文件生成 go 代码

protoc --go_out=[XXX.pb.go文件生成路径] --go_opt=paths=source_relative --go-grpc_out=[XXX_grpc.pb.go文件生成路径] --go-grpc_opt=paths=source_relative [XXX.proto文件所在路径]

Windows 系统可创建 .bat 脚本文件运行,Linux / Mac 系统可创建 .sh 脚本文件运行。

3. 创建服务端 Server 和客户端 Client 调用 gRPC

3.1 服务端 Server 代码

// server/main.go
package main

// 1. 创建server结构体 继承grpc的server (需要引入包)
type server struct {
	hello_grpc.UnimplementedHelloGRPCServer
}

// 2. 重写 grpc 中定义的方法
func (s *server) SayHi(context context.Context, req *Req) (*Res, error) {
	message := req.GetMessage()
	fmt.Println(message)
	return &hello_grpc.Res{Message: message + " 请求的响应"}, nil
}

// 3. 在main函数中注册服务
func main() {
	// 3.1 获取监听器
	lis, err := net.Listen("tcp", ":8888")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 3.2 新建一个grpc服务器
	s := grpc.NewServer()
	// 3.3 注册服务
	hello_grpc.RegisterHelloGRPCServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	// 3.4 启动服务
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

官方 server 事例: 官方 server

启动 server ,等待客户端 client 的请求。

3.2 客户端 Client 代码

// client/main.go
package main

// 直接创建连接 调用grpc服务 (需要引包)
func main() {
	// 1. 创建连接 conn (指定安全性)
	conn, err := grpc.Dial("localhost:8888", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	// 2. 创建grpc客户端 用于调用服务
	client := hello_grpc.NewHelloGRPCClient(conn)

	// 3. 调用服务
	res, err := client.SayHi(context.Background(), &hello_grpc.Req{Message: "我从客户端来"})
	if err != nil {
		log.Fatalf("error: %v", err)
		return
	}
	fmt.Println(res.GetMessage())
}

官方 client 事例:官方 client

启动 client ,向 server 发起请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值