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