Google gRPC 简介

chenglinhust · · 4491 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
Google gRPC 简介

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 、Javagolang 的原生实现,并以c 共享库的方式来支持Node.js, Python, Ruby, Objective-C, PHP 和 C# 语言 (由此看来,c++, Java 和golang 在Google 有着一等公民的地位)。其中Java 语言的实现亦可以用于Android 客户端,Objective-C 的实现主要针对IOS 客户端。


2. 协议分析

     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) 等。 

除了gRPC 定义的标准头之外,也可以自己添加新的头。如果是二进制的Header,则Header Name 以-bin 结尾,Header Value 是经过Base64 编码的二进制数据。
服务端对这个请求返回一个Response:
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
grpc-status 为0 表示请求没有出现问题,成功返回。
gRPC 还定义了GOAWAY Frame, 当Server 断开一个连接的时候,需要向客户端发送这样一条消息;以及PING Frame,接受到PING Frame 后直接原样返回数据,用于连接存活检测和延迟检测。
HTTP2 的Header 并不是特别高效的格式,存储上和解析上都有一些效率问题。如果启用加密连接的话,则会有更多的效率开销。


参考: http://www.dongliu.net/post/622451

本文来自:CSDN博客

感谢作者:chenglinhust

查看原文:Google gRPC 简介

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

4491 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传