在移动开发中,常见的客户端与服务器通信方式是使用 REST API。但在高性能、实时性强的应用场景中,gRPC 正逐渐成为更优选择。
一、什么是 gRPC?
gRPC(Google Remote Procedure Call)是 Google 开源的高性能、跨语言的远程过程调用(RPC)框架。它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf)作为接口定义语言和消息交换格式。
gRPC 支持双向流、连接复用、流控制、头部压缩等高级特性,使其在移动端、微服务通信中具有天然优势。
二、gRPC 和传统 REST API 的区别
项目 | REST API(传统接口) | gRPC |
---|---|---|
协议 | HTTP/1.1 + JSON | HTTP/2 + Protocol Buffers(protobuf) |
数据格式 | JSON(可读性强) | 二进制(效率更高) |
性能 | 普通 | 快(更省流量、更低延迟) |
代码生成 | 手写请求、响应模型 | 自动生成代码(客户端 + 服务端) |
双向通信 | 不支持 | 支持(双向流、推送等) |
接口文档 | Swagger / Postman | .proto 就是接口文档 |
适合场景 | 普通客户端/服务端请求 | 微服务、实时通信、高性能场景 |
总结:REST 更适用于轻量级、简单接口;gRPC 更适合高性能、双向流、实时通信的场景(如聊天、音视频通话、IoT 等)。
举个例子更清楚
✅ REST 传统调用:
你手动写代码去调一个接口,比如:
bash
POST /api/user
Content-Type: application/json
{
"name": "张三",
"age": 25
}
然后你在 Flutter 里写:
less
final response = await http.post(
Uri.parse('https://api.xxx.com/user'),
body: jsonEncode({"name": "张三", "age": 25}),
);
gRPC 调用:
你只需要调用自动生成的函数,就像调用 Dart 本地代码一样:
ini
final response = await userClient.createUser(UserRequest()..name = "张三"..age = 25);
无需拼接口地址、拼 JSON,也不用自己写模型类(proto 会自动生成)。
三、Flutter 中使用 gRPC
1. 安装必要依赖
在你的 Flutter 项目中添加如下依赖:
yaml
dependencies:
grpc: ^3.2.4
protobuf: ^3.1.0
dev_dependencies:
protoc_plugin: ^20.0.0
2. 安装 Protocol Buffers 编译器
前往 grpc.io/docs/protoc... 下载 protoc
编译器并配置到环境变量中。
验证是否安装成功:
bash
protoc --version
3. 编写 .proto
文件
新建 lib/protos/helloworld.proto
:
proto
syntax = "proto3";
option java_package = "com.example.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// 定义服务
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 请求结构
message HelloRequest {
string name = 1;
}
// 响应结构
message HelloReply {
string message = 1;
}
4. 生成 Dart 文件
运行以下命令生成 Dart 文件:
bash
protoc --dart_out=grpc:lib/protos lib/protos/helloworld.proto
会生成:
helloworld.pb.dart
:protobuf 序列化定义helloworld.pbgrpc.dart
:gRPC 客户端接口定义
5. 使用 gRPC 客户端
在 Flutter 中使用客户端连接服务:
dart
import 'package:grpc/grpc.dart';
import 'protos/helloworld.pbgrpc.dart';
Future<void> main() async {
final channel = ClientChannel(
'localhost',
port: 50051,
options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
);
final stub = GreeterClient(channel);
try {
final response = await stub.sayHello(HelloRequest()..name = 'Flutter Developer');
print('Greeter client received: ${response.message}');
} catch (e) {
print('Caught error: $e');
}
await channel.shutdown();
}
注意 :实际部署时,请使用 TLS 加密连接,避免使用 insecure()
。
四、适用场景分析
应用类型 | REST | gRPC |
---|---|---|
电商 App | ✅ | ✅ |
聊天 App | ❌ | ✅(双向流更合适) |
IoT 实时监控 | ❌ | ✅ |
简单 CMS 后台管理 | ✅ | ❌ |
五、调试工具推荐
- grpcurl:命令行 gRPC 客户端调试工具
- BloomRPC:gRPC GUI 客户端,类似 Postman
- grpcui:Web UI 调试工具
六、总结
- gRPC 是一个高性能、跨平台的通信框架,适用于移动、IoT、微服务等高性能场景。
- 与 REST 相比,gRPC 提供更快的通信、更小的体积和更丰富的通信模式(如流式处理)。
- Flutter 中通过
grpc
与protobuf
库,可以快速集成 gRPC 客户端。
未来你在构建高性能或需要双向实时通信的 Flutter 应用时,不妨尝试使用 gRPC!