go + grpc

QA:

protoc base.proto --go_out=plugins=grpc:.

---------------------------------------------------------------------------------------------------------------------------

grpc的服务端多"线程"处理实现方式?或者grpc对底层的每个请求处理本身就是多"线程"

 

1.go 使用protobuf

安装的时候注意x/net文件一定要用git clone下来,再拷贝到目标文件夹,否则后续安装其他库会包不信赖问题(https://studygolang.com/articles/4688

 

https://blog.csdn.net/java060515/article/details/84940938

注意:案例中的output并不是环境变量,而是作者的gopath路径下的一个叫做output的目录,作者的github.com库等都安装在这个目录下

也可以自己指定*.pb.go文件的位置,如 protoc helloworld.proto --go_out=./fish/xiaoyu (前提是这个文件夹必须是已经创建的)

注意:protoc helloworld.proto --go_out=plugins=grpc:output

protoc中的路径问题:

在GOPATH/SRC目录下执行
protoc --proto_path=$GOPATH/src:.  --go_out=. --micro_out=.  $GOPATH/src/mr_base/feed/proto/proto/model.proto

model.micro.go和model.pb.go生成在mr_base/feed/proto/proto/目录下

 

 

plugins字段有哪些值,还没研究的透

例子中设置的是1秒就超时,自己单步调试的时候可能会超时

ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)

 

2. 请求,应答,服务必须都是独立的结构

syntax = "proto3";

package user;

// The greeting service definition.
service UserInfo {
  // Sends a greeting
  rpc GetUserInfo(UserInfoRequest) returns (UserInfoReply) {}
}

// The request message containing the user's name.
message UserInfoRequest {
  int32 id = 1;  //编译后对应的Req成员变量首字母会大写
  string cliName = 2;   //编译后对应的Req成员变量首字母会大写CliName
   
}

// The response message containing the greetings
message UserInfoReply {
  string result = 1;
  int32 msgId = 2;
}

 

3.gRPC线程模型

https://blog.csdn.net/jek123456/article/details/80451500

客户度多线程发送

        ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)

        defer cancel()      

        r, err := c.SayHello(ctx, &pb.HelloRequest{Name: strName})      

        if err != nil {

            //log.Printf("could not greet: %v", err)

            fmt.Printf("exit %v", err)

        }

其中ctx是每次发送的超时时间限制,不能重复使用,否则过了ctx的时间限制以后,调用会断开(就是循环调用的话,ctx应该是临时变量)

4.部署 

部署的电脑上,不需要安装protobuf,只需要把go和gorpc相关的依赖配置好就OK

 

5.断链重连

根据3中的文章提到grpc底层自己会做断链重连

conn, err := grpc.Dial(address, grpc.WithInsecure()) 这里的连接默认是一个异步连接,即便服务器不存在,也会返回conn对象,

底层会自动间隔重连,当服务端down之后,调用函数会失败,服务端恢复后,再调用就会成功,不需要重新Dial()

 

6.proto语法

enum 会根据语言转化为不通的数据结构,go会转成常量,调用的时候使用 包名.枚举名填入参数,如:proto.Corpus_WEB

map也是正常的语法,参数填写时传入mapj就可以了

repeated 类型相当于std的vector,对应的go中数据结构是切片,可以传递0个元素或者多个元素

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值