主题:GRPC的使用
HTTP2.0
GRPC的概述

- 安全认证: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){}
生成代码
服务端
客户端
- 阻塞/同步 : RPC 调用等待服务器响应,并且要么返回应答,要么造成异常
- 非阻塞/异步 : 存根可以向服务器发起非阻塞调用,应答会异步返回。可以使用异步存根去发起特定类型的流式调用。
其他RPC框架的对比
Dubbo
- 侧重重服务治理,主要的精力放在服务发现、路由、容错处理等方面
- Dubbo3.0 的协议基于 gRPC(http2.0), 功能增强
Thrift
- 侧重跨语言调用,能够支持大部分的语言进行语言无关的调用(同GRPC)
- 社区活跃度 GRPC>Thrift
- 文档详细完善 GRPC>Thrift
- 特性丰富度 Thrift>GRPC
- Thrift的协议层和传输层可拓展性强