gRPC简介
grpc来着google,是开源的,同时也是cloud native computation基金会一部分。
grpc允许你你以rpc定义请求响应,然后grpc会帮你处理一切问题。
它的速度很快,执行效率很高,基于http/2构建,第一案是,支持流,其他开发语言,并且可以很简单插入身份认证,负载均衡,日志等。
学习grpc需要先学习Protocol buffers,他是定义消息和服务,然后只需要实现服务即可,剩下的grpc代码会自动生成。
.proto这个文件可以适用于十几种开发语言,并且允许你适用用一个框架支持百万级的rpc调用
开发模式
grpc适用合约优先的api开发模式,他默认适用protocol buffers (protobuf) 作为接口设计语言,
这个.proto这文件包括两部分:
grpc服务定义
服务端和客户端消息的传递
Protoct Buffer
开发环境:vscode插件:vscode-proto3和Clang-Format这两个插件
window还需要安装Clang,window64系统https://releases.llvm.org/
一个简单的proto:
syntax="proto3"; message FirstMessage{ int32 id=1; string name =2; bool is_male=3; }
Protocol buffers里面,字段名称其实没有那么重要,但是编译成使用的语言就比较重要了
对于proto来说,tag更重要
tag:最小是1,最大是2的29次方-1会,或者536870911,但是不能使用19000到19999,这部分保留。
从1到15占一个字节,用在频繁的字段;16到2047占两个字节,用在不频繁字段。
字段规则:
单数字段:这个字段只能出现0-1次。
重复字段:与singular相对repeated,作一个list或者数组,你可以重复这个字段。
一个例子:
person:
syntax="proto3";//协议使用 import "date.proto";//导入需要的date package my.project;//打包,避免名称冲突 message Person{ int64 id=1; string name=2; float height=3; float weight=4; bytes avatar=5; string email=6; bool email_verified=7; Date birthday=12; repeated string phone_number=8;//packed reserved 9,10,20 to 100; reserved "foo","bar"; enum Gender{ NOT_SPECIFIED=0; FEMALE=1; MALE=2; } }
date:
syntax="proto3"; message Date{ int64 year=1; int64 month=2; int64 day=3; }
之后编译需要去安装proto编译器:https://github.com/protocolbuffers/protobuf/releases
安装好后,需要配置环境变量在path上指向proto的exe;
最后cmd:protoc
说明安装好了,并且配置正常
在vs里编译:
消息类型的演进:
消息类型会发生改变,可能会添加字段,也可能删除一些字段
但是可能很多程序使用protobuffer的消息,但是没法随着需求尽心更新。
所以,你对数据户必须进行演进的时候,会破会性的变化,否则他的程序可能无法正常工作。
两种变更情景:
向前兼容变更:新的proto文件写数据->从旧的proto读数据
向后兼容变更:旧的proto文件写数据->从新的proto读数据
规则:
1.不要修改现有字段数字
2.可以新加字段
3.字段可以被删除,只要他们数字tag在跟新后消息中不使用,你可以把它字段名改为“OBSOLETE_”前缀而不是删除,或者把这些字段数字进行保留reserved
gRPC结构:
client(生成代码)<-(传输协议protocol buffers)->sever(生成代码)
设计步骤:
定义消息->生成代码->开发client/sever
grpc生命周期
创建隧道->创建client->client发送请求(可选携带的metadata)->sever发送metadata->发送/接受消息
身份认证:
这里不是用户身份认证,指的是多个sever和client之间。他们是如何识别出来谁是谁的,并且还能安全尽心消息传输。
在身份认证方面,grpc一共有4中认证机制:
1.不采用任何措施连接
2.tls/ssl连接
3.基于google token 身份认证
4.自定义身份认证供应商。