gRPC教程 — 调用实例详解
1 项目结构
完整的项目结构
├─grpc01
│ │ go.mod
│ │ go.sum
│ │
│ ├─client
│ │ ├─client.go
│ │
│ ├─pbfile
│ │ │ hello.proto
│ │
│ └─server
│ ├─server.go
│ │
│ └─service
│ ├─hello.pb.go
│ ├─hello_grpc.pb.go
│

2 Protobuf
syntax = "proto3";
package service;
option go_package = '../service';
// 定义request model
message ProductRequest {
int32 prod_id = 1; // 1代表顺序
}
// 定义response model
message ProductResponse {
int32 prod_stock = 1; // 1代表顺序
}
// 定义服务主体
service ProdService {
// 定义方法
rpc GetProductStock(ProductRequest) returns(ProductResponse);
}
执行:
protoc --go_out=. --go-grpc_out=. *.proto
然后会生成service文件夹hello.pb.go,hello_grpc.pb.go
hello.pb.go:结构体相关,每个结构体都有5个相同的方法,分别是Reset()、String()、ProtoMessage()、ProtoReflect()、Descriptor() ;
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.19.4
// source: hello.proto
package service
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// 定义request model
type ProductRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ProdId int32 `protobuf:"varint,1,opt,name=prod_id,json=prodId,proto3" json:"prod_id,omitempty"` // 1代表顺序
}
func (x *ProductRequest) Reset() {
*x = ProductRequest{
}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ProductRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ProductRequest) ProtoMessage() {
}
func (x *ProductRequest) ProtoReflect() protoreflect.Message {
mi := &file_hello_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ProductRequest.ProtoReflect.Descriptor instead.
func (*ProductRequest) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{
0}
}
func (x *ProductRequest) GetProdId() int32 {
if x != nil {
return x.ProdId
}
return 0
}
// 定义response model
type ProductResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ProdStock int32 `protobuf:"varint,1,opt,name=prod_stock,json=prodStock,proto3" json:"prod_stock,omitempty"` // 1代表顺序
}
func (x *ProductResponse) Reset() {
*x = ProductResponse{
}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ProductResponse) String() string {
return protoimpl.X.MessageStringOf

本文详细介绍了gRPC的基本概念和使用步骤,包括项目目录结构、protobuf文件定义、服务端与客户端的代码生成及实现。通过一个具体的ProductService示例,展示了如何定义请求和响应模型,以及如何实现RPC调用。服务端需要创建结构体并实现接口,客户端则负责建立连接并调用远程方法。

2678

被折叠的 条评论
为什么被折叠?



