gRPC教程 — 调用实例详解

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

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.gohello_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值