• 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())
    
  • 相关阅读:
    分享一个关于Cookie做的实验结果
    使用jest进行单元测试
    【转载】为什么单反镜头做不小,镜头越好越重呢?
    【转载】解读手机摄像头
    【转载】2019中国机器视觉产业全景图谱
    【行业】视觉传感器
    图像质量测评
    COM口了解下
    dbus-python的API及示例
    QtDbus的API及示例
  • 原文地址:https://www.cnblogs.com/beckbi/p/14829161.html
Copyright © 2020-2023  润新知