主题:GRPC的使用
HTTP2.0
- 性能对比:https://http2.akamai.com/demo
- HTTP/2特性
- 二进制传输
- 头部压缩
- 多路复用
- 服务端推送
GRPC的概述
- IDL:Protocol Buffers [默认]
是一种与语言无关、与平台无关的可扩展机制,用于序列化结构数据
- https://developers.google.com/protocol-buffers/docs/proto3
- 安全认证:ALTS [ Application Layer Transport Security 应用层传输安全 ]
- 传输协议:HTTP2
使用流程
定义一个服务
syntax = "proto3"; option java_package = "io.grpc.examples"; // The greeter service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
- 四种接口方式
- 单项 RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。
rpc SayHello(HelloRequest) returns (HelloResponse){}
- 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){}
- 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
- 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){}
- 支持的数据类型
生成代码
服务端
- 服务端接口实现
- 实现预定义的接口
- 启动服务端
- ServerBuilder
客户端
- 创建通道Channel
- ManagedChannelBuilder
- 创建存根stub
- 阻塞/同步 : RPC 调用等待服务器响应,并且要么返回应答,要么造成异常
- 非阻塞/异步 : 存根可以向服务器发起非阻塞调用,应答会异步返回。可以使用异步存根去发起特定类型的流式调用。
- 调用方法
其他RPC框架的对比
Dubbo
- 侧重重服务治理,主要的精力放在服务发现、路由、容错处理等方面
- Dubbo3.0 的协议基于 gRPC(http2.0), 功能增强
Thrift
- 侧重跨语言调用,能够支持大部分的语言进行语言无关的调用(同GRPC)
- 文档:http://thrift.apache.org/docs/
- 与GRPC差异
- 社区活跃度 GRPC>Thrift
- 文档详细完善 GRPC>Thrift
- 特性丰富度 Thrift>GRPC
- Thrift的协议层和传输层可拓展性强
- GRPC支持流式调用