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!

相关推荐
阿芯爱编程5 分钟前
前端最新面试题
前端·面试
天天扭码10 分钟前
一分钟吃透一道面试算法题——字母异位词分组(最优解)
前端·javascript·算法
天天扭码22 分钟前
JavaScript 中字符串转字符数组的两种优雅方式
前端·javascript·代码规范
何遇er24 分钟前
在 AI 编程的热潮下对低代码的思考
前端·低代码·ai编程
何遇er27 分钟前
一句 Prompt 自动生成表单:我在低代码平台里是怎么接入生成式 AI 的
前端·低代码·ai编程
_一条咸鱼_29 分钟前
Vue 指令模块深度剖析:从基础应用到源码级解析(十二)
前端·javascript·面试
薯条不要番茄酱37 分钟前
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
java·前端·java-ee
只会安静敲代码的 小周1 小时前
uniapp上传图片时(可选微信头像、相册、拍照)
前端·微信·uni-app
kovlistudio1 小时前
红宝书第四十六讲:Node.js基础与API设计解析
前端·javascript·node.js
陈哥聊测试1 小时前
这款自研底层框架,你说不定已经用上了
前端·后端·开源