乐趣区

关于golang:Golang-关于-proto-文件的一点小思考

前言

ProtoBuf 是什么?

ProtoBuf 是一套接口描述语言(IDL),艰深的讲是一种数据表达方式,也能够称为数据交换格局。

咱们罕用的数据格式有 JSONXML,为什么应用 ProtoBuf?是因为它的传输快,为什么传输快?大家能够找下材料。应用 .proto 文件进行形容要序列化的数据结构,而后将写好 .proto 文件应用 protoc 就能够很容易编译成泛滥计算机语言的接口代码。

gRPC 是什么?

gRPC 是开源的 RPC 框架,已反对支流的计算机语言,能够通过 ProtoBuf 进行定义接口,能够基于 ProtoBuf 进行数据传输。

两者尽管是一家,然而别离解决不同的问题,能够配合应用,也能够离开。

看一下的 gRPC helloworld 的 proto 文件是如何定义的?

helloworld.proto

syntax = "proto3";

package helloworld;

option go_package = "./;helloworld";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}}

// The request message containing the user's name.
message HelloRequest {string name = 1;}

// The response message containing the greetings
message HelloReply {string message = 1;}

文件中定义了一个 service Greeter 和 rpc SayHello 办法。

入参:string name

出参:string message

这些过于简略,还能不能形容其余信息?

小思考

  1. 定义的 rpc 办法是否也同时反对 HTTP 调用?例如:SayHello 办法,既反对 gRPC 调用,也反对 HTTP 调用,同时反对 protoc 生成代码时,同时也生成 Swagger 接口文档。
  2. 定义的入参是否反对参数验证?例如:name 长度不能大于 20 个字符。
  3. 定义的 service Greeter 服务是否反对拦截器?例如:该服务下的所有办法须要进行登录令牌验证。
  4. 定义的 rpc SayHello 办法可能反对拦截器?例如:以后办法反对开启和敞开是否记录日志。

小结

以上问题还未齐全解决,学习 gRPC 感觉有些吃力 …

大家有没有能够举荐的学习资源?目前在看 grpc-gateway。

举荐浏览

  • Go – 应用 sync.WaitGroup 来实现并发操作
  • Go – 应用 sync.Map 解决 map 并发平安问题
  • Go – 基于逃逸剖析来晋升程序性能
  • Go – 应用 sync.Pool 来缩小 GC 压力
  • Go – 应用 options 设计模式
退出移动版