zoukankan      html  css  js  c++  java
  • Go gRPC框架2-单项 RPC

    服务定义

    gRPC 思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。

    允许定义的四种服务方法

    • 单项 RPC(single RPC):客户端发起请求一个请求给服务端,并等待服务端响应。
    rpc SayHello(HelloRequest) returns (HelloResponse){
    }
    
    • 服务端流式(Server-side streaming RPC):客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。
    rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
    }
    
    • 客户端流式(Client-side streaming RPC):与服务端数据流模式相反,这次是客户端源源不断的向服务端发送数据流,而在发送结束后,由服务端返回一个响应。
    rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
    }
    
    • 双向流式(Bidirectional streaming RPC):双方使用读写流去发送一个消息序列,两个流独立操作,双方可以同时发送和同时接收。
    rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
    }
    

    单项 RPC(single RPC)

    新建proto文件

    主要是定义服务的方法以及数据格式

    syntax = "proto3";// 协议为proto3
    
    package services;
    
    // 定义发送请求信息
    message ProdRequest {
      // 定义发送的参数
      int32 prod_id = 1;//传入的商品ID
    }
    
    // 定义响应信息
    message ProdResponse {
      // 定义接收的参数
      int32 prod_stock = 1;//商品库存
    }
    
    // 定义服务
    service ProdService {
      rpc GetProdStock(ProdRequest) returns(ProdResponse);
    }
    

    编译proto文件

    指令编译方法,进入Prod.proto文件所在目录,运行:
    protoc --go_out=plugins=grpc:./ ./Prod.proto

    创建Server端

    1.定义服务

    package services
    
    import "context"
    
    type ProdService struct {
    
    }
    
    func (this *ProdService) GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error){
    	return &ProdResponse{ProdStock: 20},nil
    }
    

    context.Context,它的作用结束超时取消的请求.

    2.启动gRPC服务器

    package main
    
    import (
    	"google.golang.org/grpc"
    	"grpcserver/services"
    	"log"
    	"net"
    )
    
    const (
    	// Address 监听地址
    	Address string = ":8081"
    	// Network 网络通信协议
    	Network string = "tcp"
    )
    
    func main()  {
    	// 监听本地端口
    	lis,err:=net.Listen(Network,Address)
    	if err != nil {
    		log.Fatal("Net.Listen err: %v",err)
    	}
    	log.Println(Address[1:],"net.Listing...")
    	// 新建gRPC服务器实例
    	grpcServer := grpc.NewServer()
    	// 注册服务
    	services.RegisterProdServiceServer(grpcServer,new(services.ProdService))
    	grpcServer.Serve(lis)
    }
    
    

    运行服务端

    go run server.go
    2021/01/17 05:19:04 8081 net.Listing...
    

    创建Client端

    package main
    
    import (
    	"context"
    	"fmt"
    	"google.golang.org/grpc"
    	"grpccli/services"
    	"log"
    )
    
    const (
    	// Address 连接地址
    	Address string = ":8081"
    )
    
    func main()  {
    	conn,err := grpc.Dial(Address,grpc.WithInsecure())
            //grpc.WithInsecure()禁止安全验证传输
    	if err != nil {
    		log.Fatalf("net.Connect err: %v", err)
    	}
    	defer conn.Close()
    	// 建立gRPC连接
    	prodClient := services.NewProdServiceClient(conn)
    	prodRes,err := prodClient.GetProdStock(context.Background(),&services.ProdRequest{ProdId: 12})
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println(prodRes.ProdStock)
    }
    

    运行客户端

    go run client.go
    20
    

    成功调用Server端数据。

  • 相关阅读:
    【BZOJ】4636: 蒟蒻的数列
    BZOJ1878 [SDOI2009]HH的项链
    【网络流24题----02】太空飞行计划
    【网络流24题----03】Air Raid最小路径覆盖
    【网络流24题----01】飞行员配对方案问题
    素数判定(米勒测试定理-费马小定理+快速乘)
    一堆模板(丑陋0.0)------数据结构
    丑数(USACO)
    NOI[2001]食物链
    关于Tarjan(2)
  • 原文地址:https://www.cnblogs.com/remixnameless/p/14288167.html
Copyright © 2011-2022 走看看