生成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)
}

相关文章: