• 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
    		}
    
  • 相关阅读:
    MM1排队系统
    java基本概念
    将博客搬至CSDN
    数据库知识点1
    离散分布
    概率论1--基本概念
    一道经典JS题(关于this)
    ajax请求过程中下载文件在火狐下的兼容问题
    熟悉css/css3颜色属性
    打字机游戏Ⅱ之手速pk
  • 原文地址:https://www.cnblogs.com/beckbi/p/14833856.html
Copyright © 2020-2023  润新知