由网络副手--寻路人于2022.11.28 19:00:00发布在Go语言 go gRpc案例分享-gRpc介绍和使用(一) 阅读1477 评论1 喜欢0 #基础知识介绍 ## 一、为何要使用RPC, Http是否就够了 ###1.1、什么是RPC RPC 远程过程调用协议,一种通过网络从远程计算机上请求服务,不需要了解网络技术协议。在OSI七层模型中,RPC跨越传输层、应用层,RPC开发包括网络分布式多程序在内的应用程序更加容易。 过程: 业务处理、计算任务。说白了是程序单元,就像调用本地方法一样调用远程的程序单元。 采用客户端/服务端模式,通过request-response消息模式实现 ###1.2、 产生背景 1. 微服务的拆分 & 服务间调用需要 2. http 的性能较低, 不如RPC调用快 3. RPC 可以通过自定义的TCP调用来加快传输效率 ##二、什么是gRpc gRPC 是一个现代开源高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持,有效地连接数据中心内和跨数据中心的服务。它还适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。【官网】 ##三、gRpc 默认使用protocol buffers 进行传输 ###3.1 什么是protocol buffers ? 一句话概括:数据传输序列化协议, 类似的有 xml 、json; 谷歌开源、成熟结构数据序列化机制 ###3.2 protobuf 优缺点(二进制数据格式、需要转、解码) 优点: 1. 序列化后提交比json、xml 更小,更利于网络传输 2. 序列化和反序列化速度快 3. 消息格式升级兼容性不错 4. 支持跨平台多语言 缺点: 1. 二进制可读性不友好、直观 ###四、安装protoc ``` $ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 ``` 安装后会在gopath 下的 bin 目录中存在两个可执行文件 protoc-gen-go protoc-gen-go-grpc ###五、编写protobuf 文件 pbfile/demo.proto 文件以 .proto 命名 ``` //指定当前的proto 语法版本, 有v2 和 v3 两个版本,当下多数使用v3 syntax = "proto3"; //生成文件存放所在的目录,会自动生成目录 option go_package = "../service"; //引入其他结构体, 从执行protoc 这个命令的当前目录开始算起 import "google/protobuf/any.proto"; //带有google字样的为安装包带有的文件 //指定生成出来的package 名称 package service; //消息 传输的对象 message Demo { string DemoName = 1; //这里的1、2仅仅代表这个结构体里面的序号 int32 Count = 2; } ``` ###六、类型定义 这里有一个官方类型映射表,可以点击查看 https://developers.google.cn/protocol-buffers/docs/proto3#scalar 到这里很多伙伴会问, 官方就只支持这几种类型么,那定义的时候如何进行额外的类型表示呢? 比如时间类型 等 这里protoc 也提供了谷歌封装好的数据类型,统一放到 ""google/protobuf" 包里面里面有 Timestamp 文件 ``` message UserTopicContent { google.protobuf.Timestamp CreateAt = 1; //创建时间 } ``` ###七、protobuf 也提供了字段规则(也可以理解为修饰符) 例如: ``` //消息 传输的对象 message User { string username = 1; optional string password = 2; repeated string addresses = 3; } ``` required : 表示字段的必填项 optional : 表示字段可选项--生成后形成指针 repeated: 表示字段可重复,顺序也被保留,类似于切片 那么上面的结构定义则对应生成的文件 user.pb.go 中对应的结构体,如下 ``` //消息 传输的对象 type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` Password *string `protobuf:"bytes,2,opt,name=password,proto3,oneof" json:"password,omitempty"` Addresses []string `protobuf:"bytes,3,rep,name=addresses,proto3" json:"addresses,omitempty"` } ``` ## 接下来以案例的形式进行分享 赞 0 分享 赏 您可以选择一种方式赞助本站 支付宝扫码赞助 BraveDu 署名: 网络副手~寻路人
?内容类评语?