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!

相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__7 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华9 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni12 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学13 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端