第一部分:grpc使用样例介绍
使用grpc编写一个服务分如下三步:
- 编写一个“.proto”文件,在该“.proto”文件中定义相关服务
- 用protoc生成服务端和客户端共享的.pb.go文件
- 实现一个简单的grpc客户端和grpc服务器
一:环境准备
由“.proto”文件生成.pb.go文件,依赖protoc编译器、protoc编译器go插件及grpc-go第三方库文件
- 安装protoc
▪️ https://github.com/protocolbuffers/protobuf/releases,官网下载最新版protocol Buffers压缩包,并解压
▪️ 命令cd跳转至解压缩,依次执行“./configure”命令、“make”命令、“make check”命令、“sudo make install”命令
▪️ 通过“protoc --version”命令检测是否安装成功 - 安装go插件
▪️ go get -u github.com/golang/protobuf/protoc-gen-go - grpc-go 第三方库下载
▪️ go get -u google.golang.org/grpc
二:样例文件及代码
自定义grpc文件夹,文件目录如下:
--grpc
--proto
--hello.proto
--hello.pb.go
--grpc_server.go
--grpc_client.go
1:构建hello.proto文件并生成hello.pb.go文件
hello.proto文件
syntax = "proto3";
package proto;
message Request{
string message=1;
}
message Reply{
string message=1;
}
service Hello{
rpc SayHello(Request)returns (Reply){
}
}
grpc/proto文件目录下执行“protoc --go_out=plugins=grpc:. hello.proto “生成hello.pb.go文件。hello.pb.go文件中主要包含以下内容:
- 服务端(helloServer)相关数据结构及服务函数
- 客户端(helloClient)相关数据结构及服务函数
- 客户端和服务端进行数据交互相关的消息初始化、传递、接收的数据结构及函数
注意:此步骤可能出现问题如下:
可能出现的问题:
问题1: undefined: proto.ProtoPackageIsVersion3
解决方案(更新protoc go插件至最新版本):
go get -u github.com/golang/protobuf/protoc-gen-go
问题2: undefined: grpc.SupportPackageIsVersion6
解决方案(更新grpc包至最新版本):
go get -u google.golang.org/grpc
▪️ hello.pb.go文件
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: hello.proto
package proto
import (
context "context"
fmt "fmt"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
)
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
const _ = proto.ProtoPackageIsVersion3
/********客户端和服务端交互request相关*********/
type Request struct {
Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
XXX_NoUnkeyedLiteral struct{
} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Request) Reset() {
*m = Request{
} }
func (m *Request) String() string {
return proto.CompactTextString(m) }
func (*Request) ProtoMessage() {
}
func (*Request) Descriptor() ([]byte, []int