Что это?
gRPC — это фреймворк для удаленного вызова процедур (RPC), разработанный Google. Он использует HTTP/2 для транспорта и Protocol Buffers (protobuf) в качестве языка описания интерфейсов и формата сериализации данных.
Настройка и использование gRPC
1️⃣ Добавляем в pubspec.yaml:
dependencies:
grpc: ^4.1.0
protobuf: ^3.1.0
dev_dependencies:
protoc_plugin: ^21.1.2
2️⃣ Создаем файл .proto
Сделаем на примере создания чата. Определяем сервис в файле .proto. Например, lib/protos/chat.proto:
syntax = "proto3";
package chat;
service ChatService {
rpc SendMessage (Message) returns (MessageResponse);
rpc ReceiveMessages (Empty) returns (stream Message);
}
message Message {
string text = 1;
string sender = 2;
int64 timestamp = 3;
}
message MessageResponse {
bool success = 1;
string error = 2;
}
3️⃣ Генерируем код
Запускаем команду для генерации Dart-кода:
bash
protoc --dart_out=grpc:lib/generated -Ilib/protos lib/protos/chat.proto
4️⃣ Создаем клиента
class GrpcClient {
late ChatServiceClient client;
/// Инициализация канала соединения
GrpcClient() {
final channel = ClientChannel(
'http://localhost',
port: 50051,
options: const ChannelOptions(
credentials: ChannelCredentials.insecure(),
),
);
client = ChatServiceClient(channel);
}
/// Отправка сообщения
Future<MessageResponse> sendMessage(String text, String sender) async {
final message = Message()
..text = text
..sender = sender
..timestamp = DateTime.now().millisecondsSinceEpoch;
try {
return await client.sendMessage(message);
} catch (e) {
print('Error sending message: $e');
return MessageResponse()..success = false..error = e.toString();
}
}
/// Получение сообщений
Stream<Message> receiveMessages() {
return client.receiveMessages(Empty());
}
}5️⃣ Используем клиента в приложении
На что следует обратить внимание:
🔸gRPC клиент:
➡️инициализируется один раз при создании состояния
➡️обеспечивает двустороннюю коммуникацию
➡️управляет подпиской на поток сообщений
🔸Потоковая передача:
➡️receiveMessages() возвращает Stream<Message>
➡️listen() подписывается на новые сообщения
🔸Управление ресурсами:
➡️gRPC соединение должно закрываться
➡️Отмена подписок происходит автоматически при dispose()
Продолжение — в комментариях📌
