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端数据。

posted @ 2021-01-17 05:50  自己有自己的调调、  阅读(232)  评论(0编辑  收藏  举报