grpc示例代码解析(一)

本文详细解析gRPC的route_guide示例,包括route_guide.proto定义,客户端route_guide.pb.go文件以及服务端route_guide_grpc.pb.go的实现。通过对这些文件的解读,深入理解gRPC的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、route_guide.proto文件

主要内容在注释部分


// proto 语法版本
syntax = "proto3";

// 生成的 go 包路径,最后路径为包名
option go_package = "google.golang.org/grpc/examples/route_guide/routeguide";

// java 相关选项
option java_multiple_files = true;
option java_package = "io.grpc.examples.routeguide";
option java_outer_classname = "RouteGuideProto";

// 包名
package routeguide;

// 服务接口定义
service RouteGuide {
  // 双端一元式
  rpc GetFeature(Point) returns (Feature) {}

  // 服务端流式
  rpc ListFeatures(Rectangle) returns (stream Feature) {}

  // 客户端流式
  rpc RecordRoute(stream Point) returns (RouteSummary) {}

  // 双端双流式
  rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}

// 消息定义
message Point {
  // 类型、名称、序号
  int32 latitude = 1;
  int32 longitude = 2;
}

message Rectangle {
  // 消息嵌套
  Point lo = 1;
  Point hi = 2;
}

message Feature {
  string name = 1;
  Point location = 2;
}

message RouteNote {
  Point location = 1;
  string message = 2;
}

message RouteSummary {
  int32 point_count = 1;
  int32 feature_count = 2;
  int32 distance = 3;
  int32 elapsed_time = 4;
}

二、route_guide.pb.go 客户端文件


package routeguide

import (
	proto "github.com/golang/protobuf/proto"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

// 生成的版本验证
const (
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

const _ = proto.ProtoPackageIsVersion4

// Point Point message 生成的结构体和方法
type Point struct {
   
	// 它提供了一种不用分配就能实现ProtoReflect方法的方法,而不需要为每个消息类型生成一个shadow Go类型。这种技术只在不安全的情况下有效。
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Latitude  int32 `protobuf:"varint,1,opt,name=latitude,proto3" json:"latitude,omitempty"`
	Longitude int32 `protobuf:"varint,2,opt,name=longitude,proto3" json:"longitude,omitempty"`
}

func (x *Point) Reset() {
   
	*x = Point{
   }
	if protoimpl.UnsafeEnabled {
   
		mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Point) String() string {
   
	return protoimpl.X.MessageStringOf(x)
}

func (*Point) ProtoMessage() {
   }

func (x *Point) ProtoReflect() protoreflect.Message {
   
	mi := &file_examples_route_guide_routeguide_route_guide_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)
}

func (*Point) Descriptor() ([]byte, []int) {
   
	return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
   0}
}

func (x *Point) GetLatitude() int32 {
   
	if x != nil {
   
		return x.Latitude
	}
	return 0
}

func (x *Point) GetLongitude() int32 {
   
	if x != nil {
   
		return x.Longitude
	}
	return 0
}

// Rectangle Rectangle message 生成的结构体和方法
type Rectangle struct {
   
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Lo *Point `protobuf:"bytes,1,opt,name=lo,proto3" json:"lo,omitempty"`
	Hi *Point `protobuf:"bytes,2,opt,name=hi,proto3" json:"hi,omitempty"`
}

func (x *Rectangle) Reset() {
   
	*x = Rectangle{
   }
	if protoimpl.UnsafeEnabled {
   
		mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Rectangle) String() string {
   
	return protoimpl.X.MessageStringOf(x)
}

func (*Rectangle) ProtoMessage() {
   }

func (x *Rectangle) ProtoReflect() protoreflect.Message {
   
	mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[1]
	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)
}

func (*Rectangle) Descriptor() ([]byte, []int) {
   
	return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
   1}
}

func (x *Rectangle) GetLo() *Point {
   
	if x != nil {
   
		return x.Lo
	}
	return nil
}

func (x *Rectangle) GetHi() *Point {
   
	if x != nil {
   
		return x.Hi
	}
	return nil
}

// Feature Feature message 生成的结构体和方法
type Feature struct {
   
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Location *Point `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
}

func (x *Feature) Reset() {
   
	*x = Feature{
   }
	if protoimpl.UnsafeEnabled {
   
		mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Feature) String() string {
   
	return protoimpl.X.MessageStringOf(x)
}

func (*Feature) ProtoMessage() {
   }

func (x *Feature) ProtoReflect() protoreflect.Message {
   
	mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[2]
	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)
}

func (*Feature) Descriptor() ([]byte, []int) {
   
	return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
   2}
}

func (x *Feature) GetName() string {
   
	if x != nil {
   
		return x.Name
	}
	return ""
}

func (x *Feature) GetLocation() *Point {
   
	if x != nil {
   
		return x.Location
	}
	return nil
}

// RouteNote RouteNote message 生成的结构体和方法
type RouteNote struct {
   
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Location *Point `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"`
	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
}

func (x *RouteNote) Reset() {
   
	*x = RouteNote{
   }
	if protoimpl.UnsafeEnabled {
   
		mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RouteNote) String() string {
   
	return protoimpl.X.MessageStringOf(x)
}

func (*RouteNote) ProtoMessage() {
   }

func (x *RouteNote) ProtoReflect() protoreflect.Message {
   
	mi := &file_examples_route_guide_routeguide_route_guide_proto_msgTypes[3]
	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)
}

func (*RouteNote) Descriptor() ([]byte, []int) {
   
	return file_examples_route_guide_routeguide_route_guide_proto_rawDescGZIP(), []int{
   3}
}

func (x *RouteNote) GetLocation() *Point {
   
	if x != nil {
   
		return x.Location
	}
	return nil
}

func (x *RouteNote) GetMessage() string {
   
	if x != nil {
   
		return x.Message
	}
	return ""
}

// RouteSummary RouteSummary message 生成的结构体和方法
type RouteSummary struct {
   
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PointCount int32 `protobuf:"varint,1,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"`
	FeatureCount int32 `protobuf:"varint,2,opt,name=feature_count,json=featureCount,proto3" json:"feature_count,omitempty"`
	Distance int32 `protobuf:"varint,3,opt,name=distance,proto3" json:"distance,omitempty"`
	ElapsedTime int32 `protobuf:"varint,4,opt,name=elapsed_time,json=elapsedTime,proto3" json:"elapsed_time,omitempty"`
}

func (x *RouteSummary) Reset() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值