1,语法速学(1):返回商品”数组”、repeated修饰符
Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片)
服务端:
创建protobuf文件
syntax="proto3";
package services;
import "google/api/annotations.proto";
message ProdRequest {
int32 prod_id =1; //传入的商品ID
}
message ProdResponse{
int32 prod_stock=1;//商品库存
}
message QuerySize{
int32 size = 1;//页尺寸
}
//返回 一堆商品库存,使用了repeated修饰符
message ProdResponseList{
repeated ProdResponse prodres=1;
}
service ProdService {
rpc GetProdStock (ProdRequest) returns (ProdResponse){
option (google.api.http) = {
get: "/v1/prod/{prod_id}"
};
}
rpc GetProdStocks(QuerySize) returns (ProdResponseList){
}
}
生成Prod.pb.go文件
cd pbfiles && protoc --go_out=plugins=grpc:../services Prod.proto
创建ProdSerbice.go文件
package services
import (
"context"
)
type ProdService struct {
}
func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {
return &ProdResponse{ProdStock:20},nil
}
func (this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error){
var Prodres []*ProdResponse
Prodres = make([]*ProdResponse,0,3)
Prodres = append(Prodres,&ProdResponse{ProdStock:28,})
Prodres = append(Prodres,&ProdResponse{ProdStock:29,})
Prodres = append(Prodres,&ProdResponse{ProdStock:30,})
return &ProdResponseList{
Prodres:Prodres,
},nil
}
server.go
package main
import (
"google.golang.org/grpc"
"grpcpro/services"
"net"
)
func main() {
rpcServer:=grpc.NewServer()
services.RegisterProdServiceServer(rpcServer,new(services.ProdService))
lis,_:=net.Listen("tcp",":8081")
rpcServer.Serve(lis)
}
启动服务
go run server.go
客户端:
拷贝服务端的生成的文件Prod.pb.go到客户端目录下
mian.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"gprccli/services"
"log"
)
func main(){
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
prodClient:=services.NewProdServiceClient(conn)
ctx:=context.Background()
//prodRes,err:=prodClient.GetProdStock(context.Background(),
// &services.ProdRequest{ProdId:12})
//if err!=nil{
// log.Fatal(err)
//}
//fmt.Println(prodRes.ProdStock)
response,err := prodClient.GetProdStocks(ctx,&services.QuerySize{Size:10})
if err!=nil{
log.Fatal(err)
}
fmt.Println(response.Prodres[2].ProdStock)
}
启动客户端client 调用服务端gprc服务
go run main.go
2,语法速学(2): 使用枚举、获取分区商品库存
1、传入一个商品ID 获取一个商品库存。
2、根据size获取一堆商品的库存列表
3,创建枚举类型,支持分区枚举参数
enum ProdAreas{
A=0;
B=1;
C=2;
}
ProdService.go
package services
import (
"context"
)
type ProdService struct {}
func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {
var stock int32=0
if request.ProdArea==ProdAreas_A{
stock=30
}else if request.ProdArea==ProdAreas_B{
stock=31
}else{
stock=50
}
return &ProdResponse{ProdStock:stock},nil
}
func(this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error) {
Prodres:= []*ProdResponse{
&ProdResponse{ProdStock:28},
&ProdResponse{ProdStock:29},
&ProdResponse{ProdStock:30},
&ProdResponse{ProdStock:31},
}
return &ProdResponseList{
Prodres:Prodres,
},nil
}
语法速学(3): 导入外部Proto、获取商品信息
服务端:
Models.proto
syntax="proto3";
package services;
message ProdModel{ //商品模型
int32 prod_id=1;
string prod_name=2;
float prod_price=3;
}
Prod.proto
syntax="proto3";
package services;
import "google/api/annotations.proto";
import "Models.proto";
enum ProdAreas{
A=0;
B=1;
C=2;
}
message ProdRequest {
int32 prod_id =1; //传入的商品ID
}
message ProdResponse{
int32 prod_stock=1;//商品库存
}
message QuerySize{
int32 size = 1;//页尺寸
}
//返回 一堆商品库存,使用了repeated修饰符
message ProdResponseList{
repeated ProdResponse prodres=1;
}
service ProdService {
rpc GetProdStock (ProdRequest) returns (ProdResponse){
option (google.api.http) = {
get: "/v1/prod/{prod_id}"
};
}
rpc GetProdStocks(QuerySize) returns (ProdResponseList){
}
rpc GetProdInfo(ProdRequest) returns(ProdModel){}
}
生成pb.go文件
protoc --go_out=plugins=grpc:../services Prod.proto
protoc --go_out=plugins=grpc:../services Models.proto
ProdService.go
package services
import (
"context"
)
type ProdService struct {
}
func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) {
return &ProdResponse{ProdStock:20},nil
}
func (this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error){
var Prodres []*ProdResponse
Prodres = make([]*ProdResponse,0,3)
Prodres = append(Prodres,&ProdResponse{ProdStock:28,})
Prodres = append(Prodres,&ProdResponse{ProdStock:29,})
Prodres = append(Prodres,&ProdResponse{ProdStock:30,})
return &ProdResponseList{
Prodres:Prodres,
},nil
}
func (this *ProdService) GetProdInfo(ctx context.Context, in *ProdRequest) (*ProdModel, error){
ret:=ProdModel{
ProdId:101,
ProdName:"测试商品",
ProdPrice:20.5,
}
return &ret,nil
}
客户端:
拷贝服务端 Models.pb.go和Prod.pb.go到客户端下
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"gprccli/services"
"log"
)
func main(){
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
prodClient:=services.NewProdServiceClient(conn)
ctx:=context.Background()
//prodRes,err:=prodClient.GetProdStock(context.Background(),
// &services.ProdRequest{ProdId:12})
//if err!=nil{
// log.Fatal(err)
//}
//fmt.Println(prodRes.ProdStock)
//response,err := prodClient.GetProdStocks(ctx,&services.QuerySize{Size:10})
//
//if err!=nil{
// log.Fatal(err)
//}
//fmt.Println(response.Prodres[2].ProdStock)
prod,err :=prodClient.GetProdInfo(ctx,&services.ProdRequest{ProdId:12})
if err!=nil{
log.Fatal(err)
}
fmt.Println(prod)
}
语法学习日期类型、创建主订单模型(下)
服务端:
Models.proto
syntax="proto3";
package services;
import "google/protobuf/timestamp.proto";
message ProdModel{ //商品模型
int32 prod_id=1;
string prod_name=2;
float prod_price=3;
}
message OrderMain{ //主订单模型
int32 order_id=1;//订单ID,数字自增
string order_no=2; //订单号
int32 user_id=3; //购买者ID
float order_money=4;//商品金额
google.protobuf.Timestamp order_time=5; //下单时间
}
Orders.proto
syntax="proto3";
package services;
import "Models.proto";
message OrderResponse{
string status=1;
string message=2;
}
service OrderSerivce{
rpc NewOrder(OrderMain) returns (OrderResponse){}
}
$ protoc --go_out=plugins=grpc:../services Models.proto
$ protoc --go_out=plugins=grpc:../services Orders.proto
生成pb.go文件
OrdersService.go
package services
import (
"context"
"fmt"
)
type OrdersService struct {
}
func(this *OrdersService)NewOrder(ctx context.Context,orderMain *OrderMain) (*OrderResponse, error) {
fmt.Println(orderMain)
return &OrderResponse{
Status:"OK",
Message:"success",
},nil
}
server.go
func main() {
rpcServer:=grpc.NewServer()
services.RegisterProdServiceServer(rpcServer,new(services.ProdService))
services.RegisterOrderSerivceServer(rpcServer,new(services.OrdersService))
lis,_:=net.Listen("tcp",":8081")
rpcServer.Serve(lis)
}
客户端:
首先拷贝Orders.pb.go和Models.pb.go到客户端
package main
import (
"context"
"fmt"
"github.com/golang/protobuf/ptypes/timestamp"
"google.golang.org/grpc"
"gprccli/services"
"log"
"time"
)
func main2(){
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
prodClient:=services.NewProdServiceClient(conn)
ctx:=context.Background()
//prodRes,err:=prodClient.GetProdStock(context.Background(),
// &services.ProdRequest{ProdId:12})
//if err!=nil{
// log.Fatal(err)
//}
//fmt.Println(prodRes.ProdStock)
//response,err := prodClient.GetProdStocks(ctx,&services.QuerySize{Size:10})
//
//if err!=nil{
// log.Fatal(err)
//}
//fmt.Println(response.Prodres[2].ProdStock)
prod,err :=prodClient.GetProdInfo(ctx,&services.ProdRequest{ProdId:12})
if err!=nil{
log.Fatal(err)
}
fmt.Println(prod)
}
func main(){
conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
if err!=nil{
log.Fatal(err)
}
defer conn.Close()
ctx:=context.Background()
t:=timestamp.Timestamp{Seconds:time.Now().Unix()}
orderClient:=services.NewOrderSerivceClient(conn)
res,_:= orderClient.NewOrder(ctx,&services.OrderMain{
OrderId:1001,
OrderNo:"20190809",
OrderMoney:90,
OrderTime:&t,
})
fmt.Println(res)
}