zoukankan      html  css  js  c++  java
  • grpc(二)

    使用grpc

    1 服务定义

    syntax = "proto3";
    package hello;
    
    service ProductInfo {
        rpc say(HelloReq) returns (HelloResp);
    }
    
    message HelloReq {
        string id = 1;
    }
    
    message HelloResp {
        string value = 1;
    }
    

    2 实现

    1. gRPC运行时接口编解码支持库
      go get -u github.com/golang/protobuf/proto

    2. 从 Proto文件(gRPC接口描述文件) 生成 go文件 的编译器插件
      go get -u github.com/golang/protobuf/protoc-gen-go

    3. 获取go的gRPC包
      go get google.golang.org/grpc

    4. 生成代码

    protoc --go_out=. *.proto
    protoc --go_out=plugins=grpc:. ./hello/hello.proto

    也可以知道其他目录
    protoc --go_out=plugins=grpc:./msg2 ./hello/hello.proto

    protoc -I ecommerce ecommerce/product_info.proto --go_out=plugins=grpc:./server/ecommerce

    //option go_package="./;ecommerce";

    —I 指定搜索目录,如果没有指定 –I 参数,则在当前目录进行搜索
    --go_out=plugins=grpc:helloworld是输出目录

    option go_package =“go/src/microtest/proto”;

    1. 为啥要定义reflection.Register(serv)

    客户端可以看到服务端的信息

    grpcurl调用服务

    grpcurl -plaintext localhost:8741 list

    grpcurl -plaintext localhost:8741 describe Greeter

    grpcurl -plaintext localhost:8741 describe grpc.reflection.v1alpha.ServerReflection

    grpcurl -plaintext localhost:8741 describe Greeter.SayHello

    grpcurl -plaintext -d '{"name": "gopher"}' localhost:8741 Greeter.SayHello
    {
     "message": "hello gopher"
    }
    
    
    grpcurl -plaintext -d @ localhost:8741 Greeter.SayHello
    {"name": "gopher"}
    
    

    3 构建和运行

     syntax = "proto3";
    
    package ecommerce;
    
    service ProductInfo {
        rpc addProduct(Product) returns (ProductID);
        rpc getProduct(ProductID) returns (Product);
    }
    
    message Product {
        string id = 1;
        string name = 2;
        string description = 3;
        float price = 4;
    }
    
    message ProductID {
        string value = 1;
    }
    
    protoc -I ecommerce ecommerce/product_info.proto --go_out=plugins=grpc:./server/ecommerce
    protoc -I ecommerce ecommerce/product_info.proto --go_out=plugins=grpc:./client/ecommerce
    

    运行serveice

    server通用的代码

    lis, err := net.Listen("tcp", port)
    	if err != nil {
    		log.Fatalf("failed to listen: %v", err)
    	}
    	s := grpc.NewServer()
    	pb.RegisterProductInfoServer(s, &server{})
    	if err := s.Serve(lis); err != nil {
    		log.Fatalf("failed to serve: %v", err)
    	}
    

    client通用的代码

    // Set up a connection to the server.
    	conn, err := grpc.Dial(address, grpc.WithInsecure())
    	if err != nil {
    		log.Fatalf("did not connect: %v", err)
    	}
    	defer conn.Close()
    	c := pb.NewProductInfoClient(conn)
    
    	// Contact the server and print out its response.
    	name := "Apple iPhone 11"
    	description := "Meet Apple iPhone 11. All-new dual-camera system with Ultra Wide and Night mode."
    	price := float32(699.00)
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	defer cancel()
    	r, err := c.AddProduct(ctx, &pb.Product{Name: name, Description: description, Price: price})
    	if err != nil {
    		log.Fatalf("Could not add product: %v", err)
    	}
    	log.Printf("Product ID: %s added successfully", r.Value)
    
    	product, err := c.GetProduct(ctx, &pb.ProductID{Value: r.Value})
    	if err != nil {
    		log.Fatalf("Could not get product: %v", err)
    	}
    	log.Printf("Product: %v", product.String())
    
  • 相关阅读:
    ubuntu 源
    20121211 mysqld.sock丢失无法启动mysql和登陆
    hadoop0.20.2 & hbase0.90.1 集群启动错误“org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientP
    20121204当前集群的几个问题
    hive中的bucket table (输入文件是一个的话,map任务只能启动一个 ,给力啊)
    Android的animation
    获取已安装程序的名字、包名
    android布局属性
    Ghost网络克隆详细步骤教程
    教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  • 原文地址:https://www.cnblogs.com/beckbi/p/14829161.html
Copyright © 2011-2022 走看看