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—数据控 ...
随机推荐
- vue mounted组件的使用
1.钩子函数 钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息.事件进行过滤,访问在正常情况下无法访问的消息.钩子的本质是一段用以处理系统消息的程序,通 ...
- Astyle 快速入门,常用指令
--style=java -n -p -c !E astyle是一个命令行工具,命令语法很简单: astyle [options] < original > Beauti ...
- 第三周——重新clone项目、配置并编译
重新clone项目的原因 因为实习尚未有公司邮箱,使用qq邮箱没有权限提交代码,因此使用晶哥的账号和gitlab, 但是git clone项目默认会关联账号(可能有某些配置项,但是找不到), idea ...
- C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 复制代码 代码如下: (1)byte[] bt=System.Text.Encoding.Default.GetB ...
- wpf 几种常用控件样式
转自:http://blog.csdn.net/xuejiren/article/details/39449515
- 用hexo在本地搭建自己的博客
参考路径:https://blog.csdn.net/Hoshea_chx/article/details/78826689
- Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- webpack 配置分离css插件
以css配置示例,less与sass同理 1. 使用旧版的ExtractTextPlugin插件 安装 npm install extract-text-webpack-plugin@next --s ...
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- disruptor 高效队列
disruptor 是什么: disruptor 是一个 低延时的 无锁 环形 队列. 相较于 java的 队列 ,他有明显的优点 ,无界,无锁,低延时(解决了为内存共享问题 ) disrupto ...