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—数据控 ...
随机推荐
- [JZOJ 5698] 密码锁
思路: 差分+排序 #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = ...
- C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes(&q ...
- 移植 TinyLogin
下载 从 http://tinylogin.busybox.net/downloads/tinylogin1.4.tar.bz2下载 tinylogin1.4 到/tmp 目录当中,并解压. 修改 ...
- Expression表达式 实现and、or搜索
用法: [HttpPost] public ActionResult GetBannerList(int pageIndex, int pageSize, string search) { Resul ...
- 常见的React面试题
1.redux中间件 答:中间件提供第三方插件的模式,自定义拦截 action -> reducer 的过程.变为 action -> middlewares -> reducer ...
- echo 改变字体颜色
字颜色:30—–37 echo -e “\033[30m 黑色字 \033[0m” echo -e “\033[31m 红色字 \033[0m” echo -e “\033[32m 绿色字 \033[ ...
- [violet6] 故乡的梦
题目 描述 不知每日疲于在城市的水泥森林里奔波的你会不会有时也曾向往过乡村的生活.你会不会幻想过,在夏日一个静谧的午后,你沉睡于乡间路边的树荫里,一片叶子落在了你的肩上, 而你正做着一个悠长的梦,一个 ...
- ConcurrentHashMap线程安全的具体实现方式/底层具体实现
1. jdk1.7以及之前 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成. 通俗的话讲:就是首先将数据分为一段一段的存储,然后给每一段数据配一 ...
- springboot指定项目访问路径前缀
springboot默认的运行方式是没有项目前缀的 如果这时候我们要加上调试或者发布,可以使用下面的方法加上 方法:
- coreseek 基与Sphinx 的全文索引
假设有两张那个表,分别为articles,article_photos两张表.搜索的时候,要匹配articles.title.articles.intro.article_photos.caption ...