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!

相关推荐
chéng ௹34 分钟前
vue2 上传pdf,拖拽盖章,下载图片
前端·css·pdf
嗯.~35 分钟前
【无标题】如何在sheel中运行Spark
前端·javascript·c#
A_aspectJ3 小时前
【Bootstrap V4系列】学习入门教程之 组件-输入组(Input group)
前端·css·学习·bootstrap·html
兆。3 小时前
电子商城后台管理平台-Flask Vue项目开发
前端·vue.js·后端·python·flask
互联网搬砖老肖4 小时前
Web 架构之负载均衡全解析
前端·架构·负载均衡
sunbyte4 小时前
Tailwind CSS v4 主题化实践入门(自定义 Theme + 主题模式切换)✨
前端·javascript·css·tailwindcss
湛海不过深蓝5 小时前
【css】css统一设置变量
前端·css
程序员的世界你不懂6 小时前
tomcat6性能优化
前端·性能优化·firefox
爱吃巧克力的程序媛6 小时前
QML ProgressBar控件详解
前端
进取星辰6 小时前
21、魔法传送阵——React 19 文件上传优化
前端·react.js·前端框架