gRPC基础,区别REST,使用教程 (Flutter)

在移动开发中,常见的客户端与服务器通信方式是使用 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 中通过 grpcprotobuf 库,可以快速集成 gRPC 客户端。

未来你在构建高性能或需要双向实时通信的 Flutter 应用时,不妨尝试使用 gRPC!

相关推荐
蔗理苦1 小时前
2025-09-05 CSS3——盒子模型
前端·css·css3
二川bro2 小时前
第25节:VR基础与WebXR API入门
前端·3d·vr·threejs
上单带刀不带妹2 小时前
Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?
前端·node.js·es6·模块化
缘如风2 小时前
easyui 获取自定义的属性
前端·javascript·easyui
诗书画唱2 小时前
【前端教程】JavaScript 实现图片鼠标悬停切换效果与==和=的区别
开发语言·前端·javascript
光影少年2 小时前
前端上传切片优化以及实现
前端·javascript·掘金·金石计划
喜葵2 小时前
前端安全防护深度实践:从XSS到供应链攻击的全面防御
前端·安全·xss
_r0bin_2 小时前
分片上传-
前端·javascript·状态模式
东北南西2 小时前
手写React状态hook
前端·javascript·react.js
诗书画唱3 小时前
【前端教程】JavaScript DOM 操作实战案例详解
开发语言·前端·javascript