• grpc(三)


    3 grpc的流

    用来接收大量的数据,支持3中模式:服务端流,客户端流,双端流

    来自书

    package ecommerce;
    
    service OrderManagement {
        rpc addOrder(Order) returns (google.protobuf.StringValue);
        rpc getOrder(google.protobuf.StringValue) returns (Order);
        rpc searchOrders(google.protobuf.StringValue) returns (stream Order);
        rpc updateOrders(stream Order) returns (google.protobuf.StringValue);
        rpc processOrders(stream google.protobuf.StringValue) returns (stream CombinedShipment);
    }
    
    message Order {
        string id = 1;
        repeated string items = 2;
        string description = 3;
        float price = 4;
        string destination = 5;
    }
    
    message CombinedShipment {
        string id = 1;
        string status = 2;
        repeated Order ordersList = 3;
    }
    

    来自鸟窝的grpc代码

    syntax = "proto3";
    
    package pb;
    
    import "github.com/gogo/protobuf/gogoproto/gogo.proto";
    
    option (gogoproto.gostring_all) = true;
    option (gogoproto.equal_all) = true;
    option (gogoproto.verbose_equal_all) = true;
    option (gogoproto.goproto_stringer_all) = false;
    option (gogoproto.stringer_all) =  true;
    option (gogoproto.populate_all) = true;
    option (gogoproto.testgen_all) = false;
    option (gogoproto.benchgen_all) = false;
    option (gogoproto.marshaler_all) = true;
    option (gogoproto.sizer_all) = true;
    option (gogoproto.unmarshaler_all) = true;
    
    
    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello1 (HelloRequest) returns (stream HelloReply) {}
      rpc SayHello2 (stream HelloRequest) returns (HelloReply) {}
      rpc SayHello3 (stream HelloRequest) returns (stream 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;
    }
    

    流数据需要持续读取,直到遇到ioe错误

    for {
    		orderId, err := stream.Recv()
    		log.Printf("Reading Proc order : %s", orderId)
    		if err == io.EOF {
    			// Client has sent all the messages
    			// Send remaining shipments
    			log.Printf("EOF : %s", orderId)
    			for _, shipment := range combinedShipmentMap {
    				if err := stream.Send(&shipment); err != nil {
    					return err
    				}
    			}
    			return nil
    		}
    
  • 相关阅读:
    C#根据当前日期获取星期和阴历日期
    C#常用实例
    使用Open Live Writer在博客园发表博文随笔
    Excel公式中双引号和单引号输入和显示以及函数的选择确认
    outlook新邮件到达提醒设置以及outlook最小化到托盘设置
    Windows任务计划
    酷狗音乐盒缓存文件夹KuGouCache的设置方法
    Android SDK生成时,自定义文件名称,而非系统第一分配的app-release.apk
    android button text属性中英文大小写问题
    Diskpart使用说明
  • 原文地址:https://www.cnblogs.com/beckbi/p/14833856.html
Copyright © 2020-2023  润新知