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!

相关推荐
前端小趴菜0524 分钟前
React-React.memo-props比较机制
前端·javascript·react.js
摸鱼仙人~1 小时前
styled-components:现代React样式解决方案
前端·react.js·前端框架
sasaraku.2 小时前
serviceWorker缓存资源
前端
RadiumAg3 小时前
记一道有趣的面试题
前端·javascript
yangzhi_emo3 小时前
ES6笔记2
开发语言·前端·javascript
yanlele3 小时前
我用爬虫抓取了 25 年 5 月掘金热门面试文章
前端·javascript·面试
中微子5 小时前
React状态管理最佳实践
前端
烛阴5 小时前
void 0 的奥秘:解锁 JavaScript 中 undefined 的正确打开方式
前端·javascript
中微子5 小时前
JavaScript 事件与 React 合成事件完全指南:从入门到精通
前端
Hexene...5 小时前
【前端Vue】如何实现echarts图表根据父元素宽度自适应大小
前端·vue.js·echarts