grpc之protobuf常用语法速学
1,语法速学(1):返回商品”数组”、repeated修饰符
Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片)
服务端:
创建protobuf文件
syntax="proto3";
package services;
import "google/api/annotations.proto"; message ProdRequest {
int32 prod_id =; //传入的商品ID
}
message ProdResponse{
int32 prod_stock=;//商品库存
} message QuerySize{
int32 size = ;//页尺寸
} //返回 一堆商品库存,使用了repeated修饰符
message ProdResponseList{
repeated ProdResponse prodres=;
} 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:},nil
} func (this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error){
var Prodres []*ProdResponse
Prodres = make([]*ProdResponse,,)
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
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:}) if err!=nil{
log.Fatal(err)
}
fmt.Println(response.Prodres[].ProdStock)
}
启动客户端client 调用服务端gprc服务
go run main.go
2,语法速学(2): 使用枚举、获取分区商品库存
1、传入一个商品ID 获取一个商品库存。
2、根据size获取一堆商品的库存列表
3,创建枚举类型,支持分区枚举参数
enum ProdAreas{
A=;
B=;
C=;
}
ProdService.go
package services import (
"context"
) type ProdService struct {} func(this *ProdService) GetProdStock(ctx context.Context, request *ProdRequest) (*ProdResponse, error) { var stock int32=
if request.ProdArea==ProdAreas_A{
stock=
}else if request.ProdArea==ProdAreas_B{
stock=
}else{
stock=
}
return &ProdResponse{ProdStock:stock},nil
}
func(this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error) {
Prodres:= []*ProdResponse{
&ProdResponse{ProdStock:},
&ProdResponse{ProdStock:},
&ProdResponse{ProdStock:},
&ProdResponse{ProdStock:},
}
return &ProdResponseList{
Prodres:Prodres,
},nil
}
语法速学(3): 导入外部Proto、获取商品信息
服务端:
Models.proto
syntax="proto3";
package services;
message ProdModel{ //商品模型
int32 prod_id=;
string prod_name=;
float prod_price=;
}
Prod.proto
syntax="proto3";
package services; import "google/api/annotations.proto";
import "Models.proto"; enum ProdAreas{
A=;
B=;
C=;
} message ProdRequest {
int32 prod_id =; //传入的商品ID
}
message ProdResponse{
int32 prod_stock=;//商品库存
} message QuerySize{
int32 size = ;//页尺寸
} //返回 一堆商品库存,使用了repeated修饰符
message ProdResponseList{
repeated ProdResponse prodres=;
} 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:},nil
} func (this *ProdService) GetProdStocks(ctx context.Context,size *QuerySize) (*ProdResponseList, error){
var Prodres []*ProdResponse
Prodres = make([]*ProdResponse,,)
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
Prodres = append(Prodres,&ProdResponse{ProdStock:,})
return &ProdResponseList{
Prodres:Prodres,
},nil
} func (this *ProdService) GetProdInfo(ctx context.Context, in *ProdRequest) (*ProdModel, error){ ret:=ProdModel{
ProdId:,
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:})
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=;
string prod_name=;
float prod_price=;
} message OrderMain{ //主订单模型
int32 order_id=;//订单ID,数字自增
string order_no=; //订单号
int32 user_id=; //购买者ID
float order_money=;//商品金额
google.protobuf.Timestamp order_time=; //下单时间
}
Orders.proto
syntax="proto3";
package services; import "Models.proto"; message OrderResponse{
string status=;
string message=;
}
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:})
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:,
OrderNo:"",
OrderMoney:,
OrderTime:&t,
})
fmt.Println(res)
}
grpc之protobuf常用语法速学的更多相关文章
- 语法速学,返回数组 repeated修饰符
重新编写proto文件 syntax = "proto3"; package services; import "google/api/annotations.proto ...
- 沈逸老师ubuntu速学笔记(1)--安装flashplayer,配置中文输入法以及常用命令
开篇首先感谢程序员在囧途(www.jtthink.com)以及沈逸老师,此主题笔记主要来源于沈老师课程.同时也感谢少年郎,秦少.花旦等同学分享大家的学习笔记. 1.安装flash player ctr ...
- 快看Sample代码,速学Swift语言(1)-语法速览
Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...
- 快看Sample代码,速学Swift语言(2)-基础介绍 快看Sample代码,速学Swift语言(1)-语法速览
快看Sample代码,速学Swift语言(2)-基础介绍 Swift语言是一个新的编程语言,用于iOS, macOS, watchOS, 和 tvOS的开发,不过Swift很多部分内容,我们可以从C或 ...
- React Native之React速学教程(下)
概述 本篇为<React Native之React速学教程>的最后一篇.本篇将带着大家一起认识ES6,学习在开发中常用的一些ES6的新特性,以及ES6与ES5的区别,解决大家在学习Reac ...
- Linux之:Ubuntu速学笔记(1)
撰写日期:2016-7-2 17:11:28 Saturday 课程资源: web程序员角度ubuntu自修速学课程 链接来源:程序员在囧途, VMware: VMware Workstation1 ...
- Sql常用语法以及名词解释
Sql常用语法以及名词解释 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) D ...
- 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展
1.编译安装apache2.4.20 第一步: ./configure --prefix=/usr/local/httpd --enable-so 第二步: make 第三步: sudo make i ...
- sql 常用语法汇总
Sql常用语法 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控 ...
随机推荐
- [ZJOI 2018]历史
题意:给定一棵树和点的\(Access\)次数,求切换链的最大值. 考虑修改时实边与虚边的贡献,用\(LCT\)维护此树. // luogu-judger-enable-o2 #include< ...
- Installer - Eclipse配置Data Source Explorer
一.配置Oracle数据库连接 1.打开配置窗口 在[window]菜单中的[show windows]选择[other],在弹出的窗口中选择[Data Source Explorer]进行数据数据库 ...
- 用pymysql实现的注册登录公告练习
import pymysql #1.连接服务器 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='12 ...
- Laravel5.4中自定义404等错误页面
1.在resources/views/下简历文件夹error,在error文件中建立"404.blade.php文件". <!DOCTYPE html PUBLIC &quo ...
- windows 映射samba Linux服务器,输入正确的账号密码却提示“ 指定的网络密码不正确
重启Linux samba服务也没用,重启Linux和windows系统也没用,急!!! 最佳答案 linux中要添加对应的系统用户和samba用户useradd titiansmbpasswd -a ...
- PAT甲级——A1135 Is It A Red-Black Tree 【30】
There is a kind of balanced binary search tree named red-black tree in the data structure. It has th ...
- vue-select-lang
https://cli.vuejs.org/zh/guide/build-targets.html#%E5%BA%93 https://github.com/lipis/flag-icon-css
- 搞笑:Java & PHP & C++ 之间的战斗!
Java 拥有十八般武艺,PHP一招致命!PHP 果然是世界上最好的编程语言~ Java 连老将 C++ 也干不过,直接一招 KO,我也是醉了... 这里并不是贬低Java,只有资深老司机能看懂的图吧 ...
- mysql简单的操作
启动数据库服务 net start mysql 停止数据库服务 net stop mysql 退出数据库 exit 保存操作及结果 将在命令行窗口中 ...
- css盒模型问题
css盒模型问题 1.基本概念:标准模型和ie模型 2.标准模型和ie模型的区别 3.css如果设置这两种模型 4.js如何获取盒模型的宽高 5.边距重叠 6.BFC 1.CSS盒模型本质上是一个盒子 ...