生成protobuf文件
services:包名
Prod.proto:proto文件
go_out:生成go文件
protoc --go_out=plugins=grpc:../services Prod.proto
定义方法proto文件
syntax = "proto3"; // 指定proto版本
package services; // 指定默认包名
// 指定golang包名路径
option go_package = "../services";
enum ProdAreas{
A=0;
B=1;
C=2;
}
// HelloRequest 请求结构
message ProdRequest {
int32 prod_id = 1;
ProdAreas prod_area = 2;
}
// HelloResponse 响应结构
message ProdResponse {
string message = 1;
int32 prod_stock = 2;
}
//商品模型
message ProdModel{
int32 prod_id=1;
string prod_name=2;
float prod_price=3;
}
service ProdService {
//定义的方法名1
rpc GetProdStock(ProdRequest) returns(ProdResponse){}
//定义的方法名2
rpc GetProdSInfo(ProdRequest) returns(ProdModel){}
}
实现方法go文件
方法名-->去生成的pb.go文件搜索拷贝
package services
import (
"context"
)
type ProdService struct {
}
//实现的方法1
func(this *ProdService) GetProdStock(ctx context.Context, in *ProdRequest) (*ProdResponse, error) {
var stock int32 = 0
if in.ProdArea ==ProdAreas_A{
stock=30
}else if in.ProdArea==ProdAreas_B {
stock=50
}else{
stock=100
}
return &ProdResponse{ProdStock:stock},nil
}
//实现的方法2
func(this *ProdService) GetProdSInfo(context.Context, *ProdRequest) (*ProdModel, error) {
ret:=ProdModel{
ProdId: 100,
ProdName: "测试商品",
ProdPrice: 999.8,
}
return &ret,nil
}
开启服务端
package main
import (
"google.golang.org/grpc"
"net"
"rpc_server/services"
)
//服务端启动
func main() {
rpcServer:=grpc.NewServer()
services.RegisterProdServiceServer(rpcServer,new(services.ProdService))
lis,_:=net.Listen("tcp",":8081")
rpcServer.Serve(lis)
}
客户端调用
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"rpc_server/services"
)
//客户端启动
func main() {
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
fmt.Println(err)
}
defer conn.Close()
prodClient:=services.NewProdServiceClient(conn)
// 调用方法1
//prodRes,err:= prodClient.GetProdStock(context.Background(),&services.ProdRequest{ProdArea: services.ProdAreas_C})
//调用方法2
prod,err:= prodClient.GetProdSInfo(context.Background(),&services.ProdRequest{ProdId: 2})
if err!=nil{
fmt.Println(err)
}
fmt.Println(prod)
}