grpc介绍:
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。
特性
- 基于HTTP/2
HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。
- IDL使用ProtoBuf
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
- 多语言支持 ( C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)
gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:
- 低延迟、高扩展性、分布式的系统
- 同云服务器进行通信的移动应用客户端
- 设计语言独立、高效、精确的新协议
- 便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等
proto语法
ps:最近编写的一个proto协议----decodereq.proto
syntax = "proto3"; // 指定协议版本,如果你不指定,protocol buffer 编译器就会认为你使用的是proto2的语法。
// 这个语句必须出现在.proto文件的非空非注释的第一行。
package DecodePortrait; // 指定包,防止不同协议之间命名冲突
message PortraitDecodeReq {
repeated string UP = 1; //UserPortrait加密数据列表
// repeated 表示该字段可重复,传值是给一个列表
}
"""
# message编写格式
message 数据名 {
数据类型 数据名 = 字段唯一数字标识;
}
注:已定义的message可以当做已知数据类型使用
"""
message LocationInfo {
string country = 1; //地域所属国家
string prov = 2; //地域所属省
string city = 3; //地域所属市
}
message UserInfo {
uint32 gender = 1; // 用户性别,0:未知,1:男,2:女
uint32 age = 2; // 用户年龄,0:未知
repeated string profession = 4; // 职业
repeated string education = 5; // 学历
}
message Interests {
repeated string interest_category_one = 1; // 兴趣一级分类
repeated string interest_disease = 2; // 兴趣疾病
repeated string interest_tag = 3; // 兴趣标签
repeated string interest_keyword = 4; // 兴趣关键词
repeated string interest_category_two = 5; // 兴趣二级分类
repeated string interest_category_three = 6;// 兴趣三级分类
}
message UP_Res{
UserInfo userinfo = 1; //用户基础信息
LocationInfo location = 2; //地理位置信息
Interests interests = 3; //用户兴趣信息
}
"""
UP_Res中使用上面定义的UserInfo、LocationInfo、Interests等message类型定义
"""
message Resp{
repeated UP_Res UPRes_list = 1; //所有数据的列表
}
"""
Resp中构建UP_Res的列表,可根据需求自行定制
"""
service Decode {
rpc DecodeReq(PortraitDecodeReq) returns (Resp){
}