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—数据控 ...
随机推荐
- 怎样使用github?(转)
怎样使用github?(转) 转自: 怎样使用 GitHub? - 知乎https://www.zhihu.com/question/20070065 珊姗是个小太阳 ❤努力做最胖//bang的健身博 ...
- SPSS分析:Bootstrap
SPSS分析:Bootstrap 一.原理: 非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法,也称为自助法.其核心思想和基本步骤如下: 1.采用重抽样技术从原始样本中抽取一定数量(自己 ...
- PowerDesigner导出所有表到Excel(同一表格)
'****************************************************************************** '* File: pdm2excel.v ...
- 【Oracle】如何在查询视图时使用索引
通常我们使用hint来固定查询计划选择走表的索引 固定表的连接等等,但是如果第一层查询的是视图呢? yang@rac1>CREATE TABLE TA (ID NUMBER, NAME VARC ...
- JS流程控制语句 继续循环continue continue的作用是仅仅跳过本次循环,而整个循环体继续执行。
继续循环continue continue的作用是仅仅跳过本次循环,而整个循环体继续执行. 语句结构: for(初始条件;判断条件;循环后条件值更新) { if(特殊情况) { continue; } ...
- 【颓废篇】人生苦短, 我用python(二)
当时产生学习python的欲望便是在看dalao们写脚本的时候… 虽然dalao们好像用的是js来着.. 不过现在好像很多爬虫也可以用python写啊… 所以学python没什么不妥. 而且csdn整 ...
- SQFREE - Square-free integers
SQFREE - Square-free integers 求n以内,约数中不包含任意一个平方数的个数,\(n≤10^{14}\). 解 显然为约数计数问题,于是想办法转换为代数问题,不难列出 \[a ...
- 阿里云容器服务通过LoadBalancer暴露IPv6服务
背景: IPv4地址已接近枯竭,被誉为下一代互联网技术的IPv6成为新的“全球互联网门牌号”,它可以让地球上的每一粒沙子都拥有地址.当下,各国都在加速推进下一代互联网的部署,工信部也互联网服务商提出了 ...
- SQLServer中使用索引视图
在SQL Server中,视图是一个保存的T-SQL查询.视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全.但是,它并不占用数据库的任何空间.实际上,在你 ...
- 转:linux下的c/c++开发
源地址:http://zhidao.baidu.com/question/131261452.html 我就是做LINUX下的C开发的. 准确的说,LINUX下C才是主要的开发语言,但是写应用程序还是 ...