1. 简介
Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的RPC 实现。
其中github地址: https://github.com/grpc/grpc
Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开源了Protobuf 序列化反序列化的代码,而没有开源RPC 的实现,于是存在着众多良莠不齐的第三方RPC 实现。
从实现和特性看来,grpc 更多的是考虑移动场景情况下客户端和服务端的通信,正如其自称的「general RPC framework that puts mobile and HTTP/2 first」。HTTP2 本身提供了连接多路复用、Body 和 Header 压缩等机制,grpc 基于此可以提供比较高效的实现。
grpc 所使用的依赖都比较新,如protbuf 需要3.0 版本, c++ 使用了c++11, Java 实现中的netty 需要5.0 版本, HTTP2 也是刚刚定稿。这些依赖中很多都还是没有正式release ,所以目前来看grpc 还不是一个可稳定使用的状态。
grpc 提供了c 、Java、golang 的原生实现,并以c 共享库的方式来支持Node.js, Python, Ruby, Objective-C, PHP 和 C# 语言 (由此看来,c++, Java 和golang 在Google 有着一等公民的地位)。其中Java 语言的实现亦可以用于Android 客户端,Objective-C 的实现主要针对IOS 客户端。
gRPC 和通常的基于TCP的实现不同,是直接基于HTTP2 协议的。HTTP2 使得gRPC 能够更好的适用于移动客户端和服务端通信的使用场景,并且连接多路复用也保证了RPC 的效率。
gRPC 的协议设计上很好的使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。先看个例子,假设Protobuf 定义如下:
package foo.bar; message HelloRequest { string greeting = 1; } message HelloResponse { string reply = 1; } service HelloService { rpc SayHello(HelloRequest) returns (HelloResponse); }
在这里面我们定义了一个service HelloService。grpc 为这样一个调用发送的请求为:
HEADERS (flags = END_HEADERS)
:method = POST
:scheme = http
:path = /foo.bar.HelloService/SayHello
:authority = api.test.com
grpc-timeout = 1S
content-type = application/grpc+proto
grpc-encoding = gzip
authorization = Bearer y235.wef315yfh138vh31hv93hv8h3v
DATA (flags = END_STREAM)
<Delimited Message>
Http 请求的Path 部分用来表示调用哪个服务,格式是/{package}.{ServiceName}/{RpcMethodName},content-type 目前取值都是application/grpc+proto,将来gRPC 支持除Protobuf 之外的协议如Json 时,会有别的值。grpc-encoding 可以有gzip, deflate, snappy 等取值,表示采用的压缩方法。grpc-timeout 表示调用的超时时间,单位有Hour(H), Minute(M), Second(S), Millisecond(m), Microsecond(u), Nanosecond(n) 等。
HEADERS (flags = END_HEADERS)
:status = 200
grpc-encoding = gzip
DATA
<Delimited Message>
HEADERS (flags = END_STREAM, END_HEADERS)
grpc-status = 0 # OK
trace-proto-bin = jher831yy13JHy3hc
有疑问加站长微信联系(非本文作者)